2019年奇安信威胁情报中心发布《阻击“幻影”行动:奇安信斩断东北亚APT组织“虎木槿”伸向国内重要机构的魔爪》全网首次披露东亚APT团伙“虎木槿”,奇安信内部跟踪代号APT-Q-11,在此后的数年间我们一直对其保持高强度的跟踪,该团伙在2019-2021三年间使用了多个浏览器0day漏洞,使用多种攻击手法对目标进行渗透攻击,基于奇安信大数据平台捕获到的攻击手法如下:
由于该团伙非常善于挖掘本土化软件的0day漏洞,技术较为高超,我们没有十足的把握洞悉“虎木槿”过去三年中所有的攻击活动,本文披露的活动也只是冰山一角,希望友商对本报告进行补充扩展。本篇以年份为单位,披露漏洞细节(漏洞软件目前均已修复)、成因以及利用,文末会公布历史活动的IOC,相关IOC均已无法访问,截止到报告完成前尚未捕获到新活动。
“虎木槿”在2019年初时通过使用可信邮箱向目标人员投递带有invoice主题的鱼叉邮件。
我们收集到的PC端钓鱼页面如下:
以新冠疫情作为诱饵的钓鱼页面
手机端钓鱼页面如下:
会将输入的数据和用户名进行拼接后经过RSA加密发送到后台页面
加密代码如下:
最后跳转到带有PDF的页面,有些则会跳转到合法的网盘文件下载链接,引导受害者下载安全的PDF
部分邮件中的钓鱼链接采用google白域名转发的形式来绕过邮件检测。
https://www.google.com/url?q=http://{domain}/index.php?addr=XXX&rc=XXX&source=gmail&ust=XXX&usg=XXX
通过奇安信大数据平台关联我们观察到虎木槿对海外目标的攻击活动,冒充联合国网站对外国驻朝鲜大使馆以及朝鲜驻外国大使馆进行攻击。
cloud.unite.un.org.docs-verify.com
返回的PDF内容为波兰驻平壤大使馆邀请函
还会仿冒office相关的(www.ms0ffice.guest-mailclouds.com)钓鱼页面,遗憾的是我们并没有获取到完整的html。
攻击者除了在邮件中投递钓鱼链接外,还会投递带有针对部分浏览器0day漏洞的恶意链接,漏洞利用流程如下:
URL | 功能 |
/ccps/20191031.pdf | 伪装pdf后缀的脚本语言 |
/ccps/start00.html | 判断浏览器版本是不是对应浏览器,如果不是的话,显示正常的pdf不攻击 |
/ccps/exp.html | 触发漏洞 |
/ccps/exp2.html | 执行恶意代码 |
/ccps/d.jpg | 图片隐写加密,一个浏览器控件的dll,劫持执行木马 |
/ccps/e.jpg | 图片隐写加密,解密后为木马文件,下载带360a.exe |
邮件截图如下:
Eml文件中包含了两个链接,第一个链接为探针,第二个链接使用了某域名的白名单跳转。
http://dict.XXXXX.com/appapi/redirect?module=compose.ComposeModule&redirectUrl=http://oversea-cnki[.]net/ccps/20191031.pdf
之后会再跳转到http://datasectioninfo[.]com/ccps/20191031.pdf
访问同目录下的start00.html,进入漏洞利用流程,start00.html主要用来判断当前浏览器是否可利用,无论是否可利用最后都会加载正常的PDF
值得一提的是,PDF文件同样有检测机制,如果Agent包含某些设备特征则会跳转到404页面
如果存在可利用的浏览器则会执行exp.html。
判断浏览器版本和系统版本后执行exp2.html,下载两个隐写的PNG文件
并在解密后把文件下载到Mediaplay 播放器的插件目录下,实现DLL劫持,文件名:np-mswmp.dll,在播放1.wmv 后,会默认加载该dll,然后dll执行起来后会执行360a.exe的木马的操作。
漏洞分析
由于部分浏览器chrome内核版本过低,攻击者使用了两个Chrome内核漏洞,分别位于exp1.html和exp2.html,其中exp1.html由project zero 的[email protected]发现,通过该漏洞实现代码执行功能。
获取全局内存读写的能力。
获取任意对应的函数地址。
之后通过代码执行启动shellcode修改对应内存中的部分参数
其中修改如下的字符串为catalog
之后通过CVE-2018-6055绕过chrome沙箱,该漏洞由[email protected] 发现,mojo接口filesystem::mojom::Directory存在漏洞,可导致任意文件读写,这个接口存在于mojo server catalog中,也就是上文中通过shellcode修改的的字符。
因此,执行exp1后启动mojo对应的catalog服务,执行exp2调用对应的漏洞接口实现沙盒逃逸,从而在系统中写入对应的恶意插件,以实现劫持mediaplayer,此时运行一个wmv文件以实现最终的恶意代码启动。
本次活动涉及到4个落地文件和5个内存加载的插件。
文件名 | MD5 | 编译时间 | 功能 |
360a.exe | 580da4e63c9e617573831127df6e02fe | 2019-10-31,07:23:22 | 木马Dropper,释放svctask.exe 和SndVolSSO.dll |
np-mswmp.dll | 8962b07c12f1e8d1a0cff81b94e21538 | 2007-04-11,00:18:18 | 劫持浏览器的控件 |
SndVolSSO.dll | e356e764bc0f2d2807314dae322889de | 2019-10-31,07:22:16 | Dropper释放的,Bypass uac起svctask.exe |
svctask.exe | 2c5f443b2af64be2c35ebbbc56f61ff0 | 2019-10-31,07:20:59 | 远控主文件 |
漏洞利用执行完毕后,会先通过Dll side-loading加载np-mswmp.dll,修改了正常的np-mswmp.dll的一个函数,被patch的地方如下
被patch的函数会获取CreateProcessA的地址,并运行起来360a.exe
360a.exe基于开源putty项目,将main函数里正常代码替换为恶意代码,主要功能为解密释放loader程序SndVolSSO.dll和远控主程序svctask.exe,使用Bypass UAC技术通过iFileOperation的方式将SndVolSSO.dll拷贝到Windows目录下,实现explorer.exe劫持持久化。
SndVolSSO.dll被加载起来后使用另一种Bypass UAC的方法运行svctask.exe
该样本的具体执行流程如下:
1. 创建名字为“[email protected]\x06g”的互斥体,这个互斥体在第一个数据包/qn/doil.php里当参数传递了出去,等待数据包返回,如果数据包返回的数据通过验证,木马会请求下一个数据包。
2. 木马发送的第二个数据包为/qn/doil.php?adm,该数据包是GET请求,会返回下一个数据包返回的数据的大小(插件包pkg的大小)。
3. 木马会以POST请求发送第三个数据包,该数据包会返回加密后的插件包(webroot/dn/pkg目录),以0x8111212为插件的分割字符,包含5个插件;加密算法为xor 0x21
4. 把5个插件通过远程线程注入到进程名为exe(自身)的进程里,加载起来。
返回的插件包是一个伪装jpg的图片,头部16字节是jpg头,如图为浏览器打开的截图:
获取到的插件列表如下:
文件名 | 功能 | 编译时间 |
Pear.dll | 网络通信模块,主要通过管道给其他插件下发命令 | 2019-11-01,04:55:02 |
Mango.dll | 控制者下发文件到受害者(ACFVXZseD) | 2019-11-01,04:55:01 |
Melon.dll | 获取计算机基本信息保存到文件 | 2019-11-01,04:55:02 |
Peach.dll | 从受害者上传数据到控制者(ACFVXZseU) | 2019-11-01,04:55:01 |
Durain.dll | 获取受害者电脑上的特定目录的文件结构和敏感文件 | 2019-11-01,04:55:02 |
Lemon.dll | 注入恶意代码到指定进程中 | - |
具体的管道功能如下:
文件名 | 功能 |
ACFVXZseR | 删除指定文件 |
ACFVXZseE | 运行指定文件 |
ACFVXZseU | 从受害者上传文件到控制者 |
ACFVXZseX | 退出 |
ACFVXZseD | 控制者下发文件到受害者 |
ACFVXZseL | 把恶意代码注入到指定进程 |
RES | 命令执行后返回的结果 |
BUN | 获取本次会话的密钥 |
RQT | 获取待执行的命令队列 |
返回状态的数据包分为四个状态
状态码 | 含义 |
[GET_CMD] | 等待控制者下发指令 |
[CONNECT] | 连接中 |
[SUCCEED] | 执行成功 |
[FAILED] | 执行失败 |
URL接口功能如下:
URI | 用途 |
/qn/doil.php | 验证包和接收插件包 |
/qn/map.php | 用于接收交互命令 |
/qn/daily.php | 未知 |
/qn/flight.php | 用于传送文件 |
通过奇安信大数据平台我们找到了一些同源样本
MD5 | Mutex | 功能 |
0e59d990a6cd93c999481c802ff83c3d | ACFVXZseL | 从管道ACFVXZseL接收过来的恶意代码,解密后注入到指定进程 |
2205e0119c825b8b[]5086e648957edf79 | ACFVXZseL | 和C2进行通信lion.waitnetwork.net下载Apple.exe到本地执行起来,命令行参数“-Snmuery” |
5b63114850a148dc74cce50a36778880 | 循环读取temp下的q文件,解密后执行起来 |
部分浏览器默认安装一个独立服务会监听高端口实现部分功能的调用,我们推测虎木槿团伙对该服务进程进行了代码审计,最终找到任意命令执行漏洞,凡是安装了部分浏览器的终端无论在内网或者在外网映射了IP均能被稳定RCE。
奇安信威胁情报中心观察到相关攻击后,第一时间对漏洞进行了复盘,现将相关细节公开,供安全研究人员参考。
绑定端口代码如下
通过该端口接受的数据格式需要以/?开头,以/r/n结尾,因此此时可以得出以下形式的exp构造/?*****/r/n
接着依次解析appid、path、channel、callback等参数,每个参数以&分割,Exp格式如下
/?appid&path&channel&callback/r/n
之后进入一个if,该大流程为--programid=分支,漏洞触发函数在here位置,因此可以判定我们的exp中一进入--programid=流程,其值会来自于appid,其中--msg_program_suburl=来自前面的path,--msg_program_channel=来自前面channel,因此这里可以得出以下exp的格式,这里通过写入断点观察可以发现if中判断的0x12的值实际是appid的长度,必须为18
Exp构造格式如下:
/?appid=111111111111111111&&path&channel *****/r/n
最终appid转为--programid=,channel转为msg_program_channel,故结合我们检测到的数据最终的EXP构造如下:
/?appid=qheejtaunxfk8pj2p9&channel=1 --no-sandbox --headless --renderer-cmd-prefix="cmd.exe /c start calc.exe&\r\n"
值得一提的是recv后会通过空格对buffer进行分割,所有空格被格式化,导致无法顺利执行EXP,通过分析发现在channel转为msg_program_channel时,会在fun_setStr中处理对应的数据
会依次判断该数据是否为%,+,实际上%是用于处理unicode,而会将+转化为空格,也就是说exp中只需将空格替换为+号,后续代码中会自动将空格恢复
因此完整exp如下所示
/?appid=qheejtaunxfk8pj2p9&channel=1+--no-sandbox+--headless+--renderer-cmd-prefix="cmd.exe /c start calc.exe&\r\n"
最终会调用ShellExecuteW执行对应的命令。
虎木槿利用该漏洞调用wscript执行v.vbs,从远程服务器下载Payload
遗憾的是我们捕获到的样本均已损坏
在2021年攻击者除了使用浏览器漏洞外还使用了一种全新的攻击模式,即入侵内网OA系统,替换OA系统网盘上的常用工具,进行水坑攻击。
尚不清楚攻击者是通过何种方式入侵内网OA的,替换的文件如下:
Md5 | 文件名 | 被替换的工具 |
0782a0d6313fbb19a61d1fdc59234812 | Filelocator pro 8.5 build 2912 | 文件内容搜索工具 |
29f84b0c138f0a8c3b1f6c9a43911984 | filelocatorproportable.exe | 文件内容搜索工具 |
d2ea8a53e5db1b1d78bdc08d66bc1cf6 | Launcher_Setup (1).exe | V2Conference视频会议 |
字符串解密逻辑如下:
从自身释放出正常的软件安装包并启动
释放恶意的SfAntiBot.exe,样本伪装成友商僵尸网络查杀工具
Md5 | 文件名 | 编译时间 |
c296fc1c0d181c2e39f4fd5a8bceb70b | SfAntiBot.exe | 02/10/2021 05:30:20am |
样本起始会动态加载API,并尝试提升到管理员权限
如果权限提升失败,则会用内置的UACME进行bypass UAC提权
核心逻辑在窗口回调函数中
生成配置文件,存放经过加密的C2
读取配置文件解密C2
http://190.2.147[.]128/sangfor/cloud/edrTL.php
收集本机信息,将数据上传到远程服务器上
从远程服务器读取payload数据并写入文件
启动payload,获取屏幕截图发送到远程服务器
下载的payload如下:
Md5 | 文件名 | 功能 |
87b65abafbd51bbd30a5eae624401912 | vmcret.exe | 反弹shell到远程服务器 |
63b80446ff4cefa9db70f6cdffaa6a05 | mscowlib.dll | 下载者 |
aef737cc72ac492ae54cf916cd60b7c1 | 360chkcloud.exe | 下载者 |
vmcret.exe为攻击者自己编译的Cryptcat,主要功能反弹shell
194.88.107.34:443
193.9.113.180:80
攻击者利用反弹shell执行一些cmd命令创建计划任务和横向移动,接着攻击者先是下发了一个名为360ChkCloud的下载者测试文件,功能非常简单
接着下发了带有混淆的下载者,但被天擎查杀,
CC=88.150.227.110:13
2019年
MD5:
580da4e63c9e617573831127df6e02fe
8962b07c12f1e8d1a0cff81b94e21538
e356e764bc0f2d2807314dae322889de
2c5f443b2af64be2c35ebbbc56f61ff0
0e59d990a6cd93c999481c802ff83c3d
2205e0119c825b8b[]5086e648957edf79
5b63114850a148dc74cce50a36778880
CC:
Microsoft.ccivde.com
mail-hostfile.com
141.255.160.250
oversea-cnki.net
datasectioninfo.com
blue.chinfoset.com
lion.waitnetwork.net
cloud.unite.un.org.docs-verify.com
www.ms0ffice.guest-mailclouds.com
service-hq.com
netease.smartsystem36.com
www.morning-place.com
helpdesk-mailservice.com
netease.mail-drivecenter.com
2020年
CC:
http://62.112.8.79/Images/Png/p
2021年
MD5:
0782a0d6313fbb19a61d1fdc59234812
29f84b0c138f0a8c3b1f6c9a43911984
d2ea8a53e5db1b1d78bdc08d66bc1cf6
c296fc1c0d181c2e39f4fd5a8bceb70b
87b65abafbd51bbd30a5eae624401912
63b80446ff4cefa9db70f6cdffaa6a05
aef737cc72ac492ae54cf916cd60b7c1
2353c6bc28050fc95ceca63ef608bca8
fe39b7713f040e839f54edc42af7b63a
CC:
http://190.2.147[.]128/sangfor/cloud/edrTL.php
http://190.2.147[.]128/360-Cloud/Chk
194.88.107.34:443
193.9.113.180:80
88.150.227.110:13