2022 年 2 月,研究人员首次在野观察到将 shellcode 放入 Windows 事件日志的技术,可在文件系统中隐藏“无文件”最后阶段的木马。Dropper 模块还修改了与事件跟踪 (ETW) 和反恶意软件扫描接口 (AMSI) 相关的 Windows 原生 API 功能,使感染过程更加隐蔽。
除了事件日志之外,攻击者的工具集中还有许多其它技术。其中包括,模仿合法域名的 C2 Web 域名以及使用目标现有软件的名称。对于主机,攻击者使用 Linode、Namecheap、DreamVPS 上的虚拟专用服务器。
使用大量的反侦测解密程序。攻击者使用不同的编译程序,包括Microsoft 的 cl.exe 和MinGW 下的 GCC ,以及最新版本的 Go。此外,为了绕过检测,某些模块使用数字证书进行签名。研究人员认为它是由攻击者发布的,因为遥测数据显示没有任何用它签名的合法软件,只有在这个活动中使用的恶意代码。
关于最后阶段的木马:有基于 HTTP 和命名管道的木马。显然,除了事件日志之外,攻击者还痴迷于内存注入——很多RAT命令都与此有关,并被大量使用。除了上述的自定义模块和技术外,还使用了一些商业的测试工具,如Cobalt Strike和NetSPI(前SilentBreak)。
感染链
分析从内存中的最后一个阶段开始研究,然后重建几个感染链。值得注意的是该活动非常有针对性,并且使用了大量工具,包括商业工具。
该活动的各种技术和模块看起来令人印象深刻。可以把它分成几类来从技术上描述这个活动。实际上,包括以下几组模块:商业渗透测试套件、围绕它们的自定义反侦测包装程序(Anti-detection wrappers)和最后阶段的木马。
|
|
|
|
|
|
|
|
|
|
|
|
|
研究人员认为部分模块是定制的,例如wrappers和最后的stagers,可能是商业产品的一部分。经过分类,后文将对它们逐一分析。
初始感染
观察到最早的攻击发生在 2021 年 9 月。CobaltStrike 模块的传播是通过诱使目标下载合法站点 file.io 上的 .rar 链接并自行运行来实现的。内部 Cobalt Strike 模块的数字证书如下(在使用同一个模块的活动中,签署了从开始的结束的15 个不同的 stager):
Organization: Fast Invest ApS
E-mail: [email protected]
Thumbprint 99 77 16 6f 0a 94 b6 55 ef df 21 05 2c 2b 27 9a 0b 33 52 c4
Serial 34 d8 cd 9d 55 9e 81 b5 f3 8d 21 d6 58 c4 7d 72
由于所有目标主机的感染情况不同,研究人员只描述其中一种情况。因为能够使用木马将代码注入任意进程,攻击者就可以自由地使用此功能将下一个模块注入 Windows 系统进程或受信任的应用程序(如 DLP)。
考虑到缩短的进程注入,和模仿Web 域注册,就可以把攻击过程描述为迭代过程:最初用一些模块进行侦察,然后准备其它攻击。
商业工具集
关于商业工具,这次活动中SilentBreak和Cobalt Strike工具集的使用痕迹相当明显。ThrowbackDLL.dll和SlingshotDLL.dll木马让人联想到Throwback和Slingshot,它们都是SilentBreak框架中的工具,而与dropper(sb.dll)相关的 "sb "可能是供应商名字的缩写。
在这里要提到的是,二进制文件内的几个.pdb 路径包含了项目的目录C:Usersadminsourcereposdrx和其它未以 SilentBreak 命名的模块,如drxDLL.dll。然而,加密功能与公开的Throwback的代码相同。
反侦测包装程序(Anti-detection wrappers)
反侦测包装程序使用了不同的编译程序。除了 MSVC,还使用了Go 编译程序1.17.2 和 MinGW 的 GCC。解密程序差异很大,它们包含的功能如下表所示:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这层感染链负责解密,映射到内存中并启动代码。之后将介绍Cobalt Strike的Go解密程序launcher。
主包中的函数名称是被混淆的。Main.init对kernel32.dll和ntdll.dll库中与事件日志创建相关的Windows API函数名称(WriteProcessMemory和其它函数)进行解码。二进制文件中的每个名称都被连续进行了四次base64编码。使用了WriteProcessMemory,dropper用 "xor rax, rax; ret "的代码在内存中编写了以下函数:EtwNotificationRegister,、EtwEventRegister、 EtwEventWriteFull、 EtwEventWriteFull和 EtwEventWrite。
在 Main.start 中,恶意软件会检查主机是否在域中,并且只有在它为真时才有效。然后动态解析上述函数的地址。下一个 stager 使用 AES256(CBC模式)加密,密钥和 IV 使用 base64 编码。
采用这样的方法,需要研究人员编写一些脚本来收集下一个模块的加密部分。解密后,为了得到最终的可移植可执行文件,必须进一步转换数据。
Last stager类型
Last stagers 有两种通信机制,通过HTTP的RC4加密和不加密的命名管道。后一种方式在技术上能够与所有网络可见的外部主机进行通信,但在 Windows 下,命名管道是建立在 SMB 协议之上的,该协议几乎不会对外部网络开放。因此,这些模块很可能是为横向移动服务的。
特征 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在对恶意软件集进行了介绍之后,现在将描述感染链:使用 Cobalt Strike 渗透测试套件进行dropper注入。
DLL中的Dropper
先从 wrapper-dropper 动态库开始自定义模块分析。这段代码被注入Windows进程中,如explorer.exe。在其被加载到launcher进程的虚拟地址空间后,dropper会删除由以前的阶段或执行过程创建的文件。
首先,该模块将原来合法的操作系统的错误处理程序WerFault.exe复制到C:WindowsTasks。然后,它将其中一个加密的二进制资源放到同一目录下的wer.dll文件中,进行DLL搜索顺序劫持。为了持久性,该模块将新创建的WerFault.exe设置为自动运行,在SoftwareMicrosoftWindowsCurrentVersionRunWindows系统注册表分支创建一个Windows问题报告值。
dropper将带有 shellcode 的消息写入现有的 Windows KMS 事件日志
被安装的 wer.dll 是一个加载程序,如果没有隐藏在 Windows 事件日志中的 shellcode,它不会造成任何伤害。dropper在事件日志中搜索类别为 0x4142(ASCII 中的“AB”)并以密钥管理服务作为来源的记录。如果没有找到,则通过 ReportEvent() Windows API 函数(lpRawData 参数)将 8KB 的 shellcode 块写入信息记录消息。创建的事件 ID 会自动递增,从 1423 开始。
wer.dll 中的Launcher
这个launcher被第一个stager投放到任务目录中,代理所有对wer.dll的调用和它对原始合法库的输出。在进入点,一个单独的线程将上述所有8KB的片段合并成一个完整的shellcode并运行它。由合法的WerFault.exe副本创建的相同的虚拟地址空间被用于所有代码。
DLL 使用Blackbone Trampolines修补launcher的进入点
阻止合法launcher执行的方法并不常见。在主线程中,wer.dll 找到它的进入点并用一个简单的函数对其进行修复。上面截图中的 WaitAndExit() 只会使用日志收集线程 ID 调用 WaitForSingleObject(),然后退出。这意味着永远不会执行真正的WerFault.exe 错误处理代码,因为映射到其地址空间的 DLL 会阻止它。
在 Windows 事件日志写入Shellcode
launcher将控制传输到收集的 shellcode 的第一个字节。在这里,为下一个函数准备了三个参数:
-
下一阶段木马的地址,它也包含在从事件日志中提取的数据中
-
此木马(0xE124D840) 中名为Load的导出函数的标准ROR13 hash
-
字符串“dave”和常量“4”的地址,它们成为导出函数的参数,通过hash找到
通过解析下一个 Windows 可移植可执行文件以定位其入口点是不常见的。为了让下一阶段的木马不那么显眼,演员抹去了标题中的“MZ” magic。在木马的进入点调用代码后,shellcode也会搜索所要求的出口并调用它。
shellcode 通过硬编码hash和参数“dave”和“4”搜索
HTTP木马
对于最后的阶段,分析的比之前的辅助模块更详细一些。C++ 模块显然使用了来自 SilentBreak(现在的 NetSPI)Throwback 公共存储库的代码:基于 XOR 的加密函数,一些样本的原始文件名,例如 ThrowbackDLL.dll 等。分析从上文提到的导出函数 Load()开始。与之前的 WerFault 补丁一样(函数在主木马线程上等待),但它忽略了所有参数,所以“dave”和“4”没有被使用。这个launcher可能支持比这个更多的模块,这就需要参数。
目标指纹识别
该模块用一个字节的XOR密钥对C2域进行解密。在这个样本中,只有一个域eleed[.]online。木马能够处理许多这样的域,用"|"字符分隔并加密。为了通过普通HTTP的进一步通信,木马从这个集合中随机选择一个用户代理为 "Mozilla5.0 "的C2。
该恶意软件通过收集以下信息生成一个指纹字符串,这些信息也由"|"分隔:
-
SOFTWAREMicrosoftCryptography中 MachineGUID 的值
-
计算机名称
-
使用GetAdaptersInfo 获取的本地 IP 地址
-
架构(x86或 x64)
-
操作系统版本
-
当前进程是否有SeDebugPrivilege
指纹识别程序还将“1.1”附加到字符串(可能是恶意软件版本)和当前配置的sleep time。
与 C2 进行加密的 HTTP 通信
在HTTP通信之前,该模块使用硬编码的32字节长的RC4密钥发送空(但仍然加密)的ICMP数据包来检查连接。与其它字符串一样,此密钥使用基于Throwback XOR的算法加密。
如果ping端口为80的控制服务器成功,则将上述指纹数据发送到该服务器。作为回应,C2共享木马主循环的加密命令。
木马命令
代码 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
此次活动中使用的另一个基于命名管道的木马,具有更深刻的命令系统,包括提权、截图、不活动时间测量等。这里到了感染链的末端。后文将继续说明另一个最后阶段的木马类型,它被注入到像edge.exe这样的进程中。
基于命名管道的木马
该木马的位置是C:Windowsapds.dll。原本合法的微软帮助数据服务模块库,也是在C:WindowsSystem32。木马的主要工作周期是在一个单独的线程中。该恶意软件还导出了一个Load()函数,其唯一目的是等待一个工作线程,这是该活动的典型模块。
首先,木马主线程获取原始的 apds.dll 并将其导出并保存到内存中木马图像之后分配的新堆缓冲区中。然后木马编辑自导出的函数数据,允许它通过如下所示的特制存根调用原始 apds.dll 导出,其中地址是从真正的 apds.dll 解析的地址:
首先,木马主线程获得原始的apds.dll,并将其导出并保存到分配的新堆缓冲区中,紧随木马在内存中的镜像。然后,木马对自我导出的函数数据进行编辑,使其能够通过特制存根来调用原始的apds.dll导出数据,如下所示,其中的地址是从真正的apds.dll中解析出来的:
48B8<addr> MOV RAX,<addr>
FFE0 JMP RAX
此trampoline代码取自 Blackbone Windows 内存黑客库(RemoteMemory::BuildTrampoline 函数)。DLL 劫持并不是什么新鲜事物,现在已经多次看到这种技术用于代理合法函数,但是仅使用短存根重新创建自导出来调用原始合法函数是不寻常的。然后该模块创建一个双工命名管道“MonolithPipe”,并进入其主循环。
工作周期
在对导出函数进行上述操作后,该模块通过架构和 Windows 版本信息对主机进行指纹识别。木马还使用提到的罕见常量初始化一个随机的11 字节 ASCII 字符串,例如这里的 init_keys函数。结果用作唯一的会话 ID。
恶意软件连接到端口 443 上的硬编码域(在此样本中为 https://opswat[.]info:443),并向 C2 端的 submit.php 发送POST 请求。HTTPS 连接选项设置为接受服务器端的自签名证书。在此样本中,C2 通信使用 RC4 算法进行加密,密钥为 Dhga(81K1!392-!(43<KakjaiPA8$#ja。在基于命名管道的木马的情况下,常用命令是:
代码 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
现在已经涵盖了该活动的三个层次。有趣的是,有一个木马,它具有上表中的完整命令集,但仍然使用RC4加密的HTTP通信与C2,而不是命名管道。最后阶段的样本看起来像一个模块化平台,攻击者可以根据他们当前的需求组合其功能。
基础设施
域名 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
归因
研究人员认为这些代码是自定义的(木马和wrappers),与以前已知的活动或注册的SilentBreak工具集模块没有相似之处。现在研究人员不愿意给这个活动命名,而是坚持只用“SilentBreak”,因为它是这里使用最多的工具。如果出现新的模块可以将改活动关联到某个攻击团伙,将相应地更新名称。
结论
研究人员认为事件日志技术是这次活动中最有创意的部分,以前从未见过。由于使用了至少两个商业产品,再加上几种最后阶段的RAT和反侦测wrappers,这个活动背后的攻击者相当有能力。有可能这里描述的一些定制的模块也是商业工具集的一部分。这些代码是非常独特的,与已知的恶意软件没有任何相似之处。研究人员将继续监测类似的活动。
原文始发于微信公众号(维他命安全):Kaspersky :无文件恶意软件的分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论