1. 引言
1.1. 实验目的
-
掌握PingTunnel搭建ICMP隧道的步骤
-
掌握PingTunnel的使用方法及应用场景
1.2. 实验内容
-
PingTunnel及相关依赖环境的安装
-
用PingTunnel搭建ICMP隧道
2. 基础知识
2.1. ICMP协议简介
Internet Control Message Protocol Internet控制报文协议,简称ICMP协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用于网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
CMP协议主要提供两种功能,一种是差错报文,一种是信息类报文。信息类报文包括回显请求和回显应答,以及路由器通告和路由器请求。常见的差错报文类型包括目的不可达、重定向、超时和参数问题。
ICMP协议具有如下特点:
-
确认IP数据包是否成功到达目的地
-
通知源主机发送IP数据包丢失的原因
-
ICMP是基于IP协议工作的
-
ICMP只能作用于IPV4,IPV6下,使用ICMPv6
2.2. ICMP隧道简介
ICMP协议是一种特殊的协议,在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。最常见的ping命令就是利用的ICMP协议,攻击者可以利用命令行得到比回复更多的ICMP请求。在通常情况下,每个ping命令都有相应的回复与请求。
在一些网络环境中,如果攻击者使用各类上层隧道(例如:HTTP隧道、DNS隧道、常规正/反向端口转发等)进行的操作都失败了,常常会通过ping命令访问远程计算机,尝试建立ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,从而穿过防火墙(防火墙一般不会屏蔽ping的数据包),实现不受限制的访问访问。
由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。
通常ICMP隧道技术采用ICMP的ICMP_ECHO和ICMP_ECHOREPLY两种报文,把数据隐藏在ICMP数据包包头的选项域中,利用ping命令建立隐蔽通道。简单说就是,改变操作系统默认填充的Data,替换成我们自己的数据。所以现在的ICMP隧道技术,基本采用修改ICMPECHO和ICMPECHOREPLY两种报文,把消息隐藏在数据中,利用ping或 tracert 命令建立隐蔽通道。
ICMP隧道具有如下优缺点
优点:
-
防火墙对ICMP_ECHO数据包是放行的,并且内部主机不会检查ICMP数据包所携带的数据内容,隐蔽性高
缺点:
-
lCMP隐蔽传输是无连接的,传输不是很稳定,而且隐蔽通道的带宽很低。
-
利用隧道传输时,需要接触更低层次的协议,这就需要高级用户权限。
2.3. ICMP隧道搭建工具介绍
ICMP隧道搭建的工具有很多,包括但不限于以下工具:
-
PingTunnel:http://www.cs.uit.no/~daniels/PingTunnel/ 【C语言】
-
Pingtunnel:https://github.com/esrrhs/pingtunnel/ 【Go语言】
-
icmptunnel:https://github.com/jamesbarlow/icmptunnel 【C语言】
-
Icmpsh:https://github.com/bdamele/icmpsh 【多语言混合】
-
Invoke-PowerShellIcmp:
-
https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellIcmp.ps1 【Powershell】
2.4. PingTunnel简介
PingTunnel是一个基于网络层面ICMP协议的内网穿透工具,常用于搭建ICMP隧道,为了避免隧道被滥用,还可以为隧道设置密码。PingTunnel可以传递以下参数:
-
-x :指定ICMP隧道连接的验证密码
-
-lp:指定要监听的本地TCP端口
-
-da:指定要转发的目标机器的IP地址
-
-dp:指定要转发的目标机器的TCP端口
-
-p:指定ICMP隧道连一段的IP地址
3. 实验过程
3.1. 前置准备
网络拓扑如下:
物料清单如下:
-
Kali Linux攻击机:192.168.161.142(Host-Only模式)
-
Win10攻击机:192.168.161.144(Host-Only模式)
-
CentOS7 Web服务器:192.168.161.2(Host-Only模式)192.168.27.252(NAT模式)
-
Win7内网PC机:192.168.27.248(NAT模式)
-
Ubuntu 16.04 内网PC机:192.168.27.251(NAT模式)
Host-Only模式模拟互联网、NAT模式模拟内网。CentOS7模拟企业对外提供的Web服务器,该机器是双网卡,可以通内网,同时向互联网提供Web服务。
实验场景为:我们已经获取了该Web服务器的权限,试图搭建ICMP隧道,连接内网Win7的3389端口和Ubuntu 16.04的22端口,进行内网横移。
该实验中,CentOS 7 充当跳板机,内网的Win 7 和 Ubuntu 16.04 是我们的两台靶机。
3.2. PingTunnel搭建ICMP隧道步骤
3.2.1. CentOS 7更换阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
非阿里云ECS用户防止出现 Couldn't resolve host 'mirrors.cloud.aliyuncs.com' 信息,需执行如下命令:
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
执行如下命令:
sudo rpm --rebuilddb 重新安装包头数据库索引目录
sudo yum clean al 清理所有yum缓存
Sudo yum -y updat 安装所有更新软件
3.2.2. CentOS 7安装make及词法分析工具
yum -y install gcc automake autoconf libtool make
yum -y install byacc flex bison
3.2.3. CentOS 7安装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
sudo ./configure
sudo make && sudo make install
3.2.4. CentOS 7安装PingTunnel
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -xzvf PingTunnel-0.72.tar.gz
cd PingTunnel
sudo make && sudo make install
3.2.5. CentOS 7启动ptunnel
sudo ptunnel -x icmptest
-x为隧道指定连接密码
3.2.6. Kali Linux桥接模式上网
为了能够让Kali Linux在实验环境上网,便于我后面可以使用apt-get命令安装软件。我新增了块网卡,采用桥接模式,因此多出来一个IP:192.168.110.101。
3.2.7. Kali Linux更换阿里源
修改 /etc/apt/sources.list , 将相关 url 改成阿里云的源。
deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib
执行命令:sudo apt-get update
3.2.8. Kali Linux安装词法分析工具
sudo apt-get install byacc flex bison
3.2.9. Kali Linux安装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
sudo ./configure
sudo make && sudo make install
3.2.10. Kali Linux安装PingTunnel
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -xzvf PingTunnel-0.72.tar.gz
cd PingTunnel
sudo make && sudo make install
3.2.11. Kali Linux打通隧道
sudo ptunnel -p 192.168.161.2 -lp 2899 -da 192.168.27.248 -dp 3389 -x icmptest
命令解释:将内网IP为192.168.27.248的win7 PC机器的3389端口转发到互联网IP为Kali 192.168.161.2的2899端口,建立icmp隧道,并设置连接密码为icmptest
sudo ptunnel -p 192.168.161.2 -lp 2822 -da 192.168.27.251 -dp 22 -x icmptest
命令解释:将内网IP为192.168.27.251的ubuntu PC机器的22端口转发到互联网IP为Kali 192.168.161.2的2822端口,建立icmp隧道,并设置连接密码为icmptest
3.2.12. Win 10测试3389连接
用win10 攻击机,连接Kali Linux的2899端口,192.168.161.142:2899,通过隧道登录到win7靶机。
3.2.13. Kali Linux测试22端口连接
ssh -p 2822 [email protected]
用Kali Linux 攻击机,连接本机的2822端口,通过隧道登录到ubuntu 16.04靶机。
3.2.14. CentOS 7隧道观测
ICMP隧道的建立,其实是在CentOS7上建立了一个虚拟网卡。通过创建虚拟网卡,将所有流量都经过这个虚拟网卡。
通过隧道的连接记录我们可以看到,一共有两个session。一个是连接到内网win7的,一个是连接到内网ubuntu 16.04的。
4. 实验总结
4.1. 总结
我们在CentOS 7 这个跳板机上安装了PingTunnel,并启动server端。在Kali Linux这个攻击机上也安装了PingTunnel,并启动client端。利用PingTunnel,我们在攻击机Kali Linux和跳板机CentOS 7上建立了ICMP隧道。之后我们分别通过Win10和Kali Linux这两台攻击机,去连接内网的Win7和Ubuntu 16.04这两台靶机。
4.2. 参考连接
https://cloud.tencent.com/developer/article/2098581
https://blog.csdn.net/qq_45300786/article/details/110943803
原文始发于微信公众号(Roc安全空间站):隐秘通信-使用PingTunnel搭建ICMP隧道实验
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论