在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议角度来看,这样的操作只是在一次次的查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP,而事实上返回的可以使任意字符,包括加密的C&C指令。
DNS隧道根据实现方式大致可分为两种:
直连:用户端直接和指定的目标DNS服务器建立连接,然后将需要传输的数据编码封装在DNS协议中进行通信。这种方式的优点是具有较高速度,但蔽性弱、易被探测追踪的缺点也很明显。另外直连方式的限制比较多,如目前很多的企业网络为了尽可能的降低遭受网络攻击的风险,一般将相关策略配置为仅允许与指定的可信任DNS服务器之间的流量通过。
中继隧道:通过DNS迭代查询而实现的中继DNS隧道,这种方式及其隐秘,且可在绝大部分场景下部署成功。但由于数据包到达目标DNS服务器前需要经过多个节点的跳转,数据传输速度和传输能力较直连会慢很多。
这两种功方法虽然在工作原理上存在差异,但是从流量上看都是DNS协议,但是实际工程中也需要注意,旁路采集的方式可能会影响到你最终能否采集到的完整的通信日志,例如如果采用记录dns解析的方法,则可能漏过upd-ip直连的通信方式,如果直接在网关上进行“端口和协议解析”则可保证全流量采集。
在安全策略严格的内网环境中,常见的 C&C 通讯端口都被众多安全设备所监控。如果 攻击者对目标内网的终端进行渗透时,发现该网段只允许白名单流量出站,同时其它端口都被屏蔽时,传统 C&C 通讯手段无法成立,反弹 Shell 变得十分困难。在这种情况下,攻击者还有一个最后的选择:使用 DNS 隐蔽隧道建立ReverseShell。
Dnscat2
Dnscat2是使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证,使用shell及DNS查询类型(TXT、MX、CNAME、A、AAAA),多个同时进行会话。
Dnscat2也分为两种模式:
直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求。
中继模式:DNS经过互联网迭代解析,指向指定的DNS服务器。
流量分析
可以看到dnscat2通过dns协议的请求包,封装了加密后的指令执行结果。
还可以看到所有dns包的udp五元组都是相同的,受控端和C&C复用了同一个udp会话进行dns隧道通信,dnscat2通过加密手段隐藏了CC服务器的域名,隐蔽性很好。
并且DNS请求包中名称字段中包含了dnscat的工具标识。
通信过程中主要使用了MX、TXT、CNAME记录的查询。
检测
l DNS请求包中的请求字段的名称中包含了”dnscat”这个字符串,可以作为防火墙和入侵检测的特征。
l 因为所有dns包的udp五元组都是相同的,受控端和C&C复用了同一个udp会话进行dns隧道通信,可以利用这个特征进行upd五元组聚类,在upd五元组会话的基础上进行特征工程。(机器学习)
l 很多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应答包。
但是由于工具是开源的,可以进行多元化编译,所以加解密方式不固定。
检测
l 很多DNS Tunneling使用TXT记录类型发送请求和响应(例如文件上传等大数据量功能),而在正常的DNS网络流量中,TXT记录的比例可能只有1%-2%,如果时间窗口内,TXT或者A记录的比例激增,那么也意味着可能存在异常。
Iodine
iodine可以通过一台DNS服务器创造一个IPv4数据通道,特别适合在目标主机只能发送DNS请求的网络环境中使用。
Iodine支持直接转发和中继两种模式,原理是:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一局域网。在客户端和服务端建立连接后,客户机上会多一块名为“dns0”的虚拟网卡。
流量分析
Iodine默认使用TXT和NULL类型发送数据,支持NULL,TXT,SRV,MX,CNAME,A等多种查询请求类型
在test.com前的字段为加密字段(Iodine支持base32,base64,base128等多种编码规范),这里使用了NULL查询类型。
响应包中data字段是传输的加密数据。
同时发现传输的五元组也都是相同的,受控机和攻击机是使用同一个udp会话进行DNS通信。
检测
l 如果一定时间内,NULL记录的比例激增,那么意味着可能存在异常。(但是iodine支持多种类型发送数据,所以可能是NULL、TXT、SRV、MX、CNAME、A任意一种记录比例激增)
l 因为数据包中的域名是明文传输,可以检测恶意域名。
Dns2tcp
dns2tcp使用C语言编写。支持DNS协议KEY和TXT类型的请求。
流量分析
通过数据包发现使用的是TXT来传输,dns2tcp只能用两种类型:TXT和KEY,默认是TXT。
域名前的是通过隧道加密传输的数据,用的base64加密。
请求包和回应包的内容基本一致,除了回应包比请求包多了一串base64加密后的数据。
检测
l 如果一定时间内,TXT或KEY记录的比例激增,那么意味着可能存在异常。
DNS隧道传输数据时,会将数据切成若干个小单元依次发出,时间间隔非常小,当没有数据交互的时候,隧道两端仍然会发包保持通信状态,大概0.6s发出一个数据包,最大是3s。
可以通过追踪用户DNS查询次数,如果达到阈值就生成响应报告。
记录TXT、NULL等查询类型所占比例,如果比例激增则怀疑攻击。
查看DNS数据包字段内包含的域名是否为恶意域名。
查看DNS数据包字段内是否包含恶意流量标签(dnscat)
基本所有隐蔽隧道数据包中的五元组都是相同的,可以通过五元组判断是否存在隧道。
可以结合协议本身,基于通信行为检测隧道木马,,采用 Winpcap 数据包捕获技术的底层过滤机制,抓取 DNS 流量.将抓取的 DNS 流量按照五元组进行聚类,形成 DNS 会话数据流.将一个个 DNS 会话数据流提取成 DNS 会话评估向量,作为分类训练模块和木马流量监测的输入。(机器学习)
【https://www.cnblogs.com/LittleHann/p/8656621.html】
将IP流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测,因为通常防火墙是不会屏蔽 ping 数据包。
请求端的 Ping 工具通常会在 ICMP 数据包后面附加上一段随机的数据作为 Payload,而响应端则会拷贝这段 Payload 到 ICMP 响应数据包中返还给请求端,用于识别和匹配 Ping 请求(Windows 和 Linux 系统下的Ping 工具默认的 Payload 长度为 64bit,但实际上协议允许附加最大 64K 大小的Payload)
在一些网络环境中,如果攻击者使用各类上层隧道(HTTP、DNS等)进行操作都失败了,常常会通过ping命令访问远程计算机,尝试建立icmp隧道,将TCP/UDP数据封装到ICMP的ping数据包中从而穿过防火墙。
Icmpsh
Icmpsh使用简单,跨平台,运行时不需要管理员权限,在运行时会代替系统本身ping命令的应答程序。
流量分析
刚建立连接时是靶机不断发送icmp的请求包,区别于正常的icmp包,icmpsh的iIdentifier字段(相当于ping的进程号,winXP是0002)是默认写死的0001。
正常的icmp数据包中的data字段应该是固定的,由于icmpsh会进行传输数据和回显数据所以date字段长度是不固定的。
icmptunnel
icmptunnel 可以将 IP 流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测。
对于隧道数据,icmptunnel 首先会指定客户端和服务器端。随后,客户端会将 IP 帧封装在 ICMP 请求数据包中发送给服务器,而服务器端则会使用相匹配的 ICMP 响应数据包进行回复(icmptunnel 提供在状态机防火墙和 NAT 网络之间,更加可靠的连接)。
流量分析
可以发现在每条请求包或者响应包中的date字段中都带有TUNL标识。
一个正常的ping命令每秒最多发送两个数据包,而使用ICMP隧道则会在很短时间内产生上千个ICMP数据包,可以检测同一来源的ICMP数据包的数量。
记录payload大于64bit的ICMP数据包(icmptunnel可以控制payload长度不超过64bit)。
一般的ICMP数据包请求包和响应包中的payload字段应该相同,可以通过对比payload字段来进行筛查。
检查ICMP数据包中的协议标签(如icmptunnel会在所有ICMP payload前面添加“TUNL”来标识隧道。)
本文分享自微信公众号 - 小啦的学习笔记(woshiguolala)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/3896378/blog/4464887