原理
ICMP协议通常用于返回的错误信息或是分析路由,ping和traceroute使用的就是这个协议。通常两台设备通信需要通过端口,但在ICMP协议下就不需要,依据这个特点可绕过IDS、IPS等设备。
icmpsh
icmpsh是基于ICMP协议,可在攻击者服务器跨平台运行的Windows反弹shell工具。下面其是github上的项目地址。
使用方法
把icmpsh项目从github上下载下来,把其中的icmpsh.exe上传到目标主机。
Linux作为攻击者服务器则需要安装python的impacket库,我的Parrot系统上已将安装好了。
1 |
|
run.sh脚本里获取网卡和ip地址的方法在我的系统里无效,于把获取命令稍微改了一下,我的网卡名是eth0。
1 |
|
接着以管理员权限运行run.sh脚本,输入目标主机的ip地址,复制给出的命令到目标主机运行。
目标主机执行命令后成功反弹shell。
其实直接运行项目下的icmpsh_m.py效果也是一样的,不过要先手动关闭ping命令的ICMP应答。
1 |
|
数据包分析
使用tcpdump抓下192.168.189.129和192.168.189.135之间的所有数据包。
1 |
|
用wireshark打开再去到的数据,可以看到两台主机之间的数据包的协议都是ICMP。
找到了对输入命令请求和响应的两个包,发现他们的内容都明文存储在ICMP报文的Data结构处。
杀软查杀情况
由于能够直接反弹shell,在virustotal几乎一半的厂商都报毒了。
使用源码从新编译的上传上去试试,只有一个厂商报毒。
ptunnel
与icmpsh一样,ptunnel也是基于ICMP协议的工具,但ptunnel是一个纯粹的ICMP隧道,能实现正向隧道的功能。经我测试icmpsh需要两台机器都是公网的才能反弹shell,ptunnel就没这个问题,但使用这个需要管理员权限。Kali和Parrot已有这个工具,也有Windows版,需要自己编译,但无论是我自己编译的,还是GitHub上编译好的都没法在Windows2012上运行,倒是能在Windows10上运行,不知道是不是编译环境的问题,还是他WinPcap库的问题。
自己编译要装好MinGW。
编译方法:把项目clone下来,再把WinPcap库下载下来,放到同一个项目文件夹里,在使用如下命令编译。
1 |
|
使用方法
反弹shell
服务端:
1 |
|
客户端:
1 |
|
服务的出现建立Session的字样既成功建立ICMP隧道。
现在测试下再目标主机反弹个shell,先在攻击者主机监听指定端口,然后再在目标主机用nc反弹个shell到本地监听的端口。注意顺序不对可能连接不上,玄学问题。
1 |
|
映射3389
既然都建立了ICMP隧道了,仅仅反弹个shell肯定是不够的,下面就试试内网3389通过ICMP隧道映射到外网。以下是拓扑图:
先在Attacker主机开启ptunnel。
1 |
|
再在Server主机ptunnel作为服务端开启本地监听端口。
1 |
|
接着在Attacker主机使用lcx类的工具,开启监听模式。这里的lcx类工具我使用的是NATBypass,用go编写,编译成不同可执行文件后可跨平台使用。
1 |
|
最后在Server主机使用slave模式,转发3389到ptunnel本地监听的端口。
1 |
|
出现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