一、概要
近日,卡巴斯基发布了他们监测到的名为TunnelSnake的 活动,攻击者的目标主要是是东南亚和非洲的外交组织,针对这些目标可以在外部访问到的主机进行攻击,成功部署了Moriya rootkit。由于微软引入了驱动强制签名以及补丁检测机制,rootkit在攻击中很少被使用到,目前大多用在APT攻击活动中。
二、样本分析
样本简介
Moriya是一个被动后门,被部署到外部可以访问到的服务器上,通过安装WFP过滤驱动检查所有传入受感染机器的流量,取出带有特征字符串的流量包进行响应,因此它不包含硬编码的C2地址,这使得对攻击者的溯源难以进行。同时,Moriya在内核层网络堆栈处理数据包之前截获它们,也使得安全检测难以发现它们。
下图是Moriya的执行流程,分为用户层的服务程序以及内核层的驱动程序。
部署恶意程序
获取持久性
Moriya用户层组件导出了Install函数,为了获得持久性,将自身注册为服务。
服务名:NsmSvc
显示服务名:Network Services Manager
程序路径:C:\\windows\\system32\\svchost.exe -k netsvcs
启动方式:随系统启动
设置服务参数,以便每次启动服务都会从该路径加载模块,调用指定入口函数。
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\NsmSvc\\Parameters
ServiceDll = Moriya完整路径
ServiceMain = ServiceMain
安装过滤驱动
自身作为服务启动后,会在ServiceMain函数中安装过滤驱动,与C2进行隐蔽通信。
从资源101中提取过滤驱动MoriyaStreamWatchmen.sys
从.data段中提取1.6.2 版本的VBoxDrv.sys
微软从Windows Vista 64位开始加入了驱动签名机制(DSE),没有数字签名的驱动程序将无法被加载到内核空间中。Moriya通过安装1.6.2 版本的已签名驱动模块VBoxDrv.sys,并使用开源的漏洞利用代码DSEFIX v1.0来关闭DSE机制。在Windows Vista、7下,控制DSE的全局变量位于ntoskrnl!g_CiEnabled ,0(禁用),1(启用)。在Windows 8、10下,它是CI.DLL!g_CiOptions,默认值是6,0 (没有完整性检查)。
关闭、启用DSE的shellcode
关闭DSE机制后,Moriya将会安装过滤驱动MoriyaStreamWatchmen。安装之后,会删除释放的驱动文件MoriyaStreamWatchmen.sys。重新开启DSE机制,以避免被PatchGuard 机制检测到,触发BSOD。
Moriya的主要功能
注册数据包特征字符串
Moriya将字符串”123456”传递到内核层驱动MoriyaStreamWatchmen,驱动程序将根据该字符串匹配所有传入流量。这一步通过调用DeviceIoControl发送IOCTL值0x222004实现。
设置过滤器
Moriya rootkit的驱动组件使用WFP来获取受害主机与C2之间的通信,通过WFP可以在TCP/IP协议栈的多个层设置过滤器,当数据包匹配到过滤器的规则后,就会执行调用接口Callout中设置的回调函数。
Moriya 将过滤条件设置为获取任意远程IPV4地址发送的TCP数据包。当获取到数据包后,将会检测数据包的前6个字节是否为特征字符串”123456”。匹配成功将数据保存到内核层的缓冲区中,匹配失败将数据包扔到TCP/IP协议栈中,使其继续进行处理。
端口屏蔽
Moriya rootkit的驱动组件通过HOOK设备\Driver\nsiproxy的IRP_MJ_DEVICE_CONTROL处理函数,并且设置IRP完成例程。当其它用户层程序通过DeviceIoControl API访问设备\Driver\nsiproxy,并且IoControlCode为0x12001B,InputBufferLength为0x70时,在完成例程中修改IRP->UserBuffer指向的地址空间,将小于50100的本地端口值置为0,使检测本地端口的程序获取不到正确的返回值。
反弹shell
当驱动组件把匹配到的数据包填充到内核层缓冲区时,会设置事件为激发态。此时用户层组件可以通过ReadFile获取数据。当C2发送connect指令时,Moriya会根据接收到的IP、端口创建一个反弹shell。
接收的数据包的格式如下,除了特征字符串之外的所有字节均被加密传输。
解密算法:除了前6个特征字符,将其余每个字节进行取反、与0x05异或。
执行任意指令
用户层代码接收到任意数据后,会创建一个cmd进程用于执行任意指令,cmd进程的输入、输出句柄分别被重定向到两个匿名管道,Moriya通过管道句柄与cmd进程通信。当接收到非connect的指令时,Moriya将接收到的指令写入管道2,从管道1中接收执行结果。通过WriteFile传入驱动模块中,使用FwpsAllocateNetBufferAndNetBufferList0 API将用户层组件传递来的数据作为响应发给C2。
接收的数据包的格式如下:
关闭计划任务程序
通过创建进程快照,遍历所有进程,匹配进程名taskhostw.exe、taskhost.exe,结束该进程。
三、总结
Moriya rootkit使用Windows驱动程序实现了与C2的隐蔽通信。它没有包含硬编码的C2地址,使得对攻击者的溯源难以进行。但是为了关闭DSE机制,安装未签名的驱动程序,它使用了开源的漏洞利用代码DSEFIX v1.0。通过这一点可以在本地进行检测是否被部署了恶意程序。
四、IOC
48307C22A930A2215F7601C78240A5EE | Moriya 用户层组件 |
A2C4EE84E3A95C8731CA795F53F900D5 | Moriya 内核层驱动 |
关于伏影实验室
研究目标包括Botnet、APT高级威胁,DDoS对抗,WEB对抗,流行服务系统脆弱利用威胁、身份认证威胁,数字资产威胁,黑色产业威胁及新兴威胁。通过掌控现网威胁来识别风险,缓解威胁伤害,为威胁对抗提供决策支撑。
版权声明
本站“技术博客”所有内容的版权持有者为绿盟科技集团股份有限公司(“绿盟科技”)。作为分享技术资讯的平台,绿盟科技期待与广大用户互动交流,并欢迎在标明出处(绿盟科技-技术博客)及网址的情形下,全文转发。
上述情形之外的任何使用形式,均需提前向绿盟科技(010-68438880-5462)申请版权授权。如擅自使用,绿盟科技保留追责权利。同时,如因擅自使用博客内容引发法律纠纷,由使用者自行承担全部法律责任,与绿盟科技无关。