基于PingTunnel的icmp 隧道利用
概述
在我们日常渗透测试中,往往会遇到这么一种情况:当我们针对某一目标进行渗透并获取到该目标公网边界上某一台服务器权限后,想要将其内网转发出来后进行下一步的内网渗透。但是由于其边界存在流量检测设备,或者边界访问控制对其出入协议进行了严格限制,导致我们的http、dns、socks等协议隧道无法正常建立。这时候就会很难继续进入内网进行进一步的动作。但是同时管理员往往又不会对icmp协议进行严格控制(即我们常用的ping)。这时候我们就可以利用icmp隧道将我们的流量封装到icmp协议中穿透到目标内网中。这样不仅可以顺利进行内网穿透,同时也可以绕过一些简单的封禁规则。当然,对icmp隧道接触比较早的同学,读书那会儿也曾利用该技术绕过校园网的访问控制。
icmp的理论知识在这里不多赘述,可参考百度百科:https://baike.baidu.com/item/ICMP/572452?fromtitle=ICMP%E5%8D%8F%E8%AE%AE&fromid=421332&fr=aladdin
网络拓扑

利用过程
- 利用前的准备
工具下载地址:http://www.cs.uit.no/~daniels/PingTunnel/#download
安装相关依赖
1 2 | root@ubuntu:/# apt-get install flex bison libpcap-dev -y<br> root@centos:/#yum install libpcap libpcap-devel flex bison -y |
- 编译安装PingTunnel
1 | root@ubuntu:/#make && make install |
- 在目标机器上启动工具并设置连接密码。从图中也可以看出,通过ptunnel对TCP流量进行了封装和转发
1 | root@ubuntu:/#ptunnel -x scantime |

- 在我们自己的中转服务器上启动工具并做相应的设置。
【ssh连接】
1 | root@ubuntu:/# ptunnel -p 192.168.253.139 -lp 1080 -da 127.0.0.1 -dp 22 -x scantime |
-p ##表示连接icmp隧道另一端的机器IP(即目标服务器)
-lp ##表示需要监听的本地tcp端口
-da ##指定需要转发的机器的IP(即目标内网某一机器的内网IP)
-dp ##指定需要转发的机器的端口(即目标内网某一机器的内网端口)
-x ##设置连接的密码

【rdp连接】
1 | root@ubuntu:/#ptunnel -p 192.168.253.139 -lp 1080 -da 192.168.1.3 -dp 3389 -x scantime |

- 除了常规的通过icmp协议端口转发以外,假设目标内网中正好存在一台Linux设备,那么就不用一台一台地进行转发这么麻烦了。我们就可以利用目标内网中的第二台Linux设备作为跳板,进行多协议隧道穿透。比如利用ssh进行socks代理,这样就能将目标内网整个给转发出来了。
1 | root@ubuntu:/#sudo ptunnel -p 192.168.253.139 -lp 1080 -da 192.168.1.10 -dp 1081 -x scantime |


结束语
通过这个方法,不仅能将目标内网转发出来,而且我们的流量将是双层协议隧道进行了封装,再次加强了规避流量检测的力度。