关键词
DoNot、APT-C-35、恶意软件、感染链分析
DoNot团队(又名APT-C-35)是从2016年开始一直活跃至今的APT组织,该组织针对南亚的个人和组织进行了多次攻击。据报道,DoNot是Windows和Android间谍软件框架的主要开发者和使用者。
DoNot团队的TTP、基础设施和目标具有一致性,他们以持续更新和改进他们的工具包而闻名。
该集团主要针对印度、巴基斯坦、斯里兰卡、孟加拉国和其他南亚国家的实体。他们专注于政府、军事组织、外交部和大使馆。
DoNot团队使用包含恶意附件的鱼叉式网络钓鱼电子邮件作为其初始感染的手段。并且通过利用了公式编辑器漏洞和远程模板注入漏洞的Microsoft Office宏和RTF文件来加载下一阶段的恶意软件。
已知的TTP或恶意软件共性包括:
-
模块化结构,每个模块都在一个单独的文件中交付
-
功能:文件收集、屏幕截图、键盘记录、反向shell、浏览器信息窃取和系统信息收集
-
多种编程语言,如C++、.NET、Python等
-
利用Google Drive存储命令和控制(C2)服务器地址
-
在整个感染链中被用于不同目的的多个域名
所有已知归因于DoNot团队的框架变体都具有相似的属性。
Morphisec Labs确定了一个新的DoNot感染链,该链将新模块引入Windows框架。这篇文章详细介绍了shellcode加载器机制及其后续模块,确定了浏览器信息窃取器组件中的新功能,并分析了反向shell的新DLL变体。
图1 感染机器时的投放路径
DoNot最新的鱼叉式网络钓鱼电子邮件活动使用了RTF文件,针对的是包括巴基斯坦国防部在内的政府部门。当RTF文档打开时,它会尝试通过发送HTTP GET请求从其C2获取恶意远程模板:<domain>/<X>/<Y>.php。如果该请求的User-Agent不包含MSOffice(Office应用程序会默认添加),C2将返回一个内容为空的诱饵文档。否则,它会返回一个注入了武器化宏的文档。这种技术能够欺骗那些试图在没有MSOffice用户代理头情况下对URL进行扫描的安全解决方案,以将自己伪装成无害URL。远程模板URL在一定时间以后会失效,这使得分析变得困难。
(1)SHELLCODE执行前的操作
在注入远程模板时,它会诱使受害者允许编辑和启用宏。启用宏后,Document_open例程将执行,并在开始时使用for循环来延迟恶意代码执行,然后根据Winword.exe的位数调用适当的函数。
图2 Document_open例程代码
该函数将shellcode(32位/64位)注入进程内存并调用它。以下三个WinAPI函数被用于注入shellcode:
-
ZwAllocateVirtualMemory——分配具有执行/读取/写入权限的虚拟内存
-
MultiByteToWideChar——将shellcode字符串映射到UTF-16
EnumUILanguagesA——将shellcode作为回调参数传递。其他变体也使用Internal_EnumSystemCodePages WinAPI
图3 用于执行shellcode的WinAPI调用
(2)投放有效载荷
在执行有效载荷之前,shellcode使用一个简单的解密例程对自身进行解密——not后面跟着使用两字节密钥的xor运算,该密钥随着阶段的不同而变化。在调用shellcode后,它先解密shellcode的其余字节后再执行,并将执行代码传递到下一个阶段。
图4 下一个块被解密之前的shellcode解密例程
接下来,shellcode从其C2下载一个加密的blob:<domain>/<X>/<Y><Z>.ico(对于32位shellcode)或<domain>/<X>/<Y><Z>.png(对于64位shellcode),并对其进行解密。解密后的blob是第二阶段的shellcode,与第一阶段的shellcode一样,它首先解密shellcode中的其余字节,然后再将执行代码传递到下一阶段。
在第一阶段shellcode的64位版本中,攻击者留下了似乎属于shellcode builder配置的字符串:
'sm\INCLUDE\PCOUNT\SHELL32.INC'
include 'c:\Fasm\INCLUDE\WIN32AXP.INC'
include 'Shellcodes\MyAssemblyMacros\MyAssemblyMacrosMain.INC'
;if debugging turn this bit on
debug = 0
xor_key_main = 0xAD
xor_key_payload = 0xFE
xor_key_url = 0xCE
expiry_year_date = 0x7e6070f
mcafee_expiry_year_date = 0
avg_expiry_year_date = 0
norton_expiry_year_date = 0
bitdefender_expiry_year_date = 0x7e6070f
eset_expiry_year_date = 0x7e60717
define_real_variable local_path_exe_env, '%tmp%\..\winsvsc.exe',0
define_real_variable tmp_env_path, '%tmp%\document.doc',0
define_real_variable clear_registry, 'reg delete "HKCU\Software\Microsoft\Office\12.0\Word\Resili
这些配置包括第二阶段shellcode中使用的XOR密钥,以及McAfee、Norton和Bitdefender等安全产品的到期日期。一些字符串似乎是攻击者的本地路径和调试标志。
接下来,shellcode通过验证位于C:WindowsSystem32drivers下的驱动程序是否存在来检查是否存在相应的安全解决方案。如果存在安全解决方案,shellcode会将当前日期与在shellcode builder中配置的到期日期进行比较,并根据比较结果执行不同的操作。
例如,在研究样本中,[1]-[7]表示以下值:
[1]hxxp://mak.logupdates.xyz/DWqYVVzQLc0xrqvt/HG5HlDPqsnr3HBwOKY0vKGRBE7V0sDPdZb09n7xhp0klyT5X.mp3
[2]hxxp://mak.logupdates.xyz/DWqYVVzQLc0xrqvt/HG5HlDPqsnr3HBwOKY0vKGRBE7V0sDPdZb09n7xhp0klyT5X.doc
[3]%tmp%syswow64[.]dll
[4]%tmp%document[.]doc
[5]Qoltyfotskelo
[6]schtasks.exe /create /tn wakeup /tr "rundll32 %tmp%syswow64.dll, HPMG" /f /sc DAILY /st 11:00 /ri 10 /du 24:00
[7]cmd.exe %tmp%\syswow64.dll
恶意软件将根据是否找到安全解决方案来决定接下来的操作。例如,下表展示了当前日期和到期日期之间的比较,以及在找到驱动程序后执行的相应操作:
表1 安全解决方案的过期时间和应对措施
驱动名称 |
附属公司 | 到期日期 |
设置 |
Action1 | Action2 |
gzfit.sys |
BitDefender杀毒软件 | 0x7E6070F -> 2022/07/15 |
if current_date <= expiry: Action1 else: Action2 |
从[1]下载到[3] 修改前三个字节 调用导出函数[5] |
从[1]下载到[3] 从[2]下载到[4] 执行cmd.exe,,然后通过WinExec执行[7] |
klif.sys |
卡巴斯基杀毒软件 | 0x7E6070B -> 2022/07/11 |
if current_date <= expiry: Action1 else: Action2
|
将shellcode注入bcrypt.dll shellcode执行与上面相同的操作 |
从[1]下载到[3] 从[2]下载到[4] 执行cmd.exe,,然后通过WinExec执行[7] |
aswsp.sys |
Avast | 0x7E6070F -> 2022/07/15 |
if current_date <= expiry: Action1 else: Action2
|
从[1]下载到[3] 修改前三个字节 调用导出函数[5] |
从[1]下载到[3] 从[2]下载到[4] 执行cmd.exe,,然后通过WinExec执行[6]和[7] |
Uehdrv.sys |
ESET NOD32杀毒软件 |
0x7E60717 -> 2022/07/23 |
if current_date <= expiry: Action1 else: Action2 |
从[1]下载到[3] 修改前三个字节 调用导出函数[5] |
从[1]下载到[3] 从[2]下载到[4] 执行cmd.exe,,然后通过WinExec执行[6]和[7] |
bsfs.sys | QuickHeal杀毒软件 | 0x7E60711 -> 2022/07/17 | if current_date <= expiry: Action1 else: Action2 |
从[1]下载到[3] 从[2]下载到[4] 执行cmd.exe,,然后通过WinExec执行[7] |
int 3并退出 |
360AvFlt.sys | 奇虎360 | 0x7E60713 -> 2022/07/19 | if current_date <= expiry: Action1 else: Action2 | 无 |
从[1]下载到[3] 从[2]下载到[4] 执行cmd.exe,,然后通过WinExec执行[6]和[7] |
如果在受害者的机器上找不到任何安全产品相关的驱动程序,shellcode将执行从[1]中下载的默认例程,并将前三个字节修改回其原始形式,再执行导出的函数[5]。此技术用于规避安全解决方案并阻止它们扫描可执行文件。
Morphisec实验室还没有发现恶意软件检查到期日期和驱动的明确动机。当恶意软件结合某个日期检查安全解决方案时,往往是因为作者针对现有的最新版本测试了他们的绕过方法,而对于在那之后的版本则无法保证绕过方法是否仍然有效。因此在找到安全解决方案后,常见的恶意软件行为是中止执行。而本文所描述恶意软件仅会稍微修改其行为,然后继续进行恶意活动。
(3)模块交付和执行
初始感染执行主DLL。该DLL负责将感染成功的信标返回给C2服务器,并下载框架中的下一个组件。下图概述了其余执行程序中组件之间的关系:
图5 组件关系(高亮为新增/更新的组件)
主DLL(pgixedfxglmjirdc.dll)信标
由shellcode投放的主DLL通常包含两个导出函数:Qoltyfotskelo(称为第一个导出函数)和Yolueorgw(称为第二个导出函数)。
第一个导出函数负责持久化和检查安全解决方案。持久化通过设置每三分钟运行一次的新计划任务(通过COM对象)来实现,分配给任务的操作是运行第二个导出函数——Yolueorgw。
图6 持久化机制
第二个导出函数负责向C2服务器发送信标。在此之前,它会创建一个互斥体以避免多个实例同时运行,并使用WMI查询来执行虚拟机检测:
图7 在csproduct中查找VMware、VMware Virtual Platform和VirtualBox
然后,该恶意软件使用Windows Management Instrumentation(WMI)收集基本系统信息,例如名称、操作系统版本、内部版本号和处理器ID:
图8 发送到服务器的信标信息(加密前)
恶意软件会将受害者ID和C:Program Files以及C:Program Files (x86)下的文件夹名称串联起来,以了解系统上安装了哪些软件。而受害者ID又是用户名-计算机名-处理器ID的串联,该字符串将在以后与C2服务器的通信中标识受害者。
完成此操作后,恶意软件加密受害者的数据并将以信标的形式发送回其C2服务器。恶意软件和服务器加密算法是AES-256,带有两组嵌入密钥和IV。然后使用Base64对加密数据进行编码。
信标过程分为两个步骤,如下所示:
图9 用于下载下一个组件的信标消息
发送到服务器的第一条消息是一个POST请求,发送到嵌入在二进制文件中的第一个URL路径(<first_path>)。正文包含以下加密信息:
Name: Cpu型号>Caption: 操作系统版本>Build: 内部版本号V:|||用户名-计算机名-处理器ID||||||O|||3|||第一个文件夹名称?第二个文件夹名称…
图10 属性第一个POST请求中的信息
根据服务器的响应,恶意软件要么保持空闲并循环发送信标,要么请求下载DLL并进入下一阶段。如果是后者,恶意软件会向同一服务器上的第二个URL路径 (<second_path>)发送另一个POST请求。此消息包含以下加密信息:用户名-计算机名-处理器ID|||下一阶段的DLL
对该请求的响应是下一阶段的DLL。为了执行下一阶段,恶意软件会创建另一个计划任务并使用清理.bat文件删除前一个任务(见附录部分中的ms.bat)。
模块下载器(WavemsMp.dll)
这个阶段的主要目的是下载和执行用于窃取用户信息的模块。为了确定本次感染中使用哪些模块,恶意软件需要与另一台C2服务器进行通信。为此,恶意软件从一个嵌入的链接中获取新地址,该链接指向包含加密C2服务器地址的Google Drive文档:
图11 从Google Drive下载加密的C2服务器地址
图12 从Google Drive下载的C2地址解密
这种架构允许作者频繁更新他们的C2服务器,而无需重新交付二进制文件。C2服务器地址解密后,恶意软件会向其发送POST请求,请求正文中包含加密的受害者ID。响应是模块的配置:
图13 模块配置信息
这个框架具有突出的模块化特征。无需更新二进制文件,仅通过修改模块配置即可控制下载和执行哪些模块。Morphisec Labs见证了当单个二进制文件与不同的C2服务器通信,并随着时间的推移在多次运行中下载不同的模块时,此功是如何发挥作用的。
模块的信息由管道符|分隔,其中每个部分具有以下格式:
模块名称>模块大小>是否下载>需要执行的导出函数名>其他参数
此外,恶意软件还会查找一些特殊字符,例如:
下图说明了各个模块以及它们之间的交互:
图14 模块关系图
有关每个模块的更多信息见《肚脑虫(APT-C-35)组织最新攻击框架披露》。
(4)浏览器信息窃取模块的升级
在Morphisec Labs研究以前已知的模块时,浏览器信息窃取模块引起了他们的注意。浏览器信息窃取模块于2020年底首次引入框架,自那开始就没有任何重大的改变,直到现在。
该模块没有在DLL中实现窃取功能,而是使用前一阶段(WavemsMp.dll)下载的四个附加可执行文件。每个附加的可执行文件都会从Google Chrome和/或Mozilla Firefox中窃取信息。下表总结了从每个浏览器中窃取的数据:
表2 每个可执行文件窃取的数据(%base%=C:ProgramDataDeviceStageusabrowatad)
名称 |
窃取数据 | 纯文本文件 |
加密文件 |
WinBroGogle.exe |
Google Chrome凭据 | C:ProgramDataucredgogle_qrty |
%base%usagoglyse.rnm |
WinBroGoMoH.exe |
Google Chrome and Mozilla Firefox历史记录 |
1.%base%goo_bhf.txt 2.%base%maza_bhf.txt |
1.%base%goo_bhf.rnm 2.%base%maza_bhf.rnm |
WinBroMozla32.exe |
Firefox登录(个人资料数据) | C:ProgramDatausam0zlp_xcertyuqas |
%base%usam0zlp.rnm
|
WinBroMozla64.exe |
Firefox登录(个人资料数据) |
C:ProgramDatausam0zlp_xcertyuqas |
%base%usam0zlp.rnm |
浏览器信息窃取模块执行每个可执行文件,窃取数据并将其存储在临时纯文本文件中。然后将该文件加密并保存为.rnm文件,该文件随后由文件上传模块ieflagUl.dll发送回C2服务器。
(5)反向SHELL的DLL实现
在这之前,反向shell模块已作为可执行文件实现。但现在,攻击者为了与其余模块对齐,将反向shell重新编译为DLL。反向shell模块的功能保持不变,首先与攻击者机器建立socket通信(位于162.33.177[.]41),然后创建一个新的隐藏cmd.exe进程,并将STDIN、STDOUT和STDERR指向socket。
图15 反弹shell模块的实现
shell持续运行,直到攻击者发送字符串“exitn”。
防御像DoNot团队这样的APT组织需要深度防御策略,这种策略通过构建多层安全防护来确保在任何给定层被破坏时仍存在安全冗余。任何足够大的组织都有被DoNot团队等APT组织攻击的风险。这些攻击者针对的是常常被忽视的关键安全缺口,即内存的运行时环境。
最难防御的攻击是那些在运行时以应用程序为目标的攻击(如此处详述的Windows框架)。这是因为流行的安全解决方案(例如NGAV、EDR、EPP、XDR等)专注于检测磁盘或操作系统上的异常情况。它们在运行时检测或阻止内存攻击的能力是有限的,即使它们具有相应的能力,也需要设置成最激进的警报模式,这将会导致系统的性能问题和误报。
现在,一项名为移动目标防御(MTD)的独特技术旨在防御针对Windows和Linux的高级运行时攻击,而不会影响系统性能或生成错误警报。它能够主动阻止供应链攻击、代码注入、防御规避、远程代码执行、权限提升、凭证盗窃和勒索软件。而且它不需要签名或行为模型就可以做到这一点。其原理是通过随机化受信任的运行时应用程序代码,使得没有两台机器的环境能够一模一样,甚至一个系统本身也会随着时间而产生改变。受信任的应用程序可以在修改后的运行时环境中导航,而任何试图留下陷阱的软件组件则会被MTD阻止。而且它对系统性能不会产生任何明显影响。
echo off
SETLOCAL
set id=%1
set pat=%2
set t_sk=%3
set t_sk_self=%4
set extra_lld=%5
::echo %id%
::echo %pat%
schtasks /delete /tn %t_sk_self% /f
taskkill /F /PID %id% /T
timeout /t 2
taskkill /PID %id% /T /F
timeout /t 2
schtasks /delete /tn %t_sk% /f
timeout /t 2
schtasks /delete /tn %t_sk_self% /f
timeout /t 2
schtasks /delete /tn %t_sk_self% /f
timeout /t 2
del %pat%
:: del batch file self
timeout /t 2
del "%~f0" & EXIT
Doc文档
d566680ca3724ce242d009e5a46747c4336c0d3515ad11bede5fd9c95cf6b4ce
28c71461ac5cf56d4dd63ed4a6bc185a54f28b2ea677eee5251a5cdad07077b8
9761bae130d40280a495793fd639b2cb9d8c28ad7ac3a8f10546eb3d2fc3eefc
41c221c4f14a5f93039de577d0a76e918c915862986a8b9870df1c679469895c
组件(DLL和EXE)
2c84b325b8dc5554f216cb6a0663c8ff5d725b2f26a5e692f7b3997754c98d4d
a70038cdf5aea822d3560471151ce8f8bacd259655320dea77d48ccfa5b5af4f
d3a05cb5b4ae4454079e1b0a8615c449b01ad65c5c3ecf56b563b10a38ecfdef
d71fa80d71b2c68c521ed22ffb21a2cff12839348af6b217d9d2156adb00e550
7fc0e9c47c02835ecbbb63e209287be215656d82b868685a61201f8212d083d9
6e7b6cc2dd3ae311061fefa151dbb07d8e8a305aed00fa591d5b1cce43b9b0de
90cb497cad8537da3c02be7e8d277d29b78b53f78d13c797a9cd1e733724cf78
93ca5ec47baeb7884c05956ff52d28afe6ac49e7aba2964e0e6f2514d7942ef8
9b2ef052657350f5c67f999947cf8cd6d06a685875c31e70d7178ffb396b5b96
80f2f4b6b1f06cf8de794a8d6be7b421ec1d4aeb71d03cccfc4b3dfd1b037993
f0c1794711f3090deb2e87d8542f7c683d45dc41e4087c99ce3dca4b28a9e6f6
5ebee134afe192cdc7fc5cc9f83b8273b6f282a6a382c709f2a21d26f532b2d3
域名
worldpro[.]buzz
ser.dermlogged[.]xyz
doctorstrange[.]buzz
clipboardgames[.]xyz
beetelson[.]xyz
tobaccosafe[.]xyz
kotlinn[.]xyz
fitnesscheck[.]xyz
dayspringdesk[.]xyz
srvrfontsdrive[.]xyz
globalseasurfer[.]xyz
esr.suppservices[.]xyz
-
ieflagKlo.dll——键盘记录模块
-
ieflagUl.dll——用于上传模块输出的文件上传模块
-
ieflagSp.dll——屏幕截图模块
-
ieflagTr.dll——文件收集模块
-
ieflagUsd.dll——可移动磁盘文件收集模块
-
ieflagBr.dll——浏览器信息窃取模块
-
ieflagRvso.dll——反向shell模块
-
T?<file_name>?<file_data>——在%Temp%usdata创建一个文件并写入内容
-
M?<module_name>?<module_size>——从服务器下载另一个文件到%ProgramData%MJDpnd
-
D?——未知
编辑|张逸鸣
审校|何双泽、金矢
本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。联系信息进入公众号后点击“关于我们”可见。
原文始发于微信公众号(国家网络威胁情报共享开放平台):APT-C-35取得新升级
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论