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

DNS隧道
0 1
原理

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

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

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

  • 中继隧道:经过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协议的请求包,封装了加密后的指令执行结果。tcp

还能够看到全部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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索