logo

DNS 隧道:DNS 如何被恶意行为者滥用

Published on

恶意行为者利用域名服务(DNS)建立命令与控制(C2)通信渠道,甚至在某些情况下使用该协议进行数据渗透。这超出了 C2"心跳"连接的通信范围。恶意行为者还通过 DNS 向受害者系统渗透恶意数据/负载,Unit 42 研究多年来描述了发现的不同类型的滥用。

DNS 是互联网的关键和基础协议——通常被描述为"互联网的电话簿"——将域名映射到 IP 地址,以及更多内容,如协议核心 RFC 中所述。DNS 的普遍性(以及经常缺乏审查)可以使其成为一种非常优雅和微妙的通信和数据共享方法,超出了协议的原始意图。

除了已经提到的 DNS 使用示例外,还有许多工具可以使攻击者创建隐蔽的 DNS 通信渠道,以隐藏通信或绕过网络管理员制定的策略。一个常见的用例是通过使用通常开放和可用的 DNS 来绕过酒店、咖啡馆等的 Wi-Fi 连接注册。最值得注意的是,这些工具可以在 GitHub 等地方免费获得,并且易于使用。有关这些工具的更多信息可以在本报告末尾的附录部分找到。

在本报告中,我们介绍了基于 DNS 的数据渗透和渗出的类型、方法和使用,并提供了一些防御机制的指引。

DNS

DNS 使用端口 53,几乎总是在系统、防火墙和客户端上开放,以传输 DNS 查询。这些查询使用用户数据报协议(UDP),而不是更熟悉的传输控制协议(TCP),因为与 TCP 等效查询相比,UDP 具有低延迟、带宽和资源使用率。UDP 没有错误或流量控制能力,也没有任何完整性检查来确保数据完整到达。

那么,互联网使用(浏览、应用、聊天等)为何如此可靠呢?如果 UDP DNS 查询失败(毕竟它是一个尽力而为的协议),大多数系统会重试多次,只有在多次失败后,才可能切换到 TCP 再试一次;如果 DNS 查询超过了 UDP 数据报大小的限制——通常为 512 字节,但可能取决于系统设置——也会使用 TCP。

Maple 简化的DNS操作

图 1 下面说明了 DNS 操作的基本过程:客户端发送一个查询字符串(例如,在这种情况下为 mail.google[.]com),具有某种类型——通常为主机地址的 A 类型。我已经跳过了中间 DNS 系统可能需要确定".com"存在的位置,然后找出"google[.]com"可以找到的位置,等等。

一旦名称解析为 IP,缓存也会有所帮助:解析后的名称到 IP 通常会在本地系统(以及可能在中间 DNS 服务器上)缓存一段时间。来自同一客户端的后续相同名称查询在缓存过期之前不会离开本地系统。当然,一旦知道远程服务的 IP 地址,应用程序可以使用该信息启用其他基于 TCP 的协议,例如 HTTP,以确保互联网猫咪 GIF 可以可靠地与同事共享。

总而言之,来自组织网络的几十个额外的 UDP DNS 查询将是相当不显眼的,并可能允许恶意负载向对手发出信号;命令也可以被请求的应用程序接收并处理,几乎没有困难。

数据痕迹

就像您浏览互联网时,无论是从搜索引擎结果中转向还是直接访问网站 URL,您的 DNS 查询也会留下痕迹。痕迹的多少取决于沿途涉及的系统和过程,从查询离开操作系统到接收结果 IP 地址。

仅关注服务器端,使用一些基本示例,DNS 服务器——尤其是那些启用了扩展或调试日志记录的服务器——可以收集大量关于请求和请求客户端的信息。

这篇文章提供了一些关于可以从 DNS 服务器日志中获取的信息类型的想法;操作此类服务器的对手可以获取发送请求的远程 IP——尽管这可能是最后一跳或 DNS 服务器的 IP,而不是确切的请求客户端的 IP——以及查询字符串本身,以及服务器的响应。

DNS 隧道

现在我们对 DNS、其在网络中的操作以及服务器端跟踪能力有了共同的理解,让我们深入探讨隧道能力。在本节中,我们将描述命令与控制(C2)信标如何通过 DNS 操作,以及数据渗透和渗出如何可能。

C2

C2 通道通常为对手服务两个目的。首先,它可以作为信标或心跳,指示他们的远程负载仍在运行——仍有心跳——因为它正在向他们的服务器发出信号(通信)。

您可以将基本的 DNS 操作视为上图 1 所示的心跳示例。如果客户端系统上的恶意植入物反复通过 DNS 基础设施向行为者的服务器发送查询,行为者可以从日志中判断植入物正在运行。困难的是区分多个感染植入物的受害者。

考虑图 2 所示的另一个示例,其中客户端系统被恶意软件感染,该恶意软件构造奇怪的查询字符串通过 DNS 发送。这些查询仍然作为信标,向对手表明他们的负载仍然活跃,但它们也提供了一些关于受害者的基本元数据,重要的是,提供了区分一个受害者与另一个受害者的方法。

Maple 示例C2 DNS查询操作

用户名和主机名可能并不总是唯一的,一些 IP 可能在使用网络地址转换(NAT)的多个网络中重复使用,然而系统确实有通用唯一标识符(UUID)或其他属性,当结合在一起时,可以为给定的主机或受害者创建一个唯一标识符。

来自受感染主机的一些元数据可以作为明文发送,但在 DNS 查询中看到这样的字符串时,可能首先显得更可疑。在许多情况下,数据将包含 DNS 不支持的字符,在这种情况下需要进行编码。在图 2 中,您可以看到元数据的 base64 编码等效项,它使用"-"分隔符构造,以便在服务器端进行简单解析和解码,如下图 3 所示。

Maple 服务器端DNS日志跟踪C2通信

图 3 显示了 DNS 服务器应用程序的原始 DNS 日志示例,其中包含恶意软件查询和 DNS 服务器响应的行条目,在这种情况下为 NXDOMAIN(或不存在的域)。

在某些方面,这样的日志,或者可能是从中解码记录的小型数据库,可以与更花哨的僵尸网络控制面板进行比较,允许僵尸网络牧羊人控制他们的僵尸受害者系统。

渗出

那么,DNS 查询中还可以发送什么呢?理论上,任何东西,只要它被正确编码并且不滥用 UDP 大小限制。绕过后者限制的一种方法可能是发送多个 A 记录消息,并在服务器端以某种方式将它们拼接在一起。然而,丢失或缺失的数据报会带来复杂性。

与确保重传失败数据包的 TCP 不同,UDP 没有这样的机制。需要一种算法来了解将发送多少消息,并检查正确的数量到达,但更复杂的是,以某种方式要求客户端再次重传某些数据段,直到 100%到达。根据要传输的数据量——例如系统上的每个 PDF——可能需要很长时间,并且在网络管理员看来非常可疑。

渗入

相比之下,数据的渗入,无论是代码、命令还是要丢弃到磁盘并执行的二进制文件,可能更容易,尤其是使用 TXT 类型的 DNS(而不是主机记录类型 A)。TXT 类型旨在提供描述性文本,例如服务详细信息、联系人姓名、电话号码等,以响应域名的 TXT DNS 查询。

猜猜看什么看起来像文本?Base64 编码的非文本数据!下图 4 显示了与图 2 中相同的查询被发送到恶意站点,但请求和响应的类型现在都是 TXT,响应数据包含了可以由客户端恶意软件执行的编码二进制可执行文件的前 300 个字符左右。再次使用日志,对手将能够知道哪个客户端请求了负载,并且负载已发送(谁知道它是否真的到达……)。

Maple 示例C2 DNS查询与TXT类型响应

但恶意植入物如何知道何时将类型更改为 TXT 或何时请求"文本"数据中的内容呢?它可以内置在负载中,在执行的某个点或经过一定时间后查询,但实际上,它将由行为者驱动,使用 C2 通道的第二个目的——控制。

在我之前的 C2 DNS 通信示例中,DNS 服务器的响应是 NXDOMAIN。此消息显然到达客户端系统(和恶意软件),并可以用作负载的消息或指令,但没有参数和详细信息的情况下是有限的。进入 NOERROR。

NOERROR,顾名思义,意味着一切正常——您的请求已处理并有答案等待您。带有 NOERROR 的响应可以被处理。通常这是 IPv4(对于 A 类型请求)或 IPv6(对于 AAAA 类型请求),或者它可以是 TXT,如上图 4 所示。专注于一个简单的示例——IPv4 地址响应——恶意软件不需要实际的 IP 进行通信,不像您的浏览器问"google[.]com 在哪里?"恶意软件已经在使用 C2 通过 DNS 与其目的地通信。

恶意软件可以使用 IP 响应进行 4,294,967,296 种可能的命令或指令。再次保持非常简单,可能在 IP 的第四个八位字节中的特定值,例如 100,指示恶意软件向行为者的域发送 TXT DNS 查询以收集和执行负载。第一个八位字节中的值 10 可能意味着卸载并从操作系统和事件日志中清除恶意负载的痕迹。字面上,选项是无穷无尽的,可能的复杂程度也是如此。

鉴于对手控制着 DNS 服务器,并且某些 DNS 服务器应用程序或守护程序高度可配置,可以根据受害者系统发送的请求向其发送条件响应。

例如,如果传入查询包含某个标志——一个字符——作为域名的第一个子域,它可以由服务器上 DNS 服务内部运行的程序读取,并向客户端提供自定义响应。这可以用于恶意软件自动完成一组任务,并相应地向行为者报告以接收他们的下一个任务。

结论

DNS 是一个非常强大的工具,几乎在任何地方都被使用,允许应用程序和系统查找资源和服务以进行交互。DNS 提供了一个通信基础,使更高级和更强大的协议能够运行,但从安全角度来看,这可能意味着它被忽视,尤其是当您考虑到有多少恶意软件通过电子邮件协议传递或使用 HTTP 从网络下载时。

出于这些原因,DNS 是对手的完美选择,他们寻求一个始终开放、经常被忽视且可能被低估的协议,以用于与受感染主机的通信。Unit 42 已经看到多起恶意软件及其背后的行为者滥用 DNS 以实现其目标的实例,如本报告中所述。

组织可以通过多种方式防御 DNS 隧道,无论是使用 Palo Alto Networks 的安全操作平台,还是开源技术。防御可以采取多种形式,例如但不限于以下几种:

  • 基于已知声誉或感知危险阻止域名(或 IP 或地理位置区域);
  • 关于"奇怪的"DNS 查询字符串的规则;
  • 关于出站或入站 DNS 查询的长度、类型或大小的规则;
  • 一般加固客户端操作系统并了解名称解析能力及其特定的搜索顺序;
  • 用户和/或系统行为分析,自动发现异常,例如访问新域,尤其是访问方法和频率异常时。

附录:工具列表

工具名称描述
dns2tcpdns2tcp 由 Olivier Dembour 和 Nicolas Collignon 编写。它用 C 语言编写,运行在 Linux 上。客户端可以在 Windows 上运行。它支持 KEY 和 TXT 请求类型。
tcp-over-dnstcp-over-dns(TCP-over-DNS)于 2008 年发布。它有一个基于 Java 的服务器和一个基于 Java 的客户端。它运行在 Windows、Linux 和 Solaris 上。它支持 LZMA 压缩和 TCP 和 UDP 流量隧道。
OzymanDNSOzymanDNS 由 Dan Kaminsky 于 2004 年用 Perl 编写。它用于通过 DNS 设置 SSH 隧道或进行文件传输。请求是 base32 编码的,响应是 base64 编码的 TXT 记录。
iodineiodine 是一个 DNS 隧道程序,首次发布于 2006 年,最近更新于 2010 年。由 Bjorn Andersson 和 Erik Ekman 开发。Iodine 用 C 语言编写,运行在 Linux、Mac OS X、Windows 等上。Iodine 已移植到 Android。它在端点上使用 TUN 或 TAP 接口。
SplitBrainSplitBrain 是 OzymanDNS 的一个变体。
DNScat-P / dnscat2DNScat(DNScat-P)最初于 2004 年发布,最近版本于 2005 年发布。由 Tadeusz Pietraszek 编写。DNScat 被称为"瑞士军刀"工具,具有许多涉及通过 DNS 进行双向通信的用途。DNScat 是基于 Java 的,运行在类 Unix 系统上。DNScat 支持 A 记录和 CNAME 记录请求(Pietraszek,2004)。由于有两个名为 DNScat 的实用程序,本论文中将此工具称为 DNScat-P 以区别于另一个。
DNScapyDNScapy 由 Pierre Bienaime 开发。它使用 Scapy 进行数据包生成。DNScapy 支持通过 DNS 的 SSH 隧道,包括 Socks 代理。它可以配置为使用 CNAME 或 TXT 记录,或随机使用两者。
TUNSTUNS 是由 Lucas Nussbaum 开发的 IP over DNS 隧道,用 Ruby 编写。它不使用任何实验性或很少使用的记录类型。它仅使用 CNAME 记录。它将使用的 MTU 调整为 140 个字符,以匹配 DNS 请求中的数据。TUNS 可能更难检测,但会带来性能损失。
PSUDPPSUDP 由 Kenton Born 开发。它通过修改 IP/UDP 长度将数据注入现有的 DNS 请求。它要求参与隐蔽网络的所有主机将其 DNS 请求发送到一个 Broker 服务,该服务可以为特定主机保存消息,直到该主机发出 DNS 请求。然后可以在响应中发送消息。
Your Freedom适用于 Windows、Mac OSX、Linux 和 Android 的 HTTPS/UDP/FTP/DNS/ECHO VPN 和隧道解决方案。绕过代理并匿名访问互联网。
Hexify由 Infoblox 开发的工具,用于对 DNS 隧道进行渗透测试。

附录:恶意软件列表

恶意软件名称描述
DNS_TXT_Pwnage一种能够通过 DNS TXT 查询接收命令和 PowerShell 脚本的后门。
DNSMessengerDNSMessenger 是一种远程访问木马(RAT),可以打开一个后门,以便黑客可以远程控制被感染的机器。
OilRig - BONDUPDATER针对中东政府的木马可以在其 DNS 隧道协议中使用 A 记录和 TXT 记录进行 C2 通信。