1.概述
2022年5月,安全公司Malwarebytes在可能用于针对约旦政府的一份武器化文件中新发现了一个名为“Saitama”的恶意软件样本。Saitama植入软件使用DNS隧道作为其唯一的命令和控制信道,并利用长时间睡眠和随机化(子)域名来逃避检测。这些特性使得即使植入程序不使用DNS over HTTPS(DoH)来加密其DNS查询,也难以通过流量检测到它。由于没有该植入程序的服务器端实现,分析人员难以对此类恶意流量的检测效果进行测试。
虽然某些入侵指标可用于追溯可能的感染,但分析人员更倾向(接近)实时地检测威胁。为了评估和调整现有的恶意流量检测覆盖范围,需要更详细地了解植入程序的内部工作原理。本文将使用Saitama植入来说明恶意DNS隧道如何建立,以及这种方式如何影响检测过程。
2.重建Saitama流量
从受害者机器的角度来看,Saitama植入程序的行为已经在其他地方得到了记录。然而,为了生成植入程序行为的完整记录,需要一个C2服务器来正确控制和指示植入程序。当然,植入程序的实际开发人员使用的C2服务器的源代码是无法使用的。
如果最终目标是实时检测恶意软件,则检测工作应侧重于植入程序产生流量的方式,而非流量发送到的特定域名。检测方法依据的是PCAP包,通俗来说,即“要么产生PCAP,要么就当什么也没发生”。因此,在构建检测时,本文没有依赖于假设,而是构建了Saitama的服务器端组件,以便能够生成PCAP。
从攻击者的角度来看,使用DNS作为C2通信的信道有一些好处,也有一些主要的缺点。虽然在许多环境中DNS确实相对不受限制,但协议本身并不是为传输大量数据而设计的。此外,DNS查询的缓存特点迫使植入程序必须确保发送的每个DNS查询都是唯一的,从而保证DNS查询能够到达C2服务器。
为此,Saitama植入程序依赖于对用于构造DNS查询的字符集的连续打乱。虽然这种打乱使得两个连续的DNS查询几乎不可能是相同的,但它需要服务器和客户端完全同步,以便它们以相同的方式打乱字符集(见图1)。
图1:服务器端与客户端打乱字母表采用相同的方式
在启动时,Saitama植入程序生成一个介于0和46655之间的随机数,并将其分配给一个计数器变量。客户端使用共享密钥(“haruto”用于此处讨论的变体)和共享初始字符集(“razupgnv2w01eos4t38h7yqidxmkljc6b9f5”),对该计数器进行编码,并通过DNS将其发送到C2服务器。然后将此计数器用作伪随机数发生器(PRNG)的种子。
为了对该计数器进行编码,植入程序依赖于名为“_IntToString”的函数(见图2)。此函数接收一个整数和一个“基本字符串”,对于第一个DNS查询,该字符串与上一段中标识的初始共享字符集相同。在整数变量等于或小于零之前,函数使用该整数变量从基本字符串中选择一个字符,并将其放置到变量“str”之前,将拼接后的字符串作为函数输出返回。在每次循环迭代结束时,输入数除以基串参数的长度,从而降低整数变量的值。
图2:用于将整数转换为编码字符串的函数
要确定初始种子,服务器必须执行此函数的逆运算,以将编码字符串转换回其原始数字。但是,在客户端转换过程中,由于此转换中的除法并未保留小数,可能会导致信息的丢失。服务器尝试使用简单的乘法来完成此转换的逆运算。因此,服务器可能会计算出一个不等于客户端发送的种子的数字,此时必须验证逆函数是否计算了正确的种子。如果不是这种情况,服务器会尝试更高的数字,直到找到正确的种子。
一旦克服了这个障碍,服务器端实现的其余部分就变得微不足道了。客户端将其当前计数器的值附加到发送到服务器的每个DNS查询。此计数器用作伪随机数发生器PRNG的种子。此PRNG用于将初始字符集打乱为新字符集,然后用于对客户端发送到服务器的数据进行编码。
因此,当服务器和客户端使用相同的种子(计数器变量)来生成伪随机数以打乱字符集时,会得到完全相同的字符集。这允许服务器和植入程序以相同的“语言”进行通信。然后,服务器简单地将打乱后的字母表中的字符替换回“基本”字母表,以获得客户端发送的数据。
3.植入程序规避检测的方法
许多C2框架允许攻击者手动设置植入程序的最小和最大睡眠时间。虽然较少的睡眠时间使攻击者能够更快地执行命令和接收输出,但较多的睡眠时间会在受害者网络中产生较少的噪声以规避检测。流量检测通常依赖于设定的一个阈值,可疑行为仅在特定时间内发生多次时才会触发警报。
Saitama植入程序使用硬编码睡眠值(见图3)。在通信期间(例如当它将命令输出返回到服务器时),最小睡眠时间为40秒,而最大睡眠时间为80秒。在发送的每个DNS查询中,客户端将选择40到80秒之间的随机值。此外,DNS查询并不是每次都发送到同一个域名,而是分布在三个域名中。在每个请求中,随机选择其中一个域名。植入程序无法在运行时改变睡眠时间,也无法完全“跳过”睡眠步骤。
图3: 植入程序的睡眠配置(整数表示以毫秒为单位的睡眠时间)
这些睡眠时间和通信分布阻碍了检测工作,因为它们允许植入程序进一步“融入”合法的网络流量。虽然对于经验丰富的研究人员来说,流量本身并不是正常的,但睡眠时间和分布使得捕获这种恶意流量无异于大海捞针。对于攻击者来说,选择睡眠时间值是在保持植入程序隐蔽性和可用性之间的平衡。对于Saitama的睡眠时间,由于每个单独的DNS查询只传输15字节的输出数据,故植入程序的可用性非常低。
图4:服务器实现和植入程序之间的传输
植入程序包含一组硬编码命令,这些命令只能使用一个命令代码触发,而不是将整个命令从服务器发送到客户端。然而,由于无法知道这些硬编码命令是否被攻击者使用,或者作为误导手段留在植入程序中,归因与溯源受到了严重阻碍。此外,这些硬编码命令的输出仍然必须以与任何其他发送命令相同的延迟发送回C2服务器。
4.检测DNS植入程序的方法
检测DNS隧道一直是研究的重点,因为这种技术可以以多种不同的方式实现。此外,通信信道的复杂性迫使攻击者制造更多噪音,因为他们必须通过非专用信道发送大量数据。虽然“空闲”植入程序可能很难检测到,因为很少通过有线介质进行通信,但任何DNS植入程序在开始接收命令和发送命令输出时都必须发出更多噪声。这些“突发”通信是可以更好地检测DNS隧道的地方。本节将举例说明检测Saitama的方法和实际上对手使用的一些常见工具。
(1)基于签名
在可能的情况下,本文的目标是编写基于签名的检测,因为这种检测方法提供了坚实的基础和快速的工具溯源。如前所述,Saitama植入程序使用的随机化域名使得基于特征的检测在这种情况下具有挑战性,但并非不可能。当主动传送命令输出时,Saitama植入程序生成大量随机DNS查询。这种随机化确实遵循一种特定的模式,可以用以下Suricata规则来概括:
alert dns $HOME_NET any -> any 53 (msg:"FOX-SRT - Trojan - Possible Saitama Exfil Pattern Observed"; flow:stateless; content:"|00 01 00 00 00 00 00 00|"; byte_test:1,>=,0x1c,0,relative; fast_pattern; byte_test:1,<=,0x1f,0,relative; dns_query; content:"."; content:"."; distance:1; content:!"."; distance:1; pcre:"/^(?=[0-9]+[a-z]\\|[a-z]+[0-9])[a-z0-9]{28,31}\\.[^.]+\\.[a-z]+$/"; threshold:type both,track by_src, count 50, seconds 3600;classtype:trojanActivity;priority:2;reference:url,https://github.com/fox-it/saitama-server metadata:ids suricata; sid:21004170; rev:1;)
此签名可能看起来有点复杂,但如果将其分解为单独的部分,则会变得相对直观。28-31个字符的选择基于包含输出的DNS查询的结构。首先,一个字节专用于“发送和接收”命令代码。然后跟随植入程序的编码ID,该ID可以占用1到3个字节。紧接其后是2个字节专用于输出数据的字节索引和20字节的base-32编码输出。最后,将发送“计数器”变量的当前值。由于该数字的范围在0到46656之间,因此需要1到5个字节。Suricata IDS 规则的内容匹配如下表所示:
内容匹配 | 行为 |
00 01 00 00 00 00 00 00 | DNS查询标头。此匹配主要用于将指针放在byte_test内容匹配的正确位置。 |
byte_test:1,>=,0x1c,0,relative; | 下一个字节应至少为十进制 28。此字节表示即将到来的子域名的长度 |
byte_test:1,<=,0x1f,0,relative;< p=""> | 与前一个字节相同的字节最多应为 31。 |
dns_query; content:”.”; content:”.”; distance:1; content:!”.”; | DNS 查询应正好包含两个“.”字符 |
pcre:”/^(?=[0-9][a-z]|[a-z][0-9])[a-z0-9] {28,31} \\.[^.]\\.[a-z]$/”; | DNS 查询中的子域名应至少包含一个数字和一个字母,并且不能包含其他类型的字符。 |
threshold:type both, track by_src, count 50, seconds 3600 | 仅当过去3600 秒中的查询超过 50个时才触发。并且每3600 秒仅触发一次。 |
(2)基于行为
使创建签名变得困难的随机化域名也对防御者有利:大多数正常DNS 查询并非随机。如下表所示,列出的每个黑客工具都至少有一个子域名具有加密或编码的部分。
黑客工具 | 举例 |
DNScat2 | 35bc006955018b0021636f6d6d616e642073657373696f6e00.domain.tld |
Weasel | pj7gatv3j2iz-dvyverpewpnnu–ykuct3gtbqoop2smr3mkxqt4.ab.abdc.domain.tld |
Anchor | ueajx6snh6xick6iagmhvmbndj.domain.tld |
Cobalt Strike | Api.abcdefgh0.123456.dns.example.com 或 post. 4c6f72656d20697073756d20646f6c6f722073697420616d65742073756e74207175697320756c6c616d636f206420646f6c6f7220616c69717569702073756e7420636f6d6f646f20656975736d6f642070726.c123456.dns.example.com |
Sliver | 3eHUMj4LUA4HacKK2yuXew6ko1n45LnxZoeZDeJacUMT8ybuFciQ63AxVtjbmHD.fAh5MYs44zH8pWTugjdEQfrKNPeiN9SSXm7pFT5qvY43eJ9T4NyxFFPyuyMRDpx.GhAwhzJCgVsTn6w5C4aH8BeRjTrrvhq.domain.tld |
Saitama | 6wcrrrry9i8t5b8fyfjrrlz9iw9arpcl.domain.tld |
遗憾的是,DNS查询中的随机性检测本身并不是一个可靠的指标,无法在不产生大量误报的情况下检测DNS隧道。然而,DNS隧道的第二个限制是DNS查询只能承载有限数量的字节。要成为有效的C2通道,攻击者需要能够发送多个命令并接收相应的输出,从而导致较短时间内集中产生了大量的查询。
这基于行为的检测的第二步:简单地计算被分类为“随机化域名”的唯一查询的数量。这些集中产生的大量查询在细节上因使用工具而异,但一般来说,两个查询之间没有空闲时间或空闲时间很少。而Saitama是一个例外,它在两个查询之间有40到80秒的均匀分布的睡眠时间,这意味着平均有一分钟的延迟。60秒的预期睡眠是确定阈值的直观开始。如果我们聚合超过一小时,预计平均将有60个查询分布在3个域名上,在50%的情况下,一小时内的查询少于60次。
图5:模拟出的查询操作的均匀随机观测值之和近似正态分布(1h)
为了确保检测结果,无论随机睡眠时间如何,都可以利用均匀随机观测值之和近似正态分布这一事实。通过这种分布计算出产生可接受概率的查询数。如图5所示,该值可取为53(此数字因检测工具而异,并非内置阈值。不同工具的不同阈值可用于平衡误报)。保险起见,为了涵盖可能的数据包丢失和其他意外因素,在签名和其他规则中此值可取为50。
总之,将对随机出现的DNS查询的检测与每小时随机类DNS查询的最小阈值相结合,可以成为检测DNS隧道的有效方法。分析人员在测试中发现仍然存在一些误报,例如由防病毒解决方案引起的误报。因此,最后还要为已验证为正常的域名创建一个排除列表,以防止正常域名产生的误报。
虽然还可以使用更复杂的检测方法,但该方法已经足够强大(至少足以捕获该恶意软件),更重要的是,该方法易于在网络传感器或SIEM等不同平台以及各种类型的日志上使用。
5. 结论
当出现新的恶意软件时,分析人员的核心工作应该在于确保现有的检测工作在新遇到的威胁上能够正确触发。虽然某些入侵指标可用于追溯寻找可能的感染,但研究人员更倾向(接近)实时地检测威胁。本文概述了作者如何开发植入程序的服务器端实现,以创建植入程序行为的正确记录,最终用于检测工程目的。
强随机化(如在Saitama植入程序中观察到的)显著阻碍了基于签名特征的检测。本文通过检测其规避方法(在本例中为随机化)来检测威胁。正常的DNS流量很少由随机出现的子域名组成,当看到这种情况在以前看不到的域名中大量出现时,很可能是出现了恶意流量。
参考链接:https://blog.fox-it.com/2022/08/11/detecting-dns-implants-old-kitten-new-tricks-a-saitama-case-study/
编辑|孙书樵
审校|何双泽、金矢
本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。
声明:本文来自国家网络威胁情报共享开放平台,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。