游客发表

icmp etherleak 信息泄露漏洞

发帖时间:2026-10-17 04:40:14

2018年某次内部渗透测试,信息泄我用一条ICMP隧道把目标内网的露漏核心交换机配置文件传了出来。整个过程没触发任何IDS告警,信息泄防火墙也没拦——因为流量全是露漏"正常"的ping包。这不是信息泄什么高级APT手法,就是露漏一个ICMP Etherleak漏洞的经典利用场景。很多人以为ICMP只是信息泄用来ping一下测连通性,但它的露漏载荷字段足够把整个内网的数据慢慢搬空。

ICMP协议本身设计得极其简单。信息泄类型、露漏代码、信息泄校验和,露漏再加上4字节的信息泄头部剩余字段,后面就是露漏数据区。问题出在数据区。信息泄早期RFC 792对ICMP数据区的内容没有严格规定,很多操作系统在回复ICMP请求时,会把内核内存里的一块缓冲区直接塞进回复包。这块缓冲区里可能残留着前一个数据包的内容——以太网帧头、IP头、甚至TCP会话的片段。这就是Etherleak这个名字的由来:泄露的是以太网层的数据。

2003年,Ofir Arkin和Josh Anderson在@stake实验室发布了一份关于ICMP Etherleak的技术报告。他们发现Linux 2.2/2.4、Solaris 8、HP-UX 11等系统在响应ICMP timestamp请求时,回复包的数据区会多出一些"不该有"的字节。这些字节不是随机垃圾,而是之前处理过的以太网帧的残留。攻击者只需要发一个构造好的ICMP包,就能从回复里读到目标机器最近处理过的网络数据。信息泄露的严重程度取决于那块内存里刚好有什么——可能是ARP缓存,可能是某个TCP握手的SYN包,也可能是内网某台服务器的HTTP请求头。

实际利用没那么玄乎。我见过一个案例:某企业内网的一台旧版Solaris服务器存在Etherleak,攻击者持续发送ICMP timestamp请求,从回复的残留数据里拼出了内网数据库的IP和端口。因为那块内存反复被不同的网络包覆盖,多请求几次就能拿到不同片段。这就像从碎纸机里捡纸条,单张没意义,攒多了就能还原文件。

防御层面,最直接的办法是升级系统。现代Linux内核(2.6以后)和Windows都已经修复了这个问题,ICMP回复包的数据区会被正确填充或清零。但如果内网还有老旧的网络设备、嵌入式系统、工业控制设备,它们可能跑着十几年前的内核。这些设备往往不能随便升级,因为升级可能影响业务连续性。我的建议是:在边界防火墙上限制ICMP类型,只放行echo request/reply,把timestamp、address mask这些冷门类型直接drop掉。内网如果没必要,也可以限制ICMP。有人会说这样影响troubleshooting,但比起数据泄露,少ping几下不算什么。

另一个容易被忽略的点:ICMP隧道。即使Etherleak被修复了,攻击者仍然可以用ICMP的data字段封装任意数据。ping包的大小可以到65507字节,足够传文件。检测这种隧道不能只看ICMP类型,得看包的长度分布和频率。正常的ping包长度固定(Windows默认32字节,Linux默认56字节),如果发现大量长度异常的ICMP包,或者ICMP流量突然增大,那就得查一查了。

我个人的观察是,很多安全团队对ICMP的监控几乎为零。防火墙规则里ICMP往往是any any any,日志里也不记录ICMP载荷。这给了攻击者极大的操作空间。Etherleak本身是个老漏洞,但它揭示的问题至今有效:协议设计时的宽松假设,在 adversarial 环境下就是攻击面。ICMP不是只有ping,它的每一个字段都值得仔细看看。

    热门排行

    友情链接