​Kaspersky :无文件恶意软件的分析

admin 2022年5月7日12:20:32评论82 views字数 7853阅读26分10秒阅读模式

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)和最后阶段的木马。

商业工具集
SilentBreak
Cobalt  Strike
Anti-detection wrappers
大量使用syscall库的Go解密程序。保持Cobalt  Strike模块的多次编码,以及AES256 CBC加密的blob。之前没有观察到Go在Cobalt Strike中的使用情况。
一个库launcher,在 MinGW 环境下使用 GCC 编译。这个阶段唯一可能的原因是反侦查
AES  解密程序,使用 Visual Studio 编译程序编译
最后阶段RAT
基于  HTTP 的木马。原始名称可能是 ThrowbackDLL.dll 和 drxDLL.dll,但代码比 SilentBreak 的 Throwback 的旧版本更复杂
基于管道的命名木马。原始名称可能是 monolithDLL.dll 和 SlingshotDLL.dll。根据文件名,最后阶段模块可能是商业 Slingshot 版本的一部分

研究人员认为部分模块是定制的,例如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。解密程序差异很大,它们包含的功能如下表所示:

反检测技
用法
多个编译程序
使用  Go 和 C++ 模块都可以完成相同的 AES256  CBC 解密
Whitelisted  launchers
WerFault.exe  的自动运行副本将launcher映射到进程地址空间
数字证书
15  个用“Fast Invest”证书签名的文件,未发现使用它签名的合法文件
ntdll.dll  的补丁日志导出
为了更加隐蔽,Go droppers在自地址空间中用空功能修补日志相关的API函数,如  EtwEventWriteFull
将  shellcode 保存在事件日志中
这是本次活动中主要的创新。加密的shellcode与下一个stager被分成8KB的块,并保存在事件日志的二进制部分。
C2域模仿
攻击者注册了一个带有ERP在用标题的域名

这层感染链负责解密,映射到内存中并启动代码。之后将介绍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 协议之上的,该协议几乎不会对外部网络开放。因此,这些模块很可能是为横向移动服务的。

特征

基于HTTP的木马
基于管道的命名木马
C2通信
主动连接到一个从硬编码列表中随机选择的C2   
被动模式
加密
基于  XOR和RC4
纯文本
Self  version in beacon
1.1
自然语言工件
未使用的参数"dave"
命令集
基础的,有7个
更复杂的,有20个
注入功能
有,且正在使用
有,且正在使用
独特的命令
Sleep  time随机化:(0,9 – 1,1 之间随机)*Sleep time
获取自上次用户输入以来的分钟数

在对恶意软件集进行了介绍之后,现在将描述感染链:使用 Cobalt Strike 渗透测试套件进行dropper注入。


DLL中的Dropper

先从 wrapper-dropper 动态库开始自定义模块分析。这段代码被注入Windows进程中,如explorer.exe。在其被加载到launcher进程的虚拟地址空间后,dropper会删除由以前的阶段或执行过程创建的文件。

首先,该模块将原来合法的操作系统的错误处理程序WerFault.exe复制到C:WindowsTasks。然后,它将其中一个加密的二进制资源放到同一目录下的wer.dll文件中,进行DLL搜索顺序劫持。为了持久性,该模块将新创建的WerFault.exe设置为自动运行,在SoftwareMicrosoftWindowsCurrentVersionRunWindows系统注册表分支创建一个Windows问题报告值。

​Kaspersky :无文件恶意软件的分析

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副本创建的相同的虚拟地址空间被用于所有代码。

​Kaspersky :无文件恶意软件的分析

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也会搜索所要求的出口并调用它。

​Kaspersky :无文件恶意软件的分析

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共享木马主循环的加密命令。

木马命令

代码

命令功能
0
再次对目标进行指纹识别。
1
执行命令。木马在新进程中执行接收到的命令并将结果发送回C2。
2
从  URL 下载并保存到指定路径。
3
设置新的sleep time。如果 C2 尚未回复要执行的命令,则此时间(以分钟为单位)用作超时。随机化的公式是(0,9 – 1,1 之间的随机数)*  sleep  time。
4
在不更改配置的情况下休眠给定的分钟数。
5
列出具有 PID、路径、所有者、名称和父数据的进程。
6
将  shellcode 注入并运行到目标进程的地址空间。要注入同一个进程,命令参数应该是“local”。与事件日志中的 shellcode 一样,这将运行提供的 PE 的进入点以及通过hash找到的导出。
99
终止木马和 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。在基于命名管道的木马的情况下,常用命令是:

代码

命令功能
0
将“continue”标志设置为 False 并停止工作。
1
N/A,目前为止保留。
2
获取自上次用户输入以来的时间(以分钟为单位)。
3
获取当前进程信息:PID、架构、用户、路径等。
4
获取主机域和用户帐户。
5
使用提供的凭据冒充用户。
6
获取当前进程的可用权限。
7
使用  cmd.exe 解释程序执行命令。
8
使用原始 TCP 套接字测试与给定主机(地址和端口)的连接。
9
获取正在运行的进程信息:路径、所有者、名称、父级、PID 等。
10
用提供的ID的进程的令牌来冒充用户。
11
列出目录中的文件。
12
截图。
13
将内容拖放到文件中。
14
从文件中读取内容
15
删除文件。
16
将提供的代码注入到给定名称的进程中。
17
从  C2 运行 shellcode。
18
N/A,目前为止保留。
19
运行  PowerShell 脚本。在这次活动中, Invoke-ReflectivePEInjection 反射性地将 Mimikatz 加载到内存中并收集凭据。

现在已经涵盖了该活动的三个层次。有趣的是,有一个木马,它具有上表中的完整命令集,但仍然使用RC4加密的HTTP通信与C2,而不是命名管道。最后阶段的样本看起来像一个模块化平台,攻击者可以根据他们当前的需求组合其功能。


基础设施

域名

IP
发现时间
ASN
eleed[.]online
178.79.176[.]136
2022年1月15日
63949  – Linode
eleed[.]cloud
178.79.176[.]136
63949  – Linode
timestechnologies[.]org
93.95.228[.]97
2022年1月17日
44925  – 1984
avstats[.]net
93.95.228[.]97
2022年1月17日
44925  – 1984
mannlib[.]com
162.0.224[.]144
2021年8月20日
22612  –Namecheap
nagios.dreamvps[.]com
185.145.253[.]62
2022年1月17日
213038–DreamVPS
opswat[.]info
194.195.241[.]46
2022年1月11日
63949  – Linode
178.79.176[.]1
63949  – Linode


归因

研究人员认为这些代码是自定义的(木马和wrappers),与以前已知的活动或注册的SilentBreak工具集模块没有相似之处。现在研究人员不愿意给这个活动命名,而是坚持只用“SilentBreak”,因为它是这里使用最多的工具。如果出现新的模块可以将改活动关联到某个攻击团伙,将相应地更新名称。


结论

研究人员认为事件日志技术是这次活动中最有创意的部分,以前从未见过。由于使用了至少两个商业产品,再加上几种最后阶段的RAT和反侦测wrappers,这个活动背后的攻击者相当有能力。有可能这里描述的一些定制的模块也是商业工具集的一部分。这些代码是非常独特的,与已知的恶意软件没有任何相似之处。研究人员将继续监测类似的活动。

 

原文链接:
https://securelist.com/a-new-secret-stash-for-fileless-malware/106393/




原文始发于微信公众号(维他命安全):​Kaspersky :无文件恶意软件的分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月7日12:20:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ​Kaspersky :无文件恶意软件的分析https://cn-sec.com/archives/983895.html

发表评论

匿名网友 填写信息