方程组黑客使用的DanderSpritz后渗透框架详解

方程组黑客使用的DanderSpritz后渗透框架详解

方程式黑客组织(Equation Group)简介

方程组,被列为先进的持续威胁组织(APT),是一个非常复杂的威胁,男主角疑似被捆绑到特定入侵行动办公室的的(TAO)单位美国 国家安全局(NSA)。卡巴斯基实验室将他们描述为世界上最复杂的网络攻击组织之一,也是“我们见过的最先进的……”,与创建者并肩作战,但始终处于优势地位的Stuxnet病毒和火焰。他们的大部分目标都在伊朗,俄罗斯、巴基斯坦、阿富汗、印度、叙利亚和马里。

该名称源于该组织广泛使用加密技术。到 2015 年,卡巴斯基记录了该组织在至少 42 个国家/地区感染了500 次恶意软件,同时承认由于其自终止协议,实际数量可能达到数万次。

2017 年,维基解密发表了在中央情报局内部举行的关于如何识别该组织的讨论。一位评论者写道,“报告中标记的方程式组与特定组无关,而是与用于黑客攻击的工具集合有关”。

关于APT的更多详情可参考如下文章

背景

今年早些时候,Check Point Research 发布了“Jian”的故事——中国威胁演员 APT31 使用的一种漏洞利用,其“深受”方程式组织使用的几乎相同漏洞的“启发”,该漏洞因影子经纪人泄漏而广为人知。这个故事的关键部分是,Jian 一直在野外漫游,并在它很酷之前滥用方程组的独创性来破坏系统——早在 2014 年,也就是影子经纪人泄漏使原始漏洞公开的整整两年前。显然,Jian 的作者通过其他方式获得了早期访问权限。

虽然这一发现无疑为已经复杂的事情增添了一丝偏执,但我们仍然有一些自己的问题。这些问题中最主要的问题是,“为什么那个小金块在事实发生整整 4 年后仍然躺在那里让我们找到?”。在信息安全方面,4年是永恒的。如果我们挖得足够深,我们还能找到什么?俄罗斯人在 2013 年真的可以使用这些工具吗?2006年的伊朗人?公元前700年的巴比伦人?

首先,我们很高兴地说答案是否定的(可能)。我们能说的最好的一点是,APT31 对泄露漏洞的明显早期访问是例外,而不是规则。这使得标题不那么令人兴奋,但应该可以帮助我们所有人在晚上睡得更好。在我们的研究中,我们梳理了 DanderSpritz 框架——这是“Lost in Translation”泄漏的一个主要部分——在令人痛苦的技术细节中;我们在此展示我们的发现,重点介绍其DoubleFeature日志记录工具,该工具为框架的其余部分提供了独特的视角。

什么是 DanderSpritz?

DanderSpritz 是Equation Group 使用的功能齐全的后渗透框架。该框架通常是在利用机器并部署 PeddleCheap“植入物”后利用的。DanderSpritz 是非常模块化的,包含用于持久性、侦察、横向移动、绕过防病毒引擎和其他此类可疑活动的各种工具。它于 2017 年 4 月 14 日被影子经纪人泄露 ,作为“迷失翻译”泄露事件的一部分。

DanderSpritz 结构和执行流程

可以发现 DanderSpritz 逻辑在“Lost in Translation”泄漏的目录树中被有效地分为两部分:

leak root
----(...)
----windows
--------bin 
--------exploits
--------fuzzbunch
--------implants
--------payloads
--------resources 
--------specials
--------touches
----(...)

DanderSpritz 的核心功能包含在文件中DszLpCore.exe,可以在windows/bin. 该框架的插件和复杂组件,包括我们稍后将详细讨论的 DoubleFeature,可以在 下找到windows/resourcesfuzzbunchimplants, 和下面的其他目录windows包含独立于 DanderSpritz 的模块,用于利用自身、控制受害者系统、初始数据收集等;这些都超出了本出版物的范围。

DanderSpritz 中的基本逻辑单元就是我们所说的“插件”。这些驻留在windows/resources; 大约有十几个,它们具有非常具体的目录结构,如下图所示(尽管其中一些子目录是可选的)。

下面还有一些其他目录windows\\resources不是插件(因此没有这种结构),而是包含各种辅助脚本(例如用于验证受害机器从属关系的验证脚本)。

plugin root
----aliases
----commands
----modules
--------descriptions
--------files-dsz
------------x86
----------------<module_name>
----------------<module_name>
----------------(...)
------------x64
----------------<module_name>
----------------<module_name>
----------------(...)
------------(...)
----payloads
--------descriptions
----pylp
----pyscripts
----scripts
----tools
----uploads
----version
  • AliasesCommands– 它们都包含分别声明支持“别名”和“命令”的 XML 文件,它们具有类似的功能。当 DanderSpritz 框架的用户发出一个 shell 命令(在这个词的一般意义上——就像一个 Bash 用户运行的方式一样lstop等等),DanderSpritz 将遍历每个插件,检查这些 XML 并验证它们是否声明对用户键入的 shell 命令的支持。如果命令出现在Aliases它下面,它将被简单地映射到一个现有的脚本;一个Command通常,在幕后,以某种方式调用插件的内部逻辑。这实际上意味着 DanderSpritz 的用户可以运行许多不同的 shell 命令来实现不同的结果,而不会意识到在幕后,同一个插件处理了所有这些请求的执行。在Commands(但不是Aliases)下,除了 XML 之外,还有一个 XSL 文件,它指定返回给 DanderSpritz 用户的命令输出的格式(XSL 是一种标记语言,用于指定 XML 数据的表示样式——它是将 XML 转换为 CSS是 HTML)。
  • Modules– 大多数插件逻辑都包含在这个目录中。从名称可以看出,该逻辑被进一步划分为更小的功能“模块”。该descriptions子目录包含一个 XML 文件,它是一种“清单”。它详细说明了应该在受害者机器和“LP”(“侦听哨”——攻击者控制的远程监控受害者的机器)上运行哪些脚本和二进制文件。它还列出了插件对其他模块的依赖、它的接口数据、它支持的计算架构以及它应该在受害机器上还是在 LP 上运行。一些插件还包含一个payloads具有类似功能的目录。
  • PyLp– 包含 XML 文件,用于格式化从受害者机器中泄露的传入信息。对于每种“消息类型”(一种泄露的信息),XML 指定一个 Python 脚本,用于格式化数据以方便显示。此格式化脚本驻留在PyScripts目录中。
  • PyScripts – 框架使用的所有杂项 Python 脚本都在此目录中。
  • Scripts – 该目录还包含杂项脚本,这些脚本是用一些重印记的脚本语言编写的,在 Python 崛起之前,这些脚本语言似乎可以合理使用。
  • Tools – 一揽子自包含材料(PE、DLL、脚本、JAR、文本文件等),作者认为他们宁愿按原样包含和调用这些材料。
  • Uploads – 由插件推送到受害者系统的独立二进制文件。
  • Version – 包含一个包含插件版本的 XML 文件。

下面我们详细介绍调用插件别名或命令时的典型控制流程。

  1. DanderSpritz 用户在 DanderSpritz 用户界面中键入一个 shell 命令,该命令在幕后使用该特定插件实现。
方程组黑客使用的DanderSpritz后渗透框架详解
图 1:  DanderSpritz 的用户界面及其 shell 命令。
  1. DanderSpritz 的主要逻辑遍历resources目录,一个接一个地查看插件目录。对于每个插件目录,DanderSpritz 查看aliases子目录和commands子目录,并仔细检查其中的 XML 文件,寻找与 shell 命令匹配的声明的导出功能。找到匹配项,并且匹配的 XML 元素指定插件pyscripts目录中的路径。
  2. DanderSpritz 计算调用脚本的完全限定路径(通过将匹配的 XML 元素中指定的路径附加到插件pyscripts目录的路径)并执行文件。这是显示调用的shell命令的用户界面的地方,插件可以说是正常运行的。(理想情况下,这个 Python 脚本只是 UI 和胶水,而与受害机器交互的核心功能驻留在一个单独的远程组件中;但是这个吸引人的抽象在DoubleFeature我们稍后将深入研究的插件中有所破坏。)
  3. 现在,攻击者可以随时盯着他们调用的工具的 UI。最终,他们可能希望通过此 UI 调用某些功能。根据选择的功能,Python UI 构造一个远程过程调用(取自 Python 内部的原始硬编码数据——这里没有 XML)。它将此 RPC 发送到受害机器上的 DanderSpritz 组件。受害者端的这个组件然后执行调用并返回结果。这样,RPC 就被用作 LP 上的组件访问的 API,以在受害机器上执行操作(例如收集屏幕截图或录制语音)。此 API 与这些操作在受害组件端实际实现的方式分离。
  4. RPC 返回攻击者所需的宝贵信息(或者可能只是一个简短的“完成的动作”)。Python UI 会查询插件PyLP目录中与结果消息类型匹配的XML 。这个 XML 指定了如何在 LP 端显示返回的信息,UI 也是如此。
方程组黑客使用的DanderSpritz后渗透框架详解
方程组黑客使用的DanderSpritz后渗透框架详解
图 2: 特定命令的 XML 文件(LP 和 Target)示例。

专注于双功能

为了更好地理解上述结构和流程,我们将研究重点放在了 DanderSpritz 的一个名为 Doublefeature(或Df简称)的组件上。根据它自己的内部文档,这个插件“生成关于可以部署在目标上的工具类型的日志和报告”;许多框架工具,在它们自己的内部文档中,令人不寒而栗地声称 DoubleFeature 是在受感染系统上确认它们存在的唯一方法。经过一段时间的停顿,我们认为至少这意味着 DoubleFeature 可以用作一种 Rosetta Stone,以更好地理解 DanderSpritz 模块和受其影响的系统。DoubleFeature 有效地,好吧,兼作携带 DanderSpritz 的受害机器的诊断工具——这是事件响应团队的白日梦。

方程组黑客使用的DanderSpritz后渗透框架详解
图 3:
strangeland.py 的 代码
指的是确认的唯一方法是使用 DF。

在一个完美的世界中,我们不需要解释有关 DoubleFeature 内部工作原理的任何内容。毕竟,我们刚刚完成了关于 DanderSpritz 插件一般如何在幕后工作的整个部分;DoubleFeature 就是这样一种插件;因此,上面关于返回值按照 XSL 规范格式化的 RPC 调用的所有内容都应该仍然成立——对吗?

不幸的是,由于 DoubleFeature 作为日志模块的独特功能,它收集了大量各种类型的数据。RPC 返回值和 XSL 标记不适合在这种规模上传输和显示信息。一个意想不到的角落用例出现了,专门为它创建了一个临时的解决方案,“一切都漂亮优雅的框架”的愿景被悄悄带到后院拍摄。这是一个与时间一样古老的故事。

方程组黑客使用的DanderSpritz后渗透框架详解
图 4:  DoubleFeature 主菜单

DoubleFeature 的PyScripts目录包含它的 Python UI 界面 ( doublefeature.py )——但是当攻击者从 UI 菜单中选择一个选项时,在幕后而不是简单地发出 RPC,脚本会变形一个“模板”DLL DoubleFeatureDll.dll.unfinalized,它驻留在插件的uploads目录。Python 调用AddResource.exe插件tools目录中的外部工具,将资源植入已编译的 DLL 中并使其准备好以新名称引爆:DoubleFeatureDll.dll.configured. 确切的命令运行是:

*local run -redirect  command "<g_dfconfiguretool> cmpf 6 1104 <configureddllpath> <g_dfrscfile>"*"

命令使用的标志解释如下。

  • c (compressed) – Zlib 压缩数据
  • m(munge) = 通过与伪随机字节异或来混淆资源。字节是通过运行 PRNG(一个32 位 LCG,如果你坚持)并使用执行时间戳作为种子生成的;为了允许恢复,种子被添加到混淆的资源中。
  • p (place) = 将资源放入自制程序资源目录(稍后会详细介绍)。
  • f (finalize) = 完成专有资源目录。
  • 6= 资源类型(在这种情况下,枚举值 6 转换为RT_STRING字符串表条目)
  • 1104 = 资源名称。

在主插件 DLL ** 被赋予这个新资源后,Python UI 使用 DanderSpritz dllloadshell 命令将其加载到受害机器上:

dllload -ordinal 1 -library <configuredDllPath> 

一旦受害者端的 DLL 完成运行并将报告写入受害者机器上的日志文件,Python UI 就会使用以下 DanderSpritz shell 命令将日志文件提取回攻击者机器:

foreground get <log_file_name> -name DFReport

虽然(如上所述)DanderSpritz 命令的大部分输出是根据 XSL 规范查看的,但 DoubleFeature 的输出太大且变化多端,因此这种方法不可行。相反,攻击者通常使用为此目的编写的专用程序查看日志文件 – DoubleFeatureReader.exe,该程序可以在插件tools目录中找到。

DoubleFeature 将其所有日志数据写入名为~yh56816.tmp;的调试日志文件。卡巴斯基 2015 年关于名为“EquationDrug”的远程访问工具的报告中介绍了这个工件(更多内容见下文)。此日志文件使用 AES 算法加密。除非用户手动更改密钥,否则使用的默认密钥是badc0deb33ff00d(可能是为了不顾素食开发人员)。

DoubleFeature 的主 DLL

当修补的 DLL ( DoubleFeatureDll.dll.configured) 首次加载到受害机器上时,它会在自制软件资源目录中查找名为“106”的资源。该目录位于实际代码之后的“.text”部分,DLL 能够通过搜索不同的魔法值来找到它。homebrew 资源目录具有以下结构:

**Resource_Directory_struct**:
    word word_0
    word num_of_resources
    Resource_data[] resource_array
  dword resource_directory_size
  dword magic_hash
**Resource_data**:
    word resource_type
    word resource_num
    dword offset_from_directory_start
    dword resource_size

该资源(不同于之前通过调用嫁接到 DLL 的资源AddResource.exe)是静态加密的,为了使用,必须对其进行解密和解压缩。(相当于 Python 的)逻辑如下。

def decrypt_decompress_resource(buf, seed):
    output = bytearray(b'')
    for i in range(len(buf)):
        seed = (0xDD483B8F - (0x6033A96D * seed) % (2**32)) % (2**32)
        cur_xor_key = seed >> 8
        output.append((cur_xor_key & 0xff) ^ (buf[i] & 0xff))
  uncompressed_resource = zlib.decompress(output[4:])
    return uncompressed_resource 

资源 106 解压缩后,是一个名为hidsvc.sys的驱动程序它通过调用 CVE-2017-0005 的 EpMe 漏洞加载到内核中(这与它的逻辑以某种方式进入 Jan 漏洞的漏洞完全相同)。加载驱动程序后,DLL 开始使用DeviceIoControls与其通信。驱动程序支持的最有趣的 IOControlCode 是 0x85892408,它允许用户模式代码通过简单地指定函数名称和参数来直接调用内核函数。驱动程序希望使用此代码的传入消息与以下结构捆绑在一起:

**ControlCode_input_buffer**:
    dword export_func_hash
    dword num_of_arguments_bufs
    dword [0x20*num] arguments_buf

鉴于此控制代码的目的,大多数参数都是不言自明的。需要解释的一个细节是export_func_hash– 函数名称没有显式传递,而是它的校验和。接收到结构体后,驱动程序迭代每个导出的函数ntoskernl.exe计算结果校验和并将结果与​​提供的export_func_hash. 一旦找到匹配项,驱动程序就会得出结论,它已找到正确的函数。这是混淆 API 调用的标准方法,在许多其他恶意软件中都可以看到。

校验和计算逻辑可以在下面看到:

def checksum(name, len):
    val = 0
    for i in range(1, len+1):
        temp = (0x1A6B8613 * i) % (2**32)
        val = val ^ (temp * ord(name[i-1]) % (2**32))
    return val

一些示例校验和值:

ZwQueryInformationProcess    0x62A0A841
ZwQueryObject                0xB7241E54
ZwOpenEvent                  0xDE2837FA
ZwSetEvent                   0x662E22E1
ZwOpenKey                    0xA20F6388
ZwFsControlFile              0x407CC9F5
ZwQueryVolumeInformationFile 0x161C4B69
ZwQueryInformationFile       0xC0E4A30A
ZwSetInformationFile         0x535ACCEA
ZwReadFile                   0xB8075119
ZwWriteFile                  0xBAE70F4B
ZwClose                      0x69023181
ZwCreateFile                 0x01862336
ZwQueryDirectoryFile         0x41483801
ZwQuerySystemInformation     0x178B07C8
ZwCreateKey                  0x01862336
ZwDeleteKey                  0x2C9F7CA8
ZwQueryKey                   0xBDD598E2
ZwEnumerateKey               0x8D3E3E7A
ZwSetValueKey                0x90A71127
ZwEnumerateValueKey          0x040F9817
ZwQueryValueKey              0xF655B34B
ZwDeleteValueKey             0x2A1BF746
ZwWaitForSingleObject        0x86324d14

这并不是 DoubleFeature(和其他方程式组工具)让取证分析人员生活困难的唯一方面。在DoubleFeature使用的字符串被解密-单独很标准-但他们的按需每功能,这是比平常稍微更令人沮丧的解密,它们重新加密一次函数执行完成,这是很多比平常更令人沮丧. DoubleFeature 还支持其他混淆方法,例如简单的替换密码:

def deobfuscate_strings(enc_strings):
    for enc_string in enc_strings:
        replace_buffer = [ 0x37, 0x3B, 0x5D, 0x4B, 0x45, 0x44, 0x3C, 0x5C, 0x7B, 0x4F,
          0x74, 0x41, 0x7D, 0x7E, 0x35, 0x46, 0x23, 0x2B, 0x72, 0x71,
          0x40, 0x78, 0x4C, 0x55, 0x39, 0x56, 0x30, 0x5F, 0x50, 0x2C,
          0x29, 0x2D, 0x79, 0x59, 0x3A, 0x57, 0x53, 0x69, 0x77, 0x63,
          0x26, 0x70, 0x2A, 0x76, 0x60, 0x3D, 0x33, 0x31, 0x22, 0x47,
          0x49, 0x4E, 0x75, 0x58, 0x34, 0x68, 0x6B, 0x20, 0x67, 0x32,
          0x27, 0x65, 0x51, 0x28, 0x5B, 0x2E, 0x7C, 0x6F, 0x24, 0x4A,
          0x3E, 0x64, 0x73, 0x6D, 0x7A, 0x3F, 0x6A, 0x54, 0x62, 0x42,
          0x6C, 0x48, 0x2F, 0x25, 0x43, 0x52, 0x21, 0x66, 0x38, 0x5A,
          0x61, 0x5E, 0x36, 0x4D, 0x6E, 0x00]
        
        dec_string = ''
        for i in range(len(enc_string)):
            cur_place = ord(enc_string[i]) - 0x20
            dec_string += chr (replace_b
uffer[cur_place])
        print(dec_string)

以及基于简单自制线性 PRNG 的流密码:

def decrypt(seed, buffer, mask, first_hex_seed, second_hex_seed):
    outut = ''
    for i in range(len(buffer)):
        seed = (((first_hex_seed * seed) % (2 ** 32)) + second_hex_seed) % (2 ** 32)
        cur_xor_key = ((seed >> 16)) | mask
        output += chr ((cur_xor_key & 0xff) ^ buffer[i])
    return output

如上所述,凭借其功能,DoubleFeature 是与方程式组工具相关的独特知识来源——毕竟,整个日志记录模块依赖于在受害系统上查询这些工具并验证哪些工具存在的能力。下面我们列出了日志模块探测到的一些工具,其中一些是未知的。

除了在 DLL 的执行流程中积极使用的资源 106 和 1104 外,主 DLL 的自制程序资源目录还包含以下资源:

  • 资源 1004 – UnitedRake 重新启动 DLL。
  • 资源 1005 – UnitedRake 关闭 DLL。
  • 资源 1006 – StraitBiZarre 重新启动 DLL。
  • 资源 200 – 与 BCD 分区数据进行比较的已知引导管理器的哈希值。
  • 资源 1007 – 升级 KillSuit 模块 DLL – 在代码中可以找到对它的引用,但在目录中不再物理找到它。可能它存在于 DLL 的早期版本中,后来被删除。

DoubleFeature 监控的插件

UnitedRake

UnitedRake (UR) 是一种远程访问工具,可用于针对 Windows 机器。它是一个可扩展的模块化框架,提供了大量执行不同信息收集功能的插件。这是卡巴斯基在其原始报告中称为“EquationDrug”的工具,该报告是在 Shadow Brokers 泄密之前发布的。泄漏还包括 UnitedRake 手册,其中包含该工具的配置、命令和模块。DoubleFeature 支持许多与 UnitedRake 相关的管理功能,例如 Shutdown、TipOff、KickStart 和启用/禁用日志记录。

我们遇到了以下 UnitedRake 指标:

  • MSNDSRV.sys – 内核模式阶段 0 和 rootkit。实现用于过滤网络流量的 NDIS 驱动程序。直到 UR 4.0 版。
  • ATMDKDRV.sys – 网络嗅探器/修补程序。从 UR 4.1 版开始。
  • “ Software\Classes\CLSID\{091FD378-422D-A36E-8487-83B57ADD2109}\TypeLib ”或“ \Registry\Machine\SOFTWARE\Classes\CLSID\{091FD378-422D-A36E-8487-8487-83B57ADD2109}\TypeLib ”包含UR 的 GUID,特殊键注册表键。
  • “ \Registry\Machine\System\CurrentControlSet\Control\Session Manager\MemSubSys\{95FFB832-8B00-6E10-444B-DC67CAE0118A-F6D58114} ”——KillSuit 记录数据相关的注册表项。
  • “ Global\64322D88-0CEA-4ce0-8562-67345B70C655 ”——在 TipOff 命令中创建的文件映射。
  • “*Global\*6F27089A-3482-4109-8F5B-CB3143A1AB9A”和“*Global\*667FBF02-F406-4C0A-BA65-893747A0D372”——在 UR 关闭时创建的事件。
  • {A0CCDC61-7623-A425-7002-DB81F353945F-5A8ECFAD} – UnitedRake 3/4 配置数据和传输信息 CLSID
  • {30F3976F-90F0-B438-D324-07E031C7507E-981BE0DD} – UnitedRake 插件信息 CLSID
  • {95FFB832-8B00-6E10-444B-DC67CAE0118A-F6D58114} – UnitedRake 记录数据 CLSID
  • {01C482BA-BD31-4874-A08B-A93EA5BCE511} – UnitedRake 的互斥锁名称。

StraitBizarre

StraitBizarre (SBZ) 是一种用于隐秘数据泄露的植入物,它通过FriezeRamp执行——一种类似于 IPSEC 的自定义网络协议。这是一个跨平台的项目,不同的版本存在支持Windows,Linux和移动平台(如DROPOUTJEEP为iPhone,甚至还有TOTEGHOSTLY为Windows Mobile)。

方程组黑客使用的DanderSpritz后渗透框架详解
图 5:  StraitBizzare 信息。
来源:镜子

我们在 DoubleFeature 中发现了以下 StraitBizarre 指标:

{1B8C5912-8BE4-11D1-B8D3-F5B42019CAED} – GUID、版本和特殊状态键的 SBZ CLSID。

KillSuit

KillSuit (KiSu)(卡巴斯基原始报告中的“GrayFish”)是一个不寻常的插件,一旦部署在受害机器上,它的整个任务就是运行其他插件,为持久性和规避提供框架。一些(不是全部)DanderSpritz 插件可以单独运行,也可以通过 KillSuit 调用。它的设计使得在受害者端运行的每个 KillSuit 实例都可以托管一个工具(例如下面的 MistyVeal);因此,很容易发生受害者机器上安装了多个 KillSuit 实例,每个实例都托管不同的后利用工具。每个 KillSuit 实例的数据,包括其所有模块,都在注册表项中保持加密。这是 KillSuit 独有的功能,通常不是 DanderSpritz 插件的功能。

DoubleFeature 记录了大量与 KillSuit 相关的数据。实际上,DoubleFeature 内部也有一些死代码,允许删除、升级和推送模块更新到运行的 KillSuit 实例中(我们同意弃用此代码的决定;毕竟,DoubleFeature 应该用于日志记录,而我们’很快就会在它所属的 KillSuit Python UI 中看到此功能)。虽然“KillSuit”是在 DoubleFeature 内部和攻击者实际调用的外层 DanderSpritz CLI 中使用的名称,但实际上内部使用的 Plugin 文件夹名称是 DecibalMinute(简称 DeMi)。Python UI 逻辑主要可以在 3 个脚本中找到,不出所料,它们驻留在插件pyscripts目录中。

  • “ Mcl_Cmd_DiBa_Tasking.py ” – 处理 KiSu 安装、卸载和升级。作为参数,此脚本接受要使用的持久性机制的类型;有 4 种类型的持久性,有用地命名为“默认”、“启动器”、“SoTi”和“JuVi”。我们将在下面进一步详细说明它们的内部工作原理。在幕后,Python UI 通过 RPC 调用 (RPC_INFO_INSTALL) 实现这一点。
  • “ Mcl_Cmd_KisuComms_Tasking.py ” – 用于与受害者端正在运行的 KillSuit 实例建立连接,并提供动态加载和卸载模块/驱动程序的功能。
  • “ _KiSu_BH_enable.py ” – KillSuit 的内部驱动程序之一称为“BroughtHotShot”,简称 BH。这个脚本里没有启用它,但检查其是否被启用(通过DanderSpritz命令available -command kisu_install -isloadedavailable -command kisu_install -load)。如果要启用驱动程序,则需要执行KiSu_BH_enable.py on,禁用它是KiSu_BH_enable.py off
  • “ Mcl_Cmd_KiSuFullList_Tasking.py ” – 生成目标机器上当前 KiSu 安装的列表。在幕后,这是通过调用kisu_listDanderSpritz 命令完成的,然后对于每个返回的安装,通过 DanderSpritz 命令检索其配置kisu_config -instance id -checksum。此配置包含各种技术细节,例如 KillSuit 版本、安装的注册表项和值、内核和用户模块的加载程序、用于保存托管插件模块的加密虚拟文件系统的目录、已被安装的合法驱动程序通过将托管插件注入其中,以及在受害者上启动 KillSuit 时内部使用的标志而受害。

每个 KillSuit 实例都有一个内部记录,其中包含该实例内托管的工具的“ID”,每个工具的 ID 都是相同的。我们发现 DoubleFeature 内部引用了以下可能的实例:

  • PC (PeddleCheap) – 0x7A43E1FA – 提供交互式外壳和一些长期持久性的功能。本身也可用作后利用工具,并且可以在受感染的主机上安装其他 KillSuit 实例。
  • UR (UnitedRake) – 0x91FD378 – 见上
  • STLA (StrangeLand) / GROK – 0x1A0F5582 – 这些都是键盘记录器。它们的加密日志存储在名称为tm154*.da.
  • SNUN (SnuffleUnicorn) – 0x23A4732A
  • WRWA (WraithWrath) – 0x502BB710
  • SLSH (SleepySheriff) – 0x32A7032D
  • WORA (WoozyRamble) – 0x68A40E49
  • TTSU (倾斜海啸) – 0x8F1D6511
  • SOKN (SoberKnave) – 0x8F1D6510 – 该工具具有通过未使用/禁用的 WiFi 卡进行数据泄露的功能。它用于气隙目标。
  • MAGR (MagicGrain) – 0x437E52E8
  • DODA (DoubleDare) – 0x1C9D4A8A
  • SAAN (SavageAngel) – 0x9D801C63
  • MOAN (MorbidAngel) – 0x9D801C62
  • DEWH (DementiaWheel) – 0xAE37690B – 黑客工具也被称为“Fanny”
  • CHMU (ChinMusic) – 0x39B2DA17
  • MAMO (MagicMonkey) – 0x2D473AB3
  • MABE (MagicBean) – 0x8675309 – 用于中间人的 WiFi

DiveBar

DiveBarDiBa)是DoubleFeature对负责持久化方法(如“KSLA”(KillSuit loader)、“SolarTime”、“JustVisiting”和“DoctorOcopus”)的部分KillSuit的名称。

我们上面提到的不同的持久化方法是:

  • KSLA(启动器)——只需在受害系统上安装一个新的驱动程序并将其用于持久性。这一直有效,直到 Microsoft 引入驱动程序签名强制 (DSE),它不允许运行未签名的驱动程序。Windows Vista 及更高版本不支持此方法。
  • JustVisiting (JuVi) – 为了绕过 DSE,这种持久性机制滥用了签名驱动程序 ElbyCDIO.sys 中的一个已知漏洞,该漏洞是 RedFox 软件“CloneCD”的一部分。在系统启动时加载和利用易受攻击的驱动程序。以这种方式获得的提升的权限然后用于将 DiveBar 的持久化驱动程序添加到 LSAExtensionConfig/interfaces。此方法仅适用于 Windows 8。
  • SolarTime (SoTi) – 一种高级持久性机制,通过修改受害系统的一个 VBR 来工作。有关此方法的更多详细信息,请参阅F-Secure 的这份报告。仅与具有 FVEBOOT 和特定引导扇区格式的 NTFS 文件系统兼容。SoTi 将引导扇区的哈希与下面列出的“已知良好”哈希列表进行比较。
C454045E1299C5AD5E2932A7B0016D7A
C1544A2220F5DD61A62C697D9A2C5B77
05422319E7821018401 F477B3621F8E2
4C85F9D2D0B02E0B3BDFC34D0F63B414
0023DE8F74BF9F932AFC9E288082E660
58B9130DEEFF83F1185C372595CD4607
B4A78F824A7F0FA688DF729F2AEF7F7F
DCE6AAAD1574BC72A25DC4551D52A2C1

如上所述,KillSuit 在受害者注册表中保存了一个叫做“模块存储”的东西。传统上,根据注册表的合法目的,恶意软件使用注册表来存储简单的配置数据;但随着时间的流逝,越来越多的恶意软件大胆地使用注册表来存储任意数据。在这里,注册表被用来吞下包含模块存储的整个虚拟文件系统,它是通过连接从两个硬编码字典中伪随机选择的两个单词生成的(受害者根目录的创建时间用作种子)。第一个单词的可能值列表复制如下:

Account
Acct
Adapter
App
Audit
Boot
Class
Correction
Debug
Dir
Directory
Domain
Driver
Event
Font
Hardware
Hiber
Host
Language
Legacy
Locale
Logon
Manufacturer
Media
Net
Network
OEM
Power
Prefetch
Privilege
Process
Remote
Scheduler
Security
Server
Shared
Shutdown
Startup
Task
Trust
Uninstall
User
Win16
Win32

以及第二个单词的可能值:

Cache
Cfg
Config
Data
Database
Db
Exts
Flags
Hierarchy
History
Info
Libs
List
Logs
Mappings
Maps
Mgmt
Mon
Monitor
Performance
Plugins
Policy
Profile
Records
Registry
Settings
Setup
Support
Usage

看看卡巴斯基报道的“GrayFish”的架构,我们留下的印象是它和KillSuit一样:

方程组黑客使用的DanderSpritz后渗透框架详解
图 6:  GrayFish 的架构。
资料来源:卡巴斯基

图中资源与DiveBar资源一一对应:

102 – fvexpy.sys – F7F382A0C610177431B27B93C4C87AC1

103 – mpdkg32.dll – 0182DBF3E594581A87992F80C762C099

104 – BroughtHotShot 驱动程序 – drmkflt.sys – 9C6D1ED1F5E22BF609BCF5CA6E587DEC / D3DF8781249F2C404C4935CA9FFB1155

107 – 新的 VBR(用于 SolarTime)

110 – mpdkg64.dll – F01525C9EF763C49E28CEC6C2F6F6C60

114 – Elby 加载程序 – fhsvcapi.dll – 6156E50571571B233019C4EBB472899D

115 – 埃尔比驱动器 – AAA8999A169E39FB8B48AE49CD6AC30A

DiveBar 不限于滥用 ElbyCDIO.sys;它还搜索受害者机器上已经存在的易受攻击的良性驱动程序,以用作托管插件代码的“启动器”。在内部,这种被 DiveBar 选择来启动 KillSuit 实例的良性驱动程序被称为“thunk”(这里可能要提一下,根据 Merriam-Webster 词典,“thunk”一词的唯一含义是作为现在时动词的意思是“产生平坦的空心声音”;原始 PE 文件格式的作者使用这个神秘的词作为不透明数字对象的描述已经造成了足够的痛苦,我们很遗憾看到这种做法在这里重复) . 对于每个 KillSuit 实例,DoubleFeature 报告thunk被利用的dll用于加载其内核模式模块,简称KML(Kernel Module Launcher)。用户模式启动器 (UML) 也有类似的报告。

FlewAvenue

FlewAvenue (FlAv) 是一种 IPv4 驱动程序,可为其他工具提供隐蔽的网络访问。它提供了不同的网络功能,例如 DNS 查询和 ICMP 回显(“ping”)。

我们遇到了FlewAvenue的以下指标:

  • “ntevt.sys”——此工具驱动程序的名称。

DuneMessiah

DoubleFeature 诊断仅提供有关此工具的非常少的信息。对于此工具,DoubleFeature 报告受害机器上的实例在内部使用的伪随机生成的“事件名称”,以及一些“注册的 KillSuit 实例”。

CritterFrenzy

DoubleFeature 也仅报告有关此插件的最少信息。从DoubleFeature收集到的关于这个工具的信息来看,它似乎是KillSuit的另一个实例,可能是过去使用过的,ID为333。

我们遇到了以下 CritterFrenzy 指标:

  • “MPDKH32”——此工具的名称。

MistyVeal

MistyVeal (MV) 是一种“验证器”植入物,这意味着它用于验证目标系统确实是真正的受害者,而不是研究环境。它作为 Internet Explorer 浏览器助手对象实现(这些通常用于扩展 IE 功能;例如,Adobe 的 IE 的 Acrobat 插件就是一个浏览器助手对象)。MistyVeal 也是Equation Group 最初的“Double Fantasy”植入物的一部分,它是UnitedRake 的前身。您可以在EpicTurla的报告中阅读有关它的更多信息以及与 Regin 的联系

  • “netdlr.sys”——此工具驱动程序的名称。

我们遇到了 MistyVeal 的以下指标:

  • {B812789D-6FDF-97AB-834B-9F4376B2C8E1} – GUID 和版本的 MV CLSID。

DiceDealer

泄露的 UnitedRake 手册中提到的 DiceDealer (DD) 是 DiveBar 执行的所有安装和卸载所产生的日志数据的解析工具(这与 UnitedRake 相关,因为 DiveBar 通常用于安装它)。如果您想手动解析 DiceDealer 日志文件,最简单的方法是将日志文件复制到 DiceDealerReader 工具所在的同一目录中。读取器依赖于该目录中的几个文件,如果它们不存在,将无法解析日志。

PeddleCheap

PeddleCheap ****(PC) 是首批在受害机器上运行的工具之一,可用于引导完整的 DanderSpritz 安装。PeddleCheap 具有最少的功能,允许攻击者连接到受害机器并远程安装和配置允许进一步后利用功能的植入物,包括完整安装 DanderSpritz 框架。PeddleCheap 通常通过多种方法注入 lsass.exe,包括 DOUBLEPULSAR 后门。

方程组黑客使用的DanderSpritz后渗透框架详解
图 7:  PeddleCheap 用户界面。

我们遇到了 PeddleCheap 的以下指标:

  • {A682FEC0-333F-B16A-4EE6-24CC2BAF1185} – GUID 和版本的 PC CLSID。

DoubleFeature 的 Rootkit 控制流程

DoubleFeature ( hidsvc.sys)使用的 rootkit在加载时执行以下操作:

  • 它创建了一个未命名的设备对象,但注册了 IRP 调度函数。
  • 它分派 IOCTL 请求。
  • 它专门从事 Windows 内核代码的运行时修补。
  • 它为用户模式模块运行内核 API。

Rootkit 在加载到内存之前由用户模式 ​​DLL 修补——这样做是为了插入用户模式进程的 PID,以便 rootkit 知道要隐藏哪个进程。然后,rootkit 通过KeAttachProcess.

Rootkit 使用 HalAllocateCommonBuffer 或 MmIsAddressValid 查找 API 函数的动态地址(这些函数的地址是之前通过调用 MmGetSystemRoutineAddress 获得的)。它使用加密的堆栈字符串,这些字符串在需要使用的基础上解密,并在使用后立即再次加密,类似于我们之前描述的 DoubleFeature 用户模式组件中使用的方法。

为了避免被检测到,rootkit 还会尽可能隐秘地创建自己的驱动程序对象。首先,rootkit 不是直接创建对象,而是创建了 的句柄Device\\NULL,然后通过插入自己的名称为 的设备对象来劫持其 FileHandle driver\\msvss。然后,它使用此 FileObject 发送IRP_MJ_Create请求以获得新创建的驱动程序对象的句柄。其次,rootkit 调用ObMakeTemporaryObject并从其父对象管理器目录中删除对象的名称,有效地将其与操作系统内部用于跟踪加载的驱动程序的结构断开链接。由于 Windows 操作系统处理驱动程序的方式,这会导致驱动程序在后台运行,而诊断工具和研究人员将无法找到驱动程序。

新设备的 IRP_MJ_DEVICE_CONTROL 处理程序函数包含可以从用户模式 ​​DLL 发送的不同 IoControl 代码(例如 0x8589240c 用于截断文件,0x85892408 用于在内核模式下执行 API 调用并将输出发送回用户-模式过程)。

结论

有时,高级 APT 工具的世界和普通恶意软件的世界看起来就像两个平行的宇宙。网络犯罪分子会定期生产无数个 Cryptolocker 克隆,或者至多是另一个模块化的万能 Emotet 的崇拜者;与此同时,民族国家行为者倾向于秘密的、巨大的代码库,其中包含数十年来由于实际需要而培养的大量功能。对于我们这些对网络犯罪行业的下层区域有足够深入了解的人来说,上述许多功能——rootkit、用于彻底审查受害者的专用组件、专门用于记录后利用阶段的整个系统——在很大程度上都是抽象的理论. 网络犯罪行业的 DoubleFeature 通常是一个 HTTPGET请求,其中包含&OS=win10,由 RC4 的一些自制变体加密。差距真的不能夸大。

由于 Shadow Brokers 泄漏事件允许我们如此坦诚地了解这种复杂程度的工具,我们并不经常如此坦率地一瞥。世界上的 DanderSpritz 级项目自然被一层秘密覆盖——甚至,正如我们所看到的,来自其他 APT 演员,他们最多只能在蓝色月亮上获得一个竞争对手的工具,就像发生的那样与 EpRom 这导致了 Jan 的创建。作为一个行业,事实证明,我们也在慢慢咀嚼向我们揭示 DanderSpritz 的 4 年前的泄漏,并获得新的见解。在防御者方面,我们有责任仔细研究这些信息安全工程的奇迹并应用所吸取的经验教训——在较低级别的普通攻击者做同样的事情之前。

附录 1:DoubleFeature 主 DLL 支持的命令行参数表

选项参数菜单中的相关命令描述
-n/-m注册表项名称检查注册表项是否存在。
-o返回 DuneMessiah 信息
-p文件名更改日志文件名。
-q哈希、ID/名称删除 KillSuit 模块。
-s‘u’/’s’关闭 UnitedRake 或 StraitBizarre
-tIP、端口提示 UnitedRake
-u哈希、ID/名称升级 KillSuit 模块
-v哈希、ID/名称下载 KillSuit 模块
-x文件名截断受害者计算机上的文件
-gIP:端口检查 FlewAvenue 功能兼容性
-h‘u’/’s’在 UR 或 SBZ 停止 FA
-ik = KillSuit m = 手动实例 p = 进程信息 q = 模块数据 s = StraitBiZarre u = UnitedRake c= CritterFrenzy d = DiveBar e = 加载的驱动程序 f = FlewAvenue g = 特殊植入物 i = 植入物独立提供有关作为参数给出的工具的信息
-j0/1获取 DiceDealer 日志——受害者计算机上的 DiveBar 信息。
-k‘u’/’s’KickStarts UR 或 SBZ
-l查询在“i”命令中查询信息,但在一个命令上使用多个工具。
-f切换 FlewAvenue 模式——作为网络嗅探器或内存修补程序。它通过更改“config2”子密钥来实现。
-a新的 AES 密钥替换用于加密日志的 AES 密钥。
-b/-e注册表项删除 DiveBar 注册表项
-C
-don/off启用/禁用 UR 日志记录

from

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注