记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

turbomail无任何限制getshell

2014-08-17 23:00

今天看到 WooYun: TurboMail邮箱系统默认配置不当可进入任意邮箱及获取管理员密码(官网也中招及大量实例) 看到此系统影响如此深远,因此自己也下载一个学习分析一下。



找到官方地址 下载:

http://www.turbomail.org/download.html



我下载的是windows版本,安装之后 开始学习使用。

由于是邮件系统,因此首先需要用户输入口令才能登录,当然正常邮件服务器都是这样的,因此首先看一下 对用户的验证过程。

没有登录系统时,能够请求的页面是有限的,目前只能看到maintlogin.jsp

1.PNG





因此看一下登录页面maintlogin.jsp代码

2.PNG



发现数据是post到了mailmain?type=login请求。根据WEB-INF/web.xml的配置

3.PNG



该serverlet对应的类是turbomail.web.MailMain,使用jad反编译代码,可以看到该类的完整代码。从web.xml可以看出系统没有使用统一的拦截器进行处理所有请求,因此猜测系统本身一旦考虑不周就会导致权限问题



由代码可以看出,该MailMain是全局控制类,当type是不同值时,就会调用不同的类和对应方法,对请求数据进行处理。并且看一下访问控制,发现使用session获得一个get方式传入的sessionid进行身份确认,当用户登录后会创建一个表示用户身份的sessionid,每次请求时,都会携带该数据表示用户已经登录







比如这样一个保存节点功能

4.PNG





可以通过客户端进行请求,在该函数中首先调用WebUtil.getms对用户的登录状态进行校验

5.PNG





获取sessionid,判断是否已经存在,如果不存在则验证失败



看到这里,大概明白系统对用户权限的验证,主要是调用WebUtil.getms对用户权限验证,并且在web.xml没有编写全局的过滤器对权限进行统一检查,因此 猜测系统不会每个重要接口都对用户身份进行检查,肯定存在某个重要接口存在未授权访问漏洞。



但由于系统代码比较多,接口比较多,因此逐一接口进行人工查看 可能不太现实。因此考虑怎样写个小程序对代码进行过滤?



程序主要考虑问题:

怎样判断客户端可以访问呢?jsp里面由客户端可以访问的函数都会传入两个参数 request和response。因此只要一个函数的参数包含 request和response即可90%确定是可以由客户端访问的。

如果在这样的函数中前5行未找到WebUtil.getms代码,即认为是存在未授权访问。



这个过程由人工来看自然很精确,但是系统有太多的文件,如果一个一个来看,真的挺苦逼的,如果有个功能可以自动判断真的就省事多了。想想是否可以找到这样的功能呢?还没有看到过。(因为这个需求可能仅适合本系统)



因此,首先使用jad,将所有class进行反编译。获得原java文件。然后使用c#实现上述功能,开始初略过滤。

由于篇幅有限,就不贴完整代码:

.JPG





初步获得一个结果列表

1.JPG

仅一部分结果

剩下来,就是体力活了,需要一个一个看。

首先看turbomail类下面的,比如:

c:\temp\turbomail\ajax\action\GetResource.java--15 对应代码如下

6.PNG



该函数实现确实没有调用权限判断函数,但是怎样请求到该函数呢?对代码有个大概分析就可以知道,其实大部分请求都是由turbomail\ajax\AjaxMain.java(ajax) 和\turbomail\web\MailMain.java 这两个类进行调用的,这两个应该是请求的入口,由该类的文件可以确定这个应该是通过ajax调用进来的。因此在turbomail\ajax\AjaxMain.java中,查找GetResource.service(静态方法,通过类名和函数名进行调用)



7.PNG





是请求第一个功能,在进一步分析未授权功能,即可知道构造的请求是

http://myturbomail.com:8080/mailmain?intertype=ajax&type=getresource&resource=login.password&lang=ENGLISH

8.PNG



通过该功能即可获得resource配置信息,这个文件没有重要信息。



大概的分析过程就是这样,因此这里省略需要查找的过程,直接看一些稍微有价值的未授权访问。

9.PNG



10.PNG





看到这个未授权访问,真的是兴奋,任意文件读取。

10-1..PNG



想读什么就读什么,真是... 当然我们的目的是为了,读取系统配置信息,因此就不能指定绝对路径了。该函数作者已经想到了,给了一个读取相对路径文件的方法,因此即使你不是该系统安装的绝对路径,也可以。看下面的请求,直接获得postmaster系统管理员的密码,默认是base64加密的。

http://myturbomail.com:8080/outImg?domain=..&imgLocation=..&imgName=../accounts/root/postmaster/account.xml

11.PNG



这个功能真的是太管用了。 意味着可以读取任意用户的密码,当前首选需要知道用户名称,当然内置的管理员用户postmaster等就成为了攻击目标。

接着看一下,

12.PNG



13.PNG



可以遍历所有用户名和域名

http://myturbomail.com:8080/mailmain?intertype=ajax&type=getAllUserList_simple

14.png



这个漏洞配合上一个漏洞,就可以读取任意用户的任意密码。即使内置账号被删除,被改名等等都可以。



在接着测试时,我发现了另一个不知道是后门 还是什么的东西

15.PNG



这个是主控制文件,功能比较多,这里主要关心一下这个请求

16.PNG



看一下文件,发现这个功能威力也很大

17.PNG



将所有用户的密码都设置为initPassword(即默认的82807217~!@)

http://myturbomail.com:8080/mailmain?type=db2txt

17-1.PNG



所有密码都被设置成这个。不信你看

18.PNG



是base64编码形式。

634行可以查看版本信息

19.PNG



漏洞证明:

从上面的简单过滤,可以看出,如果当没有任何权限的情况下。可以通过两种方式获得权限。

1.首先调用接口,查看版本

http://myturbomail.com:8080/mailmain?type=ver

如果返回是5.2.0则继续(因为其他版本没有进行测试)

2.1读取所有用户名

http://myturbomail.com:8080/mailmain?intertype=ajax&type=getAllUserList_simple

根据这个信息可以知道所有用户和对应的域信息

2.1.1 读取对应用户的配置文件,即获得密码

  http://myturbomail.com:8080/outImg?domain=..&imgLocation=..&imgName=../accounts/test.com/123/account.xml

  如读取123@test.com文件密码

  

2.2批量修改用户名密码

http://myturbomail.com:8080/mailmain?type=db2txt



当然这里只是从筛选的程序中确定,一些比较关注的未授权访问,其实还有一些跟系统业务相关功能的未授权这里就不一一列举,因为有些功能也不是特别清楚,怎样去触发的



其实可以获得系统的后台权限,就已经危害比较巨大,因为对于系统来说最主要的就是数据了。获得服务器权限本身也不是那么重要。但是为了本文的完整性,还是给出后台获得webshell的方法。(可能很多,这里就举个例子吧)

经过分析知,该系统安装了一个mysql数据库,数据库连接配置在C:\turbomail\conf\dbconf.xml中



20.PNG



连接数据库,查看信息发现,

21.PNG



只用root一个账号,并且不允许远程连接,因此风险还小点,可能只能本地提权(安装该系统的服务器,又安全了其它程序如iis,利用iis可以搞到一个低权限webshell,然后利用该mysql就可以提权,也是常规思路,当然这个不是这里主要讨论的问题)。

继续查看,默认安装时,有如下几个表:

22.PNG



由前面分析已经知道,最关心的口令信息,系统使用LDAP方式保存到文件里面的,因此数据库中没有,这几个表都是基本信息,理论上来说,即使是有注入对于数据来说,感觉危害不大(也许更关心业务的客户,认为还是有危害的).但是系统使用的mysql 最高权限连接,这样如果存在注入,就可以直接利用注入点,创建文件,即将注入转换为文件操作,这样危害就大了些。

根据这几个表名,很容易在界面上找到对应的功能,即对应数据库操作类文件。经过查找,发现当请求intertype=ajax&type=getBulletin时,在AjaxMain.java

23.PNG



中会调用BullentinAjax.list

24.PNG



最终会调用BulletinUtil.getBulletinlistByCondi

25.PNG



该函数的实现没有使用参数化查询,导致sql注入。因为此处是select注入,满足要求可以创建文件。



注:进入后台可以看到站点绝对路径:

26.PNG





利用sql注入,创建文件

27.PNG



直接在站点根目录下,创建2.jsp文件 jsp小马

28.PNG







就写到这里了,其实后台问题等多的,就不一一列举了。

修复方案:

该系统使用比较广泛, WooYun: TurboMail邮箱系统默认配置不当可进入任意邮箱及获取管理员密码(官网也中招及大量实例) 大牛已经在里面找到了无数的例子,我这里就省略了...



修复主要还是对权限进行控制,禁止未授权访问。

知识来源: www.wooyun.org/bugs/wooyun-2014-061489

阅读:79264 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“turbomail无任何限制getshell”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

九层之台,起于垒土;黑客之术,始于阅读

推广

工具

标签云

本页关键词