


在进行DNS查询时,若是查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,而后返回结果,若是互联网上有一台定制的服务器,那么依靠DNS协议便可进行数据包的交换。从DNS协议角度来看,这样的操做只是在一次次的查询某个特定的域名并获得解析结果,但其本质问题是,预期的返回结果应该是一个IP,而事实上返回的可使任意字符,包括加密的C&C指令。html
DNS隧道根据实现方式大体可分为两种:
web
直连:用户端直接和指定的目标DNS服务器创建链接,而后将须要传输的数据编码封装在DNS协议中进行通讯。这种方式的优势是具备较高速度,但蔽性弱、易被探测追踪的缺点也很明显。另外直连方式的限制比较多,如目前不少的企业网络为了尽量的下降遭受网络攻击的风险,通常将相关策略配置为仅容许与指定的可信任DNS服务器之间的流量经过。shell
中继隧道:经过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协议的请求包,封装了加密后的指令执行结果。tcp
还能够看到全部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源创计划”,欢迎正在阅读的你也加入,一块儿分享。