本文仅作为学习记录,如有侵权,请联系删除!
前言:
hw马上就开始了,突然心血来潮想做DNS Beacon上线的实验,万一hw碰上了不至于两眼黑,最起码能扯扯淡
0x00 环境配置:
随着目前攻击者越来越多地利用DNS通道来建立隧道与C2通信。从本地计算机到Internet的任何通信(不包括基于静态IP的通信)都依赖于DNS服务,限制DNS通信可能会导致合法远程服务的断开,因此,企业防火墙通常配置为允许UDP端口53(由DNS使用)上的所有数据包。
为了进一步做仿真模拟实验,在win7虚拟机上设置防火墙出网策略,只允许访问内网以及dns出网,但是因为windows防火墙的策略是阻断优先于放行,导致一直没有配置好环境,最终通过将阻断策略分为两条得以解决:
0x01 DNS的几种资源记录类型:
- 1.主机记录(A记录)
主机记录可以将DNS中的域名称对应到IPv4地址。
- 2.PTR
PTR可以定义某个对应的域名。
- 3.CNAME (Canonical Name)记录,通常称别名解析
CNAME记录可以将注册的不同域名都转到一个域名记录上,由这个域名记录统一解析管理,与A记录不同的是,CNAME别名记录设置的可以是一个域名的描述而不一定是IP地址。
- 4.NS(Name Server)记录是域名服务器记录
NS记录用来指定该域名是由哪个DNS服务器来进行解析的,可以把一个域名的不同二级域名分别指向到不同的DNS系统来解析。
- 5.TXT 记录
TXT记录一般是为某条记录设置说明,比如你新建了一条a.com的TXT记录,TXT记录内容"this is a test TXT record.",然后用nslookup -qt=txt a.com ,你就能看到"this is a test TXT record"的字样了。
0x02 DNS协议解析过程:
DNS协议解析过程分为两种,迭代查询和递归查询。
- 迭代查询:
本地域名服务器向根域名服务器发送请求报文,根域名服务器直接给出ip地址或者告诉本地域名服务器下一步应该去向另一个域名服务器A进行查询。同理,A域名服务器直接给出ip地址或者告诉本地域名服务器下一步应该去查询B域名服务器。过程以此类推,直到找到ip地址为止。
- 递归查询:
客户机像本地域名服务器查询,如果本地服务器的缓存中没有需要查询的ip地址,那么本地域名服务器会以客户机的身份(代替本机查询),向根域名服务器发送请求报文。
本机查询本地域名服务器,这部分属于递归查询。
本地域名服务器查询根域名服务器,这部分属于迭代查询。
0x03 DNS隧道:
DNS隧道是隐蔽信道的一种,通过将其他协议封装在DNS协议中进行通信。封装由客户端完成,将DNS流量还原成正常的流量由服务器完成。DNS隧道攻击利用了防火墙放行DNS的特点以及协议解析流程来实现的。
1.)直连型DNS隧道:
客户端直接和指定的目标DNS Server进行UDPsocket套接字连接,通过将数据编码封装在DNS协议中进行通信,这种方式速度快,但是隐蔽性比较弱,很容易被探测到,但如果客户端指定了信任的DNS解析服务器,那么将会被白名单限制在外。
2.)域名型DNS隧道(中继):
通过DNS迭代查询实现的中继隧道,比较隐蔽,但同时因为数据包到达目标DNS Server前需要经过多个节点,所以速度上较直连慢很多。中继过程中的一个关键点是对DNS缓存机制的规避,因为如果解析的域名在Local DNS 中已经有缓存,那么Local DNS 就不会继续发送数据包,所以在构造请求中,每次查询的域名需要不同或者是已过期的。
DNS隧道建立的过程:
Step 1:受控PC机将数据封装进DNS数据包里,像局域网内部的本地域名服务器请求查询aaa.com
Step 2:本地域名服务器透过防火墙向根域名服务器发送查询请求
Step 3:经过大量重定向,查询请求最终要aaa.com的权威域名服务器
Step 4:aaa.com权威域名服务器是在攻击者的控制下,解析发送过来的DNS数据包并发送回应包
Step 5:DNS回应包穿透防火墙
Step 6:DNS回应包进入内网
Step 7:本地域名服务器将回应包返回给受控PC机
Step 8:受控PC机解析DNS回应包里的数据,得到新的指令
DNS Beacon原理:
利用DNS请求应答机制作为攻击渗透的命令控制通道,把C&C服务器指令封装到DNS相应报文中,以此控制被控端主机。
发送端将隐蔽数据信息切分并且编码后封装到DNS报文域名中进行传输,每一级域名长度为63,域名总长度不超过253,接收端收到DNS报文后提取域名中的隐蔽信息字段进行解码重组还原得到IP报文。主要的工具有DNSCat,Iodine等
0x04 DNS Beacon上线:
首先配置域名的记录。将自己的域名www.hacker.com解析到VPS服务器地址。然后创建NS记录,将ns1.hacker.com指向www.hacker.com:
然后使用ping命令配合tcpdump观察一下是否有流量经过:
tcpdump -n -i eth0 udp dst port 53
CS开启DNS Beacon监听:
生成DNS木马,只要木马在目标主机执行成功,我们的CobaltStrike就能接收到反弹的shell。但是默认情况下,主机信息是黑色的,我们需要执行以下命令,让目标主机信息显示出来:
checkin
mode dns-txt # 使用dns的txt记录方式进行通信。
0x05 检查与防范:
- DNS会话中数据包的总数较多:在整个木马的生命周期里会向CC服务器发送心跳包,传输信息,资源文件等行为,CC服务器也会发送控制指令。在一定的单位时间内,观察TXT、PTR等交互记录的数据包是否存在DNS隧道攻击
- 隧道消息类型: 在正常的DNS流量中。A记录类型的流量占20%-30%,CNAME记录为38%-48%,AAAA记录占25%,NS记录只有5%,TXT记录只有1%-2%。然而为了获取更高的带宽,一部分的DNS隐蔽信道工具如Iodine。在默认配置下会使用TXT或NULL等不常用的记录类型。
- 检测DNS数据包有效载荷部分是否加密
- 通过防火墙设置DNS白名单策略来限制DNS隧道攻击
- 域名固定部分不变:在DNS隧道的报文中,我们可以看到 变化的都是子域名
参考如下:
『DNS隧道工具之渗透神器』— cobalt strike
DNS 隧道通信特征与检测
墨云 I 技术课堂-DNS隧道攻击与防御
工具的使用 | CobaltStrike中DNS Beacon的使用