DNS和ICMP常见隐蔽隧道工具流量解析

浪子不回头ぞ 提交于 2020-11-12 21:33:51
DNS隧道
0 1
原理

在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议角度来看,这样的操作只是在一次次的查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP,而事实上返回的可以使任意字符,包括加密的C&C指令。

DNS隧道根据实现方式大致可分为两种:

  • 直连:用户端直接和指定的目标DNS服务器建立连接,然后将需要传输的数据编码封装在DNS协议中进行通信。这种方式的优点是具有较高速度,但蔽性弱、易被探测追踪的缺点也很明显。另外直连方式的限制比较多,如目前很多的企业网络为了尽可能的降低遭受网络攻击的风险,一般将相关策略配置为仅允许与指定的可信任DNS服务器之间的流量通过。

  • 中继隧道:通过DNS迭代查询而实现的中继DNS隧道,这种方式及其隐秘,且可在绝大部分场景下部署成功。但由于数据包到达目标DNS服务器前需要经过多个节点的跳转,数据传输速度和传输能力较直连会慢很多

这两种功方法虽然在工作原理上存在差异,但是从流量上看都是DNS协议,但是实际工程中也需要注意,旁路采集的方式可能会影响到你最终能否采集到的完整的通信日志,例如如果采用记录dns解析的方法,则可能漏过upd-ip直连的通信方式,如果直接在网关上进行“端口和协议解析”则可保证全流量采集。

 


0 2
应用场景

    在安全策略严格的内网环境中,常见的 C&C 通讯端口都被众多安全设备所监控。如果 攻击者对目标内网的终端进行渗透时,发现该网段只允许白名单流量出站,同时其它端口都被屏蔽时,传统 C&C 通讯手段无法成立,反弹 Shell 变得十分困难。在这种情况下,攻击者还有一个最后的选择:使用 DNS 隐蔽隧道建立ReverseShell

03
工具流量分析

Dnscat2

Dnscat2是使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证,使用shellDNS查询类型(TXTMXCNAMEAAAAA),多个同时进行会话。

Dnscat2也分为两种模式:

  • 直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求。

  • 中继模式:DNS经过互联网迭代解析,指向指定的DNS服务器。

流量分析

 

可以看到dnscat2通过dns协议的请求包,封装了加密后的指令执行结果。

还可以看到所有dns包的udp五元组都是相同的,受控端和C&C复用了同一个udp会话进行dns隧道通信,dnscat2通过加密手段隐藏了CC服务器的域名,隐蔽性很好。

并且DNS请求包中名称字段中包含了dnscat的工具标识。

 

通信过程中主要使用了MXTXTCNAME记录的查询。

检测

DNS请求包中的请求字段的名称中包含了dnscat这个字符串,可以作为防火墙和入侵检测的特征。

因为所有dns包的udp五元组都是相同的,受控端和C&C复用了同一个udp会话进行dns隧道通信,可以利用这个特征进行upd五元组聚类,在upd五元组会话的基础上进行特征工程。(机器学习)

很多DNS Tunneling使用TXT记录类型发送请求和响应(例如文件上传等大数据量功能),而在正常的DNS网络流量中,TXT记录的比例可能只有1%-2%,如果时间窗口内,TXT记录的比例激增,那么也意味着可能存在异常。


Reverse_DNS_Shell

Reverse_DNS_Shell使用 DNS 作为 C2 通道的 Python 反向 Shell

流量分析

 

可以发现进行通信的查询类型都为A类型,但在进行命令执行时,所用的为TXT记录报文。

 


GitHub上的项目代码中发现

def spawnShell(answer, payload): shellInput = raw_input(PROMPT) if shellInput == 'quit': EXIT = 1 if shellInput == '': spawnShell(answer, payload) out = base64.b64encode(shellInput) answer.add_answer( *dnslib.RR.fromZone('{}.com 60 TXT "{}"'.format(payload, out))) return answer


这一部分封装的是对DNS的应答,payload里是对上一次命令执行后的回显,out是将这一次对被控端发送的命令进行编码并封装为TXT应答包。


但是由于工具是开源的,可以进行多元化编译,所以加解密方式不固定。

检测

很多DNS Tunneling使用TXT记录类型发送请求和响应(例如文件上传等大数据量功能),而在正常的DNS网络流量中,TXT记录的比例可能只有1%-2%,如果时间窗口内,TXT或者A记录的比例激增,那么也意味着可能存在异常。


Iodine

iodine可以通过一台DNS服务器创造一个IPv4数据通道,特别适合在目标主机只能发送DNS请求的网络环境中使用。

Iodine支持直接转发和中继两种模式,原理是:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一局域网。在客户端和服务端建立连接后,客户机上会多一块名为“dns0”的虚拟网卡。

流量分析

    Iodine默认使用TXTNULL类型发送数据,支持NULL,TXT,SRV,MX,CNAME,A等多种查询请求类型

 

test.com前的字段为加密字段(Iodine支持base32base64base128等多种编码规范),这里使用了NULL查询类型。

 

响应包中data字段是传输的加密数据。

同时发现传输的五元组也都是相同的,受控机和攻击机是使用同一个udp会话进行DNS通信。

检测

如果一定时间内,NULL记录的比例激增,那么意味着可能存在异常。(但是iodine支持多种类型发送数据,所以可能是NULLTXTSRVMXCNAMEA任意一种记录比例激增)

因为数据包中的域名是明文传输,可以检测恶意域名。



Dns2tcp

dns2tcp使用C语言编写。支持DNS协议KEYTXT类型的请求。

流量分析 

 

通过数据包发现使用的是TXT来传输,dns2tcp只能用两种类型:TXTKEY,默认是TXT

域名前的是通过隧道加密传输的数据,用的base64加密。

 

请求包和回应包的内容基本一致,除了回应包比请求包多了一串base64加密后的数据。

检测

如果一定时间内,TXTKEY记录的比例激增,那么意味着可能存在异常。


04
总结

  1. DNS隧道传输数据时,会将数据切成若干个小单元依次发出,时间间隔非常小,当没有数据交互的时候,隧道两端仍然会发包保持通信状态,大概0.6s发出一个数据包,最大是3s

  2. 可以通过追踪用户DNS查询次数,如果达到阈值就生成响应报告。

  3. 记录TXTNULL等查询类型所占比例,如果比例激增则怀疑攻击。

  4. 查看DNS数据包字段内包含的域名是否为恶意域名。

  5. 查看DNS数据包字段内是否包含恶意流量标签(dnscat

  6. 基本所有隐蔽隧道数据包中的五元组都是相同的,可以通过五元组判断是否存在隧道。

  7. 可以结合协议本身,基于通信行为检测隧道木马,,采用 Winpcap 数据包捕获技术的底层过滤机制,抓取 DNS 流量.将抓取的 DNS 流量按照五元组进行聚类,形成 DNS 会话数据流.将一个个 DNS 会话数据流提取成 DNS 会话评估向量,作为分类训练模块和木马流量监测的输入。(机器学习)

https://www.cnblogs.com/LittleHann/p/8656621.html

 


ICMP隧道
01
原理

IP流量封装进 IMCP ping 数据包中,旨在利用 ping 穿透防火墙的检测,因为通常防火墙是不会屏蔽 ping 数据包。

请求端的 Ping 工具通常会在 ICMP 数据包后面附加上一段随机的数据作为 Payload,而响应端则会拷贝这段 Payload ICMP 响应数据包中返还给请求端,用于识别和匹配 Ping 请求(Windows Linux 系统下的Ping 工具默认的 Payload 长度为 64bit,但实际上协议允许附加最大 64K 大小的Payload

02
应用场景

    在一些网络环境中,如果攻击者使用各类上层隧道(HTTPDNS等)进行操作都失败了,常常会通过ping命令访问远程计算机,尝试建立icmp隧道,将TCP/UDP数据封装到ICMPping数据包中从而穿过防火墙。

03
工具流量分析

Icmpsh

Icmpsh使用简单,跨平台,运行时不需要管理员权限,在运行时会代替系统本身ping命令的应答程序。

流量分析

 


刚建立连接时是靶机不断发送icmp的请求包,区别于正常的icmp包,icmpshiIdentifier字段(相当于ping的进程号,winXP0002)是默认写死的0001

正常的icmp数据包中的data字段应该是固定的,由于icmpsh会进行传输数据和回显数据所以date字段长度是不固定的。


icmptunnel

icmptunnel 可以将 IP 流量封装进 IMCP ping 数据包中,旨在利用 ping 穿透防火墙的检测。

对于隧道数据,icmptunnel 首先会指定客户端和服务器端。随后,客户端会将 IP 帧封装在 ICMP 请求数据包中发送给服务器,而服务器端则会使用相匹配的 ICMP 响应数据包进行回复(icmptunnel 提供在状态机防火墙和 NAT 网络之间,更加可靠的连接)。

流量分析

 

 

    可以发现在每条请求包或者响应包中的date字段中都带有TUNL标识。


04
总结

  1. 一个正常的ping命令每秒最多发送两个数据包,而使用ICMP隧道则会在很短时间内产生上千个ICMP数据包,可以检测同一来源的ICMP数据包的数量。

  2. 记录payload大于64bitICMP数据包(icmptunnel可以控制payload长度不超过64bit)。

  3. 一般的ICMP数据包请求包和响应包中的payload字段应该相同,可以通过对比payload字段来进行筛查。

  4. 检查ICMP数据包中的协议标签(如icmptunnel会在所有ICMP payload前面添加“TUNL”来标识隧道。)



本文分享自微信公众号 - 小啦的学习笔记(woshiguolala)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!