“无文件”恶意软件的最新藏匿处

      最后更新:2022-07-29 02:35


      在2022年2月,卡巴斯基实验室的研究人员首先观察了将shellcode插入Windows事件日志的技术。该技术允许最后的分级器“没有文件”被隐藏在文件系统中。对活动事件日志的关注并不局限于存储shellcode。Dropper 模块还修复了与事件跟踪 (ETW) 和反恶意软件扫描接口 (AMSI) 相关的 Windows 原生 API 函数,使感染过程更加隐蔽.

      除了事件日志之外,攻击者的工具群也有许多其他技术。其中,开发者增加了检测功能,可以模仿合法域名的C2网络域,以及受害者使用的现有和软件的名称。为了使这次袭击更加隐蔽,攻击者使用Linode、Namecheap和DreamVPS上的虚拟专用服务器。

      更常见的方法是使用大量的反检测解密器。攻击者使用不同的编译器,从微软的 cl 或 MinGW GCC 到最新版本的 Go.此外,为避免被检测到,一些模块使用数字证书来签名。研究人员相信它是由袭击者释放的,由于遥感数据没有显示与其签署的任何合法软件,只有恶意代码在这项活动中使用。

      关于特洛伊的马的最后的主人,攻击者决定使用多个基于HTTP和命名的管道。显然,除了事件日志之外,攻击者也被记忆注射所困扰,许多RAT命令与它有关,并且被广泛使用。除了上述定制模块和技术外,袭击者还使用了一些商业渗透测试工具,例子包括Cobalt Strike和SilentBreak工具包。


      感染链

      研究人员从记忆中的最后一个堆栈开始研究,然后使用遥感技术重建几个传染链,这是一个高度目标的活动,包括许多工具,包括商业工具。

      该活动包括多种技术模块,让我们将其分成几个类别来技术描述该活动,例如商业渗透测试套件、自定义的防检测包装器及其周围,以及最终的标记。

      商业工具集有:

      防检测包 - 使用大量系统调用库的 Go 解密器,这使得Cobalt Strike模块可以多次编码,并使用AES256CBC加密块,这是首次观察到使用Go with Cobalt Strike。

      反检测包(英语:Anti-detection packer) — 使用GCC编译器的库启动器,在MinGW环境中使用。

      反检测包 - AES解密器,使用Visual Studio编译器编译;

      Laststager RAT - 基于HTTP的木马,可能的原名是ThrowbackDLL.dll和drxDLL.dll,但是这个代码比SilentBreak的Throwback更复杂。

      最后,脚踏机RAT-一种基于管道的命名马,可能的原始名称是 monolithDLL.dll和 SlingshotDLL.DLL。根据文件名,最后的共享模块可能是商业的Slingshot版本的一部分。

      同样,我们认为定制的一些模块(如包装器和最后stager)可能是商业产品的一部分。分类之后,我们准备一个一个地分析模块。


      初始感染

      我们观察到的第一个攻击器发生在2021年9月。Cobalt Strike 模块的传播是通过说服目标下载合法站点 file.io 上的 .rar 链接并自行运行来实现的。内部CobaltStrike模块的数字证书如下(在同一活动期间,从 wrapper 到 last stagers 签署了 15 个不同的 stager):


      因为所有目标的宿主都感染得不同,我们 只 将 描述 观察 到 的 情况 。由于使用木马可以将代码插入到任何过程中,攻击者可以自由使用此功能将下一个模块插入到Windows系统进程或信任的应用程序(如DLP)。

      记住截断的进程注入,甚至模仿 Web 域注册,我们可以将攻击过程描述为非常迭代(quite iterative):对一些模块进行初始侦察,然后准备额外的攻击。


      商业工具集

      关于商业工具,使用SilentBreak和Cobalt Strike工具包在这个事件中非常明显。名为 ThrowbackDLL.dll 和 SlingshotDLL.dll 的木马让我们想起 Throwback 和 Slingshot,它们都是SilentBreak框架中的工具,而与 dropper (sb.dll) 关联的“sb”可能是供应商名称的缩写。

      这里我们要提一下,二进制文件中的几个 .pdb 路径包含项目的目录 C:Usersadminsourcereposdrx 以及其他未以 Throwback 或 Slingshot 命名的模块,例如,drxDLL.DLL。但是,加密函数与公开的Throwback代码相同。


      反检测设计

      对于反检测包装器,使用了不同的编译器。除了 MSVC,Go 编译器 1.17.2 和 MinGW 下的 GCC 都在使用。解密器差异很大,它们包含的功能如下表所示:

      几个编译器——可以使用 Go 和 C++ 模块完成相同的 AES256 CBC 解密;

      自动运行的白名单启动器的复制 -WerFault - 将启动器映射到进程地址空间;

      数字证书 ——15 个文件使用“Fast Invest” 证书签名,我们没有观察到任何用它签名的合法文件

      修复 ntdll.dll 的日志记录导出——为了更加隐蔽,Go dropper 将与日志记录相关的 API 函数(如 EtwEventWriteFull)修复到具有空功能的自地址空间中;

      在事件日志中保留 shellcode——这是攻击者的主要创新,使用 next stager 加密的 shellcode 被分成 8 KB 的block并保存在事件日志的二进制部分中;

      C2网络域名仿真-攻击者使用标题注册ERP网络域名;

      这层感染链解密、映射到内存并启动代码。本文我们将仅介绍 Cobalt Strike 的 Go 解密启动器。

      主包中的函数名称混淆,Main.Init创建与事件 log.dll 和 ntdll.Decoding Windows API 函数名(WriteProcessMemory和其他功能)有关的内核32。每个二进制文件中的名称使用basic64编码4次。使用WriteProcessMemory使用"xor rax, rax; ret"的滴定器将下列函数存储在内: EtwNotificationRegister, EtwEventRegister, EtwEventWriteFull, EtwEventWriteFull, EtwEventWrite。

      在内地。 一开始,恶意软件会检查主机是否在域内,只有当事实是真的时才有效。然后动态分析上述函数的地址。下一个共享者使用AES256(CBC模式)加密,键和IV使用Base64编码。

      使用这种方法,研究人员需要编写一些脚本来收集下一个模块的加密部分。解密后,要获得最终的可移植可执行文件,还需进一步转换数据。


      最后的共享者类型

      最后的级调器有两个通信机制:一个使用RC4加密的HTTP通信机制和一个使用命名管道的非加密通信机制。后者技术上能够与任何可视的网络外部主机进行通信,但是在Windows环境中,命名管道基于SMB协议,它几乎不开放给外部网络。因此,这些模块很可能用于侧面运动。


      在引入恶意软件套件之后,我们现在将描述感染链,研究者使用Cobalt Strike渗透测试套件注射Dropper。


      在DLL中使用Dropper实现命令劫持

      研究人员从 wrapper-dropper 动态库开始自定义模块分析。此代码被注入到诸如 explorer.exe 之类的 Windows 进程中。在进入启动过程的虚拟地址空间后,在其单个入口点,dropper删除以前的共享者或执行者创建的文件。

      首先,该模块将原始合法的操作系统错误处理器VerFault复制到C:WindowsTasks。然后,它将加密的二进制资源放在同一个目录中的aswer.In dll文件中,执行典型的DLL命令劫持.为了持久化,该模块设置新创建的WerFault自动运行,在Software MicrosoftWindowsCurrentVersionRun Windows系统注册分支中创建一个Windows问题报告值。


      dropper 不仅将启动器放在磁盘上进行侧载,而且还会将带有 shellcode 的信息消息写入现有的 Windows KMS 事件日志。

      Thewer deleted.dll是一个载体,如果shellcode不在Windows事件日志中隐藏,它不会伤害你。事件日志中的滴标搜索类别为0x4142(ASCII中的AB),并将关键管理服务记录为源代码。如果没有找到,ReportEvent() Windows API函数(lpRawData参数)将8KB的shellcode块写入信息记录消息中。从1423年开始,创建的事件ID将自动增加。


      你是谁?

      这个启动器,由第一个股东在任务目录中配置,它代表所有DLL调用,并将其输出到原来的法律图书馆。在入口点,一个单独的线程将所有上述 8KB 片段组合成一个完整的 shellcode 并运行它。所有这些代码都使用由合法版本的WerFault创建的相同的虚拟地址空间。

      为了防止WerFault继续处理错误,DLL使用典型的Blackbone trampoline repair booter入口点

      防止合法的黑客被处决的方法是新颖的.在主线程中,Who are you?dll找到它的入口点,并用简单的功能修复它。上面的Screenshot中WaitAndExit()只使用日志收集线程ID来呼叫WaitForSingleObject(),然后退出,这意味着真正的WerFault错误处理代码永远不会执行:一个欺骗性的DLL映射到其地址空间将阻止它。


      Windows事件日志中的 Shellcode

      该启动器控制到集合中发送的shellcode的第一个字符串。 本文为下一个函数编制了三个参数:

      下一个stager木马的地址,它也包含在从事件日志中提取的数据中;

      导出函数名称是该记录中载入的标准ROR13 哈希 (0xE124D840);

      字符串"dave"和常数"4"的地址,是导数函数的参数,可以通过 Hash 找到;

      对下一个Windows可移植执行文件进行分析,以确定其输入点是非常典型的。为了使下一位管理员的马不再可见,攻击者在标题中清除了“MZ”魔法。到木头入口处拨号后,shellcode 也搜索和输入请求,并呼叫它们。


      除了搜索输入点和呼叫它之外,shellcode还对树进行硬编码的入侵搜索,并使用参数dave和4来运行找到的功能


      HTTP木马

      与以前的辅助模块相比,为最后的督导,我们将详细解释。C++模块清楚地使用SilentBreak(现在是NetSPI)的Throwback公共存储库中的代码:一个基于XOR的加密函数,一些原始文件名称的例子,例如, ThrowbackDLL.etc.等。让我们从上面提到的 Load() 导数函数开始。类似于上面的WerFault补丁(函数在主树马线程上等待),但它忽略了任何参数,因此,"dave"和"4"不使用。这个启动器可能支持比这个模块更多的模块。


      目标搜索

      该模块使用单位XOR键解密C2域,在此示例中,只有一个域 eleed[.]online。马能处理很多,与|字符分开并加密.为了通过正常HTTP进行进一步通信,"Mozilla 5".C2的随机选择在"0"集合中。

      恶意软件通过收集下列信息生成一个跟踪字符串,也由|分开:

      1.SOFTWAREMicrosoftCryptography 中 MachineGUID 的值;

      2.计算机名称;

      3.使用从GetAdaptersInfo获取的本地IP地址;

      4.架构(x86或x64);

      5.操作系统版本;

      当前进程是否具有SeDebugPrivilege;

      跟踪标识符也将是“1.1”连接到字符串(可能是一个恶意软件版本)和当前配置的睡眠时间。

      与C2加密HTTP通信

      在HTTP通信之前,该模块使用硬编码的32字节长的RC4密钥发送空(但仍然加密)的ICMP数据包来检查连接。与任何其他字符串一样,此密钥使用基于Throwback xor的算法加密。

      如果一个带有80个 ping端口的控制服务器成功,上面的跟踪数据将发送到该控制服务器。 作为回应,C2共享树主循环的加密命令。


      木马命令

      代码的命令功能

      0 - 重新跟踪和识别目标;

      1.执行命令,木马在新的进程中执行收到的命令,并将结果发送回C2;

      2.从URL下载并保存到指定路径;

      3 – 设置一个新的睡眠时间,如果C2没有响应执行的命令,使用这个时间(在分钟内)作为加班时间。 随机化公式是(0.9-1.1)*睡眠时间;

      4 - 指定的睡眠分钟数,无需更改配置.

      5 - 列出与PID 、 路径 、 所有者 、 名称和父数据的进程;

      6 – 插入shellcode并将其运行到目标进程的地址空间中。要注入同一个进程,命令参数应该是“本地”。如事件日志中的shellcode,该代码将运行提供 PE 的输入点以及通过 Hash 找到的特定输出。

      99 - 马与C2之间的会议终止。

      本次活动中使用的另一个木马是基于管道命名的,这样命令系统更有意义,包括特权升级、截图、非活动时间测量等。继续使用另一种最后stager的木马类型,发现它被注入到了像edge.exe这样的进程中。


      基于管道命名的木马

      木马的位置是C:Windowsapds.dll,具有相同名称的原始合法 Microsoft 帮助数据服务模块库位于 C:WindowsSystem32 中。木马的主要工作周期是单线.恶意软件也输出一个负载()函数,它的唯一目的是等待一个工作线程,这是一个典型的活动模块。

      首先,木头主线获得原始apds.DLL的输出,并将它保存到记忆中一个新的缓冲区,该缓冲区被分配到木马图像之后。然后,木材将编辑它自提取的功能数据,所以它可以通过下面精心制作的root.DLL输出调用原始apds,地址来自真正的apds。 dll分析的地址是:

      这个 trampoline代码来自Blackbone Windows内存(remotemmemory::BuildTrampoline函数)。DLL黑客不是新事物,我们已经多次看到,这种技术被用来代表合法的功能,然而,使用短存储根重新创建自我导引并调用原始合法函数是罕见的。然后,该模块创建了一个名为MonolithPipe的管道,这是一个双用管道。并进入它的主循环。


      工作周期

      完成上述操作后,该模块使用架构和Windows版本信息来跟踪和识别主机。它还使用上述的罕见常数来初始化一个随机11位ASCII字符串。例如,这里是init_keys函数。结果被当作唯一的对话ID。

      恶意软件连接到443端口的硬编码区域( https://opswat[.] info:443),然后向C2end.php发送一个 POST请求。HTTPS连接选项设置为从服务器端接受自签名证书。在本例中,C2通信使用Dhga(81K1!392.43

      0——将“continue”标志设置为 False 并停止工作;

      1 - 如 目前 情况, 不予 提供 ;

      2 - 从最后的用户输入(在分钟内)取得时间;

      获取当前进程信息: PID 、 架构 、 用户 、 路径等;

      4 - 获取主机域名和用户帐户;

      5. 使用 提供 的 证书 模拟 用户 ;

      6 - 获取当前进程的可用权限;

      7.使用cmd解释器执行命令;

      8 - 使用原始的TCP接口测试与指定的主机连接(地址和端口);

      9 – 获取正在运行的进程信息:路径、所有者、名称、父进程、PID等;

      10——使用提供的 ID 的进程令牌模拟用户;

      11 - 列出目录中的文件;

      12 - 屏幕剪辑;

      13 - 将内容写入文件中;

      14 - 阅读 文件 内容 ;

      15——删除文件;

      16 – 提供代码被注入一个具有指定名称的进程中。

      17 – 在C2上运行shellcode;

      研究人员现在介绍了该活动的三个方面,有趣的是,研究人员观察到,木马具有上面表所示的完整的指令集,但仍使用rc4加密的HTTP和C2通信,而不是指定管道。最后一个 steward的例子看起来像一个模块化平台,攻击者可以根据其当前需要组合其功能。


      基础设施


      研究人员认为这些代码是自定义的(木马、包装器),与以前已知的活动或以前注册的SilentBreak工具集模块没有相似之处。现在研究人员不愿意给这个活动命名,而是坚持只用“SilentBreak”。

      参考和来源: https://securelist.com/a-new-secret-stash-for-fileless-malware/106393/

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类