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

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

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

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

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

Категории

Все категории
Loading categories
NotSecDrv — PoC для CVE-2018-7249 | Kitploit
Инструменты/GitHubGitHub/alonhr/notsecdrv
Криминалистика памятиАнализ уязвимостейЭксплуатацияОбратная инженерияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubalonhr/notsecdrv

NotSecDrv

PoC для CVE-2018-7249

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

Популярное

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

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

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

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

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

NotSecDrv - PoC-код для CVE-2018-7249

Общее описание

Проблема была обнаружена в secdrv.sys, поставляемом в Microsoft Windows Vista, Windows 7, Windows 8 и Windows 8.1 до KB3086255, а также в Macrovision SafeDisc. Два правильно синхронизированных вызова IOCTL 0xCA002813 могут вызвать состояние гонки, приводящее к use-after-free. При эксплуатации непривилегированный злоумышленник может выполнить произвольный код в режиме ядра.

Уязвимость была сообщена Microsoft, и, поскольку она не затрагивает обновлённые системы Windows (только версии до KB3086255), они не будут принимать никаких мер. Была протестирована и успешно эксплуатирована на Windows 7 x86.

Также связана с CVE-2018-7250.

Скриншот

Alt text

Подробности

Этот документ описывает моё небольшое исследование драйвера secdrv.sys. Все описанные поведения драйвера были получены с помощью реверс-инжиниринга и могут быть неверными или неточными.

Смещение 0x4 входного буфера IOCTL (0x0CA002813) содержит число, которое я буду называть TYPE. Основная функция-обработчик этого IOCTL (0x0CA002813), sub_11A88, принимает 3 различных типа: 0x96, 0x97 и 0x98.

  • 0x96 выделяет блок PagedPool, сохраняет его в массиве размером 0x64, инициализирует его (вроде как :)) и копирует его часть в буфер, предоставленный пользователем, по смещению 0x10.
  • 0x97 использует ранее выделенный блок, который был выделен с типом 0x96 (он находит нужный блок в упомянутом массиве по тегу) и использует его для шифрования пользовательского входного буфера с помощью некоей модифицированной XOR-шифровальной процедуры. Затем он вызывает функцию, которая хранится в другой структуре, на которую указывает поле в выделенном блоке.
  • 0x98 освобождает блок, выделенный с типом 0x96. Он находит нужный блок, ища тег, переданный ему в процессе выделения.

Утечка информации (CVE-2018-7250)

После того, как IOCTL типа 0x96 выделил новый блок и инициализировал его, но не полностью, он копирует блок в пользовательский режим. 16 бит в новом выделенном блоке не были инициализированы и содержат данные от предыдущих выделений PagedPool. Эти неинициализированные биты затем копируются в пользовательский режим по адресу .text:00011BE9 инструкцией REP MOVSD. PoC-код здесь.

Произвольное выполнение кода (CVE-2018-7249)

Когда вызывается IOCTL типа 0x97, он находит нужный блок, ранее выделенный с типом 0x96, по его тегу. Если блок уже освобождён IOCTL типа 0x97, DeviceIoControl возвращает ошибку. Уязвимость в том, что блок, используемый типом 0x97, может быть освобождён ВО ВРЕМЯ его работы (поскольку не используются механизмы синхронизации), что приводит к использованию после освобождения, если гонка будет выиграна. Если злоумышленнику удастся освободить блок во время работы IOCTL типа 0x97 (используя тип 0x98) и выделить новый блок, контролируемый им, в точно то же место в памяти, он может перезаписать указатель на другую структуру, содержащую указатель на функцию, который может быть использован для перехвата потока выполнения драйвера и выполнения произвольного кода в ring 0. Поскольку процедура шифрования выполняется над пользовательским буфером, который может быть огромного размера, шифрование может выполняться долго, что даёт идеальное временное окно для IOCTL типа 0x98, чтобы освободить блок, пока он ещё используется. Временное окно может быть настолько большим (более 1 секунды!), что гонка может быть надёжно выиграна с первой попытки. Use-after-free начинается по адресу .text:00011B68, а фактический вызов, который будет перехвачен для перехода к shellcode, происходит по адресу .text:00011B86.

Шаги для успешной эксплуатации этой уязвимости следующие:

  • Освободить все предыдущие блоки с тегом, который мы планируем использовать позже, убедившись, что все IOCTL работают с одним и тем же блоком PagedPool.
  • Заспамить (spray) PagedPool и создать дырки, соответствующие размеру выделений в IOCTL типа 0x96 (0x30 байт). Это необходимо для того, чтобы позже надёжно выделить поддельную замену вместо освобождённого блока.
  • Выделить блок с помощью IOCTL типа 0x96. Этот блок будет выделен в одной из ранее созданных дырок.
  • Выделить большую область пользовательской памяти и вызвать IOCTL типа 0x97. Большая область памяти гарантирует, что поток, освобождающий выделение, будет иметь достаточно времени, чтобы выиграть гонку.
  • Запустить новый поток, который вызовет IOCTL типа 0x98 и освободит блок, с которым работает другой поток.
  • Снова заспамить пул из нового потока (после освобождения блока), чтобы заменить освобождённый блок на контролируемое злоумышленником выделение. Этот поддельный блок должен содержать валидные указатели на необходимые структуры.
  • Поместить адрес shellcode в правильное смещение указателя на функцию в созданной поддельной структуре и дождаться его вызова (он будет вызван из IOCTL типа 0x97 после завершения шифрования).
  • Наслаждаться!

Тестовая среда

ОС: Windows 7 Kernel Version 7600 MP (1 procs) Free x86 compatible Built by: 7600.16385.x86fre.win7_rtm.090713-1255 ВМ: 4GB RAM, 1 CPU Оборудование: Windows 10 Pro 64 bit, Motherboard Gigabyte Z370 HD3, 16GB RAM, Intel i5-8400 2.80GHz (6 CPUs)

Скачать инструмент