TurboMail在安装完毕之后会有多个应用打开端口监听数据,其中有一个叫做TurboStore是用于存储邮件信息的的核心组件。
TurboStore打开的端口是9668
在/conf/server.xml中的配置如下:
从上面可以看到TurboStore需要登录,而用户名密码默认分别为admin/admin321,使用telnet登录如下:
经过以上可以看出TurboStore是未限定IP登录的,测试官方同样能够成功登录:
TurboStore的通信数据结构,类似如下:
系统中有完整的通信实现代码如下:
其中的jsonRet = CmdJson.execute(ses, "getnextmsgid", jsonParam, ioRet);中的getnextmsgid就是cmd,系统中大概有这么几个cmd:
每个cmd对应不同的参数,下面以官网(http://**.**.**.**:8080/)为例获取其中的tech@**.**.**.**邮箱的收件信息,部分利用代码如下:
把测试文件放到本地搭建的TurboMail服务器的根目录然后访问,得到前50个邮件:
通过addmsg以及delmsg还可以添加删除邮件,危害较大这里就不演示了。
下面来来分析如何获取webmail权限,TurboMail是基于sessionid来进行权限验证,登录后分配一个sessionid作为验证凭证,类似于这样:
因此主要目标是获取这个sessionid,来看下面的代码,在入口程序MailMain.java中引用了ShowMsg.showAbstract(request, response):
ShowMsg.showAbstract(request, response)主要代码如下:
程序首先通过request.getParameter("receiveaccount")获取到receiveaccount的值,如果这个值为@@spambox则调用ms = MailSession.getGwuserSession("spambox", "root");产生一个mailsession ms。注意这里没有验证密码就直接得到ms!
然后获取String strMsgid = request.getParameter("msgid"),这个strMsgid经过过滤进入到以下流程中:
由strMsgid组合而成的路径strMailFolderPath,如果strMailFolderPath这个文件不存在的话则程序退出。来看看这个strMailFolderPath文件是啥样子的:
152E9491193.tbdata是一个时间戳数字经过16进制转换而成的文件名,这个文件名如果要枚举的话次数在百亿以上显然是不现实的,看下面的代码:
MessageAdmin.getNextMsgId()是从TurboStore中查询数据,那么strMsgid很有可能是存储在TurboStore中,于是查询@@spambox用户得到strMsgid:
在这里将msgid赋值为152E9491193_tb_3344_5041则顺利通过,到最后ms.session_id(也就是Sessionid)作为参数使用rd.forward重定向到msgabstractheader.jsp,如下:
而msgabstractheader.jsp也把sessionid做为参数传走:
整个获取sessionid的POST数据包如下:
然后在返回中找到sessionid:
这个Sessionid可用于登录验证(有时效性),能够访问webmail的大多数应用:
获取到权限之后就可以进行SQL注射了在入口程序AjaxMain.java中调用方法:
StatisticAdmin.sendFailMailStatistics()定义如下:
程序获取sender的值直接拼接进入SQL查询导致了SQL注射发生:
通过SQL注射能够GETSHELL,读取文件等操作之前写过了这里就不再赘述。
列一些受影响的域名/ip: