type
status
date
slug
summary
tags
category
icon
password
隧道
现实生活中我们乘坐汽车或火车常常会遇到隧道,隧道在物理世界是一种跨越无法跨越的地形或边界的方法,而在网络世界中的隧道则是一种绕过端口屏蔽的通信方法。
隧道技术是一种通过使用互联网络的基本设施在网络之间传递数据的方式,使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道技术将其他协议的数据帧或者数据包重新封装然后通过隧道发送。新的帧头提供路由信息,以便互联网传递被封装的负载数据。
常见的隧道如下:
- 网络层
- IPV6隧道
- ICMP隧道
- GRE隧道
- 传输层
- TCP隧道
- UDP隧道
- 应用层
- SSH隧道
- HTTP隧道
- HTTPS隧道
- DNS隧道
DNS隧道
DNS隧道是隐蔽信道的一种,通过将其他协议封装在DNS协议中进行通信。封装由客户端完成,将DNS流量还原成正常的流量由服务器完成。大多数防火墙和入侵检测设备对DNS流量是放行的,而隧道攻击正式利用了放行的特点以及协议解析流程来实现的。
DNS隧道有两种实现方式:
- IP直连型DNS隧道 直连也就是客户端直接和指定的目标DNS Server(Authoritative NS Server)连接,通过将数据编码封装在DNS协议中进行通信,这种方式速度快,但是隐蔽性比较弱,很容易被探测到,另外限制比较高,很多场景不允许自己指定DNS Server,很多的企业网络为了尽可能的降低遭受网络攻击的风险,一般将相关策略配置为仅允许与指定的可信任DNS服务器之间的流量通过。
- 域名型DNS隧道(中继) 通过DNS迭代查询实现的中继隧道,比较隐蔽,但同时因为数据包到达目标DNS Server前需要经过多个节点,所以速度上较直连慢很多。
DNS隧道攻击
最常见的工具如下:
- dns2tcp:支持直连模式的DNS隧道,只实现了简单的DNS隧道,相关命令和控制服务需要自行搭建,且已在kali系统中直接集成。
- iodine:最活跃、速度最快、支持直连和中继模式,且支持丰富的编码、请求类型选择
- dnscat2:封装在DNS协议中的加密C&C信道,直接运行工具即可实现数据传输、文件操作等命令和控制功能
dns2tcp
仓库
说明
dns2tcp是一款利用dns协议传输tcp数据的工具,适用于客户端的防火墙禁止tcp出站流量,无法上网,dns2tcp利用dns协议传输tcp数据,从而实现上网(dns协议是udp协议走53端口)
安装
部署
服务端配置和启动:

客户端启动:

使用ssh即可进行登陆

抓包查看相关DNS报文

可以看出一直有TXT类型查询,心跳和数据传输都是通过TXT类型的DNS记录查询进行完成的,dns2tcp还支持KEY类型的记录。
iodine
仓库
说明
iodine可以通过一台dns服务器制造一个IPv4数据通道,特别适合在目标主机只能发送dns请求的网络中环境中使用。iodine支持直接转发和中继两种模式,其原理是通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块“dns0”的虚拟网卡。
部署
服务端执行命令:

查看网卡发现多了一个dns0

客户端执行命令:

客户端这边也多了一个虚拟网卡tun0

DNS隧道建立后可以看到,服务端和客户端多了一个虚拟网卡,后续就可以通过这个网卡的ip进行相关通行。

查看DNS报文,发现iodine使用NULL类型查询,这是工具自动选择的,当然它还支持 PRIVATE, TXT, SRV, MX, CNAME, A这些类型

dnscat2
仓库
部署
使用docker启动服务端
编译客户端

进入交互界面查看session,通过session与客户端通信

客户端收到服务端日志并执行

使用shell,向client发送命令

查看DNS报文,发现dnscat查询类型比较随机。

DNS隧道防护策略
隧道消息类型分布
在正常的DNS流量中。A记录类型的流量占20%-30%,CNAME记录为38%-48%,AAAA记录占25%,NS记录只有5%,TXT记录只有1%-2%。然而为了获取更高的带宽,一部分的DNS隐蔽信道工具如iodine。在默认配置下会使用TXT或NULL等不常用的记录类型
域名中关键字和规则
在DNS隧道的报文中,我们可以看到变化的都是子域名,区是可以作为关联异常流量的切入点。 同时DNS隧道而言,控制端要不断借助DNS query的query_name来承载要传输的内容,所以从主机数量这个维度来看,在一个DNS隧道会话中,域名对应的主机名数量会明显大于正常的DNS通信。
数据包数量
DNS隧道会话一般会向外发送心跳报文、传输本机敏感信息、资源文件等,控制端会下达相关的远程控制指令等所以在 DNS 隧道会话中 DNS报文数量大。但正常客户端产生的DNS会话随着一次DNS解析任务结束而结束,DNS会话比较简短。大多数情况是2个,由1个DNS请求报文和1个DNS响应报文组成。
报文载荷量
一般正常的DNS查询报文都不会太大,但是DNS隧道由于是通过DNS报文中再封装其他协议的报文所以载荷量就会普遍大一些。
其他
参考
- 作者:Ryan Wu
- 链接:https://hexo.fridaylab.top/article/3bf2382a-9384-4c6b-84e1-6831aaa4746b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。


