一、源码下载
Iodine下载地址 GitHub:https://github.com/yarrick/iodine
二、源码编译
执行make命令以编译服务端和客户端二进制文件。运行make install以将二进制文件复制到目标目录。运行make test以编译并运行单元测试。
编译以后文件如下:
在bin目录下,有iodine和iodined两个文件,分别为服务端和客户端。
三、隧道工具运行
(1)、参数说明
-4 使用IPv4请求
-6 使用IPv6请求
-f 保持前台运行
-r 强制使用DNS隧道进行传输
-P password
-m 最大传输大小
-M 最大传输长度
-T 传输类型
-O 编码类型
Iodine支持多种DNS请求类型,并且NULL和PRIVATE类型期望提供最大的下载带宽。该PRIVATE类型在专用范围内使用值65399。其他可用的类型有TXT,SRV, MX,CNAME和A(返回CNAME)。通常Iodine会自动检测并使用“最佳”请求类型,但是,DNS中继可能会对NULL和TXT施加限制,从而使SRV或MX实际上是最佳选择。但是可以使用该-T选项强制使用设定类型。
(2)、运行
服务端运行,执行 iodined -f 10.0.0.1 test.com
Listening to DNS for domain test.com,服务端开始监听所有 test.com的DNS请求,所有指令数据等均通过请求域名的子域进行传输。
客户端运行,执行 iodine -f -r 192.168.XXX.XXX (服务端IP地址)
Connected setup complete, transmitting data,客户端运行后,可以发送指令、连接ssh进行数据传输等等。
四、命令传输
新开窗口,运行tcpdump -i dns0 port 53 -w file.pcap,其中参数-i 指定网卡, port 指定端口,DNS使用53端口,-w 写入文件。
ssh连接,执行 ssh root@10.0.0.1
显示抓取了166个包
使用wireshark打开保存的pcap文件,因为我们监听的是ens33网卡,所以会有正常的DNS流量,比如192.168.221.2与192.168.221.129之间的通信,其中192.168.221.129是无服务端,192.168.221.2为网关地址,192.168.221.130为客户端地址。
可以看到DNS查询和响应使用了多种类型,包括A、AAAA、PTR、NULL等。打开一个响应报文,如下: