影子经纪人(Shadow Brokers)最近曝光的NSA方程式Windows攻击程序中有一个针对Mdaemon邮件服务器漏洞的远程攻击程序——Easybee,本文将对Easybee漏洞攻击进行复现,并分析漏洞攻击原理。
环境搭建
Easybee是针对Mdaemon邮件服务器远程逻辑漏洞的攻击程序,它支持对下列版本的Mdaemon服务器进行攻击:
- 9.5.2
- 9.6.0
- 9.6.1
- 9.6.2
- 9.6.3
- 9.6.4
- 9.6.5
- 9.6.6
- 10.0.1
- 10.0.2
- 10.0.3
- 10.0.4
- 10.0.5
- 10.1.0
- 10.1.1
- 10.1.2
我这里找到一个10.1.1版本的Mdaemon进行测试,首先需要两台测试机:
- 192.168.1.3——攻击机 Win2003安装Python,运行Fuzzbunch
- 192.168.1.105——靶机 WindowsXP安装Mdaemon 10.1.1
在靶机上的Mdaemon中添加域名testeasybee.com,由于这个域名并没有在互联网上注册,所以我们自己搭建一个DNS服务器,把testeasybee.com的MX记录设置为192.168.1.105,并在192.168.1.3中设置DNS服务器为我们自己的DNS。然后在Mdaemon的testeasybee.com域名中新建用户admin@testeasybee.com,密码Aa654321。
漏洞利用复现
在攻击机192.168.1.3中运行Fuzzbunch攻击框架,设置Target IP为192.168.1.105,Callback IP为192.168.1.3,Redirection为no。
新建Project设置一些log目录之类的常规参数,然后运行Easybee,设置攻击参数:
具体攻击参数的意义为:
- TargetIp —— 目标IP地址,这里是192.168.1.105
- TargetWCPort —— WorldClient端口,默认为3000
- TargetWAPort —— WebAdmin端口,默认为1000
- WorldClientProtocol —— WorldClient协议,默认为http
- WorldClientDomain —— WorldClient所属域名,这里是testeasybee.com
- WorldClientPort —— WorldClient端口,默认为3000
- WebAdminProtocol —— WebAdmin协议,默认为http
- WebAdminDomain —— WebAdmin所属域名,这里是testeasybee.com
- WebAdminPort —— WebAdmin端口,默认为1000
- TargetAcctDomain —— 目标域名,testeasybee.com
- TargetAcctUsr —— 目标账号,这里是admin
- TargetAcctPwd —— 账号密码,这里是Aa654321
- TargetAcctIsAdmin —— 账号是否为管理员,这里是yes
- CFEmailFrom —— 用于触发内容过滤器的发件人,我是自己发给自己就写admin@testeasybee.com
- CFEmailSubj —— 用于触发内容过滤器的邮件标题,随便写xxxooo
- CFEmailFile —— 用于触发内容过滤器的附件名,这个要求是允许的附件类型,最好是.txt类型
- AREmailFrom —— 同CFEmailFrom即可
- AREmailSubj —— 发送邮件标题,随便写hahahoho
- PTEmailFrom —— 同CFEmailFrom即可
- PTEmailSubj —— 同AREmailSubj即可
- PayloadName —— 上传到服务器运行的文件名,随便写个t.exe即可
- PayloadFile —— 要上传的木马程序,我这里只是测试就传个计算器,写C:\windows\system32\calc.exe
- WorldClientVersion —— Mdaemon的版本,我这里选10.1.1execute之后,经过一系列的攻击,最终攻击成功。
我们看一些靶机上面,我们上传的计算器已经成功执行。
如果Mdaemon是以服务形式运行,那么它的子进程都是SYSTEM权限且没有图形界面,但是计算器也能成功运行。
漏洞分析
经过分析发现,这个漏洞是Mdaemon的Auto Responder(自动应答器)和Content Filter(内容过滤器)的一个逻辑漏洞,具体漏洞利用的步骤是:
1. 通过HTTP协议访问目标3000端口的WorldClient,POST用户名密码进行登录,通过返回Cookie解析出WCSESSIONID
2. 通过HTTP协议访问目标1000端口的WebAdmin,POST用户名密码进行登录,通过返回Cookie解析出WASESSIONID
3. 通过访问WebAdmin的如下URL获取Auto Responder是否开启
http://192.168.1.105:1000/useredit_autoresp.wdm?accountedit=1&user=admin@testeasybee.com
4. 通过POSTXML的方式修改用户自动应答所执行的脚本
运行到这里我们看到自动应答已经被添加了命令执行:
这样一来,每次收到邮件就会把邮件内容中@@后面内容当做CMD命令来执行
5. 以POST方式通过WorldClient发送一封邮件给admin@testeasybee.com去触发自动应答的处理命令,内容是一系列以@@开头的CMD命令:
这段批处理依次执行下面命令:
1)从目标邮箱目录下找到对应的邮件.msg文件,其中iOE4ZuLw44是发送邮件标题中的随机字符串。
2)读取.msg文件的内容。
3)读取UserList.dat文件的内容,这里面有加密过的密码。
4)读取WebAcces.dat文件的内容,把MDaemon@testeasybee.com账号的权限全部打开:Access=YYYYYYYYYYYYYYYYY
5)读取CFRules.dat文件内容,这个是Content Filter内容过滤器规则。
6)读取CFilter.ini文件的内容。Content Filter内容过滤器配置文件。
7)读取MDaemon.ini服务器配置文件。
8)最后把所有内容集合在一起重新写入原邮件的.msg文件中。
可以看出这段批处理的作用是,读取一系列配置文件内容,并且修改MDaemon@testeasybee.com账号的权限为最高。
6. 通过WorldClient确保邮件已收到,读取邮件内容,通过UserList.dat文件内容获取MDaemon@testeasybee.com账号的加密密码,并解出明文密码。
解密算法在trfo-2.dll的TfBase64Decode函数中,就是Base64的一种变形:
- void *__cdecl TfBase64Decode(int a1, unsigned int a2, int a3)
- {
- unsigned int v3; // esi@1
- int v4; // edi@1
- void *result; // eax@2
- int v6; // ebx@4
- unsigned int v7; // ecx@4
- char v8; // al@6
- unsigned __int8 v9; // al@8
- void *v10; // [sp+8h] [bp-10h]@1
- char v11[4]; // [sp+Ch] [bp-Ch]@16
- unsigned int v12; // [sp+10h] [bp-8h]@1
- char Src; // [sp+14h] [bp-4h]@20
- v3 = a2;
- v4 = 0;
- v12 = 0;
- v10 = calloc((3 * a2 >> 2) + 1, 1u);
- if ( v10 )
- {
- if ( a2 > 0 )
- {
- do
- {
- v6 = 0;
- v7 = 0;
- do
- {
- if ( v12 >= v3 )
- break;
- v8 = 0;
- do
- {
- if ( v8 )
- break;
- v9 = *(_BYTE *)(v12++ + a1);
- if ( (unsigned __int8)(v9 - 43) > 0x4Fu )
- v8 = 0;
- else
- v8 = byte_1000711D[v9];
- if ( v8 )
- v8 = (v8 - 61) & ((v8 == 36) - 1);
- }
- while ( v12 < a2 );
- v3 = a2;
- if ( v12 >= a2 )
- {
- v11[v7] = 0;
- }
- else
- {
- ++v6;
- if ( v8 )
- v11[v7] = v8 - 1;
- }
- ++v7;
- }
- while ( v7 < 4 );
- if ( v6 )
- {
- sub_10001000((int)v11, (int)&Src);
- if ( v6 != 1 )
- {
- memcpy((char *)v10 + v4, &Src, v6 - 1);
- v4 += v6 - 1;
- }
- }
- v3 = a2;
- }
- while ( v12 < a2 );
- }
- *((_BYTE *)v10 + v4) = 0;
- if ( a3 )
- *(_DWORD *)a3 = v4;
- result = v10;
- }
- else
- {
- result = 0;
- }
- return result;
- }
7. 通过CFilter.ini文件内容判断Content Filter是否开启,如果没开启还需要发送一封邮件触发自动应答脚本执行批处理命令写入CFilter.ini文件来开启Content Filter。
8. 以获取到的MDaemon@testeasybee.com账号的密码登录进WebAdmin,通过POSTXML的方式添加一条Content Filter规则:
这条规则就是说,当发现邮件标题中包含xxxooo字符串,就执行命令cmd /c “move /Y uu.txt t.exe & t.exe & del t.exe”,把附件uu.txt文件复制为t.exe并运行。
9. 核心一步,发送标题为xxxooo,带有payload附件的邮件。触发Content Filter规则,运行payload。
10. 最后,发送包含命令的邮件清除所做修改和清除邮件。
可以看出来这个漏洞最关键点在于攻击者可以通过WebAdmin以POSTXML的方式修改用户自动应答脚本,以至发送特定内容邮件就可以达到执行任意命令的目的。
解决方案
升级Mdaemon到最新版本可修复此漏洞。