Энциклопедия Windows
Все об использовании и настройке Windows
Отладка программного ядра Windows
Для проведения отладки ядра необходимо подключиться к компьютеру с помощью нуль-модемного кабеля или модемного соединения. Компьютер, выполняющий отладку, будет называться “Host”, а название “Target” получит проблемный компьютер.
Оба компьютера должны работать под управлением одной и той же версии Windows, а символьные файлы для компьютера Target должны быть установлены на компьютере Host. Символьные файлы предоставляются на установочном компакт-диске Windows в каталоге Support\Debug.
Для включения отладки необходимо внести изменения в файл BOOT.INI на компьютере Target.
1. Поменяйте атрибуты файла BOOT.INI:
attrib c:\boot.ini – r – s
2. Отредактируйте этот файл и в строку запуска Windows добавьте параметр /debug (для того, чтобы сообщить системе о необходимости загрузки в оперативную память отладчика ядра при загрузке Windows). Дополнительными параметрами являются /Debugport, сообщающий системе, какой порт COM необходимо использовать (по умолчанию COM2) и /Baudrate — для указания скорости передачи данных (по умолчанию указана скорость 19200 бод, но лучше использовать 9600). Например:
[operating systems]multi(0)disk(0)rdisk(0)partition(0)\WINDOWS=»Windows NT» /debug /debugport=com2 /baudrate=9600
4. Установите предыдущие атрибуты файла BOOT.INI:
attrib c:\boot.ini +r +s
В данном примере компьютер Target разрешил соединение через порт COM2 со скоростью 9600 бит/с.
Компьютер Host должен быть настроен с использованием параметров, необходимых для проведения отладки. Кроме того, должны быть установлены символьные файлы. Для их установки перейдите в каталог \support\debug на установочном компакт-диске и введите следующую команду:
expndsym f: d:\symbols
Установка может занять некоторое время. Помните, что если на компьютер Target были установлены пакеты обновлений, символьные файлы этих пакетов также следует установить на компьютер Host. Символьные файлы для пакетов обновлений можно загрузить с сайтега компании Microsoft.
Следующей стадией является настройка переменных окружения, необходимых для отладки, например, переменных, указывающих расположение символьных файлов и т.д. Далее представлено описание этих переменных.
Описание системных переменных
Порт COM, который должен использоваться для отладки (например, COM2)
Скорость соединения (например, 9600 бит/с). Убедитесь в том, что указанная скорость соответствует скорости, настроенной на целевом компьютере
Расположение символьных файлов (каталог, в который они были распакованы с помощью утилиты expndsym)
Имя файла, который будет использоваться для протоколирования сеансов отладки (необязательная переменная)
Определение этих переменных можно разместить в командном файле для того, чтобы избежать ввода соответствующих команд при каждой загрузке:
Эксплуатация уязвимостей уровня ядра в ОС Windows. Часть 1 – Настройка рабочей среды
В данном цикле статей мы рассмотрим написание эксплоитов уровня ядра в ОС Windows.
Автор: Mohamed Shahat
Эта серия статей появилась по двум причинам. Во-первых, мне нравится работать с проектом HackSysExtremeVulnerableDriver. Во-вторых, я получил массу пожеланий, чтобы осветить эту тему.
Весь код, используемый при написании этой серии, находится в моем репозитории.
В данном цикле статей мы рассмотрим написание эксплоитов уровня ядра в ОС Windows. Важно отметить, что мы будем иметь дело с известными уязвимостями, и в реверс-инжиниринге нет необходимости (по крайней мере, для драйвера).
Предполагается, что после ознакомления со всеми статьями вы будете знать все наиболее распространенные классы брешей и методы эксплуатации, а также сможете портировать эксплоиты с архитектуры x86 на архитектуру x64 (если возможно) и ознакомитесь с новыми методами защиты в Windows 10.
Схема отладки ядра
В отличие от отладки на уровне пользователя, когда приостанавливается выполнение отдельного процесса, на уровне ядра задействуется вся система, и мы не сможем воспользоваться этим методом. Соответственно, нужна отдельная отладочная машина, которая сможет осуществлять коммуникацию с системой, где отлаживается ядро, просматривать память и структуры ядра, а также отлавливать крахи системы.
Дополнительный материал для изучения:
Эксплуатация уязвимостей ядра
Этот процесс проходит намного веселее, чем эксплуатация на уровне пользователя J.
Главная цель – добиться привилегированного выполнения в контексте ядра. А дальше уже все зависит от нашего воображения, начиная от застолья с домашним пивом и заканчивая внедрением вредоносов, спонсируемых государством.
В целом, наша задача заключается в том, чтобы получить шелл с системными привилегиями.
Темы статей этого цикла
- Часть 1: Настройка рабочей среды
- Конфигурирование трех виртуальных машин и системы, которая будет выступать в роли отладчика.
- Конфигурирование отладчика WinDBG.
- Часть 2: Полезные нагрузки
- Изучение наиболее распространенных полезных нагрузок. В последующих частях будут рассматриваться конкретные уязвимости и, при необходимости, указываться ссылки на эту статью.
- Остальные части.
- Рассмотрение уязвимостей.
Жизненный цикл разработки эксплоита уровня ядра
- Нахождение уязвимости. Эта тема не будет рассматриваться в данном цикле, поскольку мы уже точно знаем, где находятся бреши.
- Перехват потока выполнения. Некоторые уязвимости предусматривают выполнение кода, для некоторых есть дополнительные требования.
- Расширение привилегий. Главная цель – получить шелл с системными привилегиями.
- Восстановление потока выполнения. Неучтенные исключения на уровне ядра приводят к краху системы. Если вы не собираетесь писать эксплоит для DoS-атаки, следует учитывать этот факт.
Типы целевых систем
Мы будем работать с уязвимостями в следующих системах (конкретная версия не принципиальна):
- Win7 x86 VM
- Win7 x64 VM
- Win10 x64 VM
Начнем с архитектуры x86, и далее будем портировать эксплоит для системы Win7 x64. Некоторые эксплоиты не будут запускать на машинах с Win10 из-за присутствия новых защит. В этом случае мы либо будем изменять логику работы эксплоита, либо будем использовать полностью другой подход.
Используемое программное обеспечение:
Настройка систем для отладки
Отладочные системы, с которыми мы будем взаимодействовать, предназначены для загрузки уязвимого драйвера. На этих машинах часто будут возникать крахи, поскольку большинство исключений в ядре способствуют явлениям подобного рода. Необходимо выделить достаточно оперативной памяти для этих систем.
На каждой машине, которая будет отлаживаться, нужно сделать следующее:
- Внутри директории VirtualKD запустите файл target\vminstall.exe. Добавится новая загрузочная запись и будут доступны функции отладки и автоматическое подключение к серверу VirtualKD, установленному в системе, которая выступает в роли отладчика.
В случае с Windows 10 VM необходимо включить режим test signing, который позволяет загружать неподписанные драйвера в ядро.
После выполнения команды bcdedit /set testsinging on и перезагрузки на рабочем столе появится надпись «Test Mode».
- Запустите OSR Driver Loader. Зарегистрируйте и запустите службу. Возможно, потребуется перезагрузка.
- Установите дополнения на гостевой виртуальной машине (необязательное условие).
- Добавьте учетную запись с низкими привилегиями, которая понадобится во время эксплуатации.
C:\Windows\system32>net user low low /add
The command completed successfully.
Настройка отладчика
В системе, которая будет выступать в роли отладчика, будет использоваться WinDBG. Вы сможете инспектировать память, структуры данных и при необходимости выполнять манипуляции. Наличие удаленной отладочной сессии во время падения целевой системы позволит нам подключаться к виртуальной машине и анализировать крахи.
Хост VirtualKD будет выполнять коммуникацию автоматически через именованный канал, вместо установки соединения вручную. Если вы отлаживаете через сеть в Win10 VM, потребуется протестировать соединение вручную.
- Установите Windows SDK. Вы можете выбрать только «Debugging Tools for Windows».
- Проверьте, что установлен отладчик WinDBG. По умолчанию используется папка C:\Program Files (x86)\Windows Kits\10\Debuggers.
Добавьте этот путь в качестве системного и установите путь к отладчику в VirtualKD
Перезапустите гостевые виртуальные машины. Система с VirtualKD, используемая в качестве отладчика, должна быть запущена. После перезагрузки вы сможете начать сессию в WinDBG.
Настройка WinDBG
Если все настроено корректно, WinDBG поставит выполнение на паузу и отобразит некоторую информацию, касающуюся целевой системы.
Рисунок 1: Остановка выполнения кода ядра
Символы содержат отладочную информацию для множества бинарных файлов в ОС Window. Загрузить символы можно при помощи следующей команды:
Включаем режим подробного информирования процесса отладки.
ed nt!Kd_Default_Mask 0xf
Должен загрузиться модуль HEVD:
kd> lm m HEVD
Browse full module list
start end module name
fffff80b`92b50000 fffff80b`92b59000 HEVD (deferred)
Сохраняем настройки профиля и любые изменения рабочей среды:
File -> Save Workspace to File
Введите команду g или нажмите клавишу F5 для продолжения выполнения (перечень других команд, которые вам могут пригодиться, хорошо описан в этом документе).
Краткое описание модуля HEVD
Процедура DriverEntry является стартовой для каждого драйвера:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) <
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
UNICODE_STRING DeviceName, DosDeviceName = <0>;
- Эта процедура содержит вызов функции IoCreateDevice, содержащей имя драйвера, которое мы будем использовать во время коммуникации.
- В объект DriverObject будут добавлены нужные структуры и указатели на функции.
- Для нас важен указатель функции, связанный с процедурой DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL], отвечающей за обработку IOCTL (I/O Control; управление вводом/выводом);
- В HEVD эта функция называется IrpDeviceIoCtlHandler, которая представляет собой большое условное выражение со множеством ответвлений для каждого IOCTL. Каждая уязвимость имеет уникальный IOCTL.
Пример: HACKSYS_EVD_IOCTL_STACK_OVERFLOW представляет собой IOCTL, используемый для активации бреши, связанной с переполнением стека.
На этом первая часть завершается. В следующей статье мы поговорим о полезных нагрузках. На данный момент доступна только полезная нагрузка, предназначенная для кражи токенов, которая будет использоваться в третьей части.
P.S. Я понимаю, что существует масса тонкостей и проблем, с которыми вы можете столкнуться. Поскольку в этом цикле основное внимание уделяется разработке эксплоитов, вам придется решать все попутные проблемы самостоятельно. Однако все возникающие вопросы вы можете задавать в комментариях.
Подписывайтесь на каналы «SecurityLab» в Telegram и
Twitter, чтобы первыми узнавать о новостях и эксклюзивных материалах по информационной безопасности.
Эксплуатация уязвимостей уровня ядра в ОС Windows. Часть 1 – Настройка рабочей среды
В данном цикле статей мы рассмотрим написание эксплоитов уровня ядра в ОС Windows.
Автор: Mohamed Shahat
Эта серия статей появилась по двум причинам. Во-первых, мне нравится работать с проектом HackSysExtremeVulnerableDriver . Во-вторых, я получил массу пожеланий , чтобы осветить эту тему.
Весь код, используемый при написании этой серии, находится в моем репозитории .
В данном цикле статей мы рассмотрим написание эксплоитов уровня ядра в ОС Windows. Важно отметить, что мы будем иметь дело с известными уязвимостями, и в реверс-инжиниринге нет необходимости (по крайней мере, для драйвера).
Предполагается, что после ознакомления со всеми статьями вы будете знать все наиболее распространенные классы брешей и методы эксплуатации, а также сможете портировать эксплоиты с архитектуры x86 на архитектуру x64 (если возможно) и ознакомитесь с новыми методами защиты в Windows 10.
Схема отладки ядра
В отличие от отладки на уровне пользователя, когда приостанавливается выполнение отдельного процесса, на уровне ядра задействуется вся система, и мы не сможем воспользоваться этим методом. Соответственно, нужна отдельная отладочная машина, которая сможет осуществлять коммуникацию с системой, где отлаживается ядро, просматривать память и структуры ядра, а также отлавливать крахи системы.
Дополнительный материал для изучения:
Эксплуатация уязвимостей ядра
Этот процесс проходит намного веселее, чем эксплуатация на уровне пользователя J.
Главная цель – добиться привилегированного выполнения в контексте ядра. А дальше уже все зависит от нашего воображения, начиная от застолья с домашним пивом и заканчивая внедрением вредоносов, спонсируемых государством.
В целом, наша задача заключается в том, чтобы получить шелл с системными привилегиями.
Темы статей этого цикла
- Часть 1: Настройка рабочей среды
- Конфигурирование трех виртуальных машин и системы, которая будет выступать в роли отладчика.
- Конфигурирование отладчика WinDBG.
- Часть 2: Полезные нагрузки
- Изучение наиболее распространенных полезных нагрузок. В последующих частях будут рассматриваться конкретные уязвимости и, при необходимости, указываться ссылки на эту статью.
- Остальные части.
Жизненный цикл разработки эксплоита уровня ядра
- Нахождение уязвимости . Эта тема не будет рассматриваться в данном цикле, поскольку мы уже точно знаем, где находятся бреши.
- Перехват потока выполнения . Некоторые уязвимости предусматривают выполнение кода, для некоторых есть дополнительные требования.
- Расширение привилегий . Главная цель – получить шелл с системными привилегиями.
- Восстановление потока выполнения . Неучтенные исключения на уровне ядра приводят к краху системы. Если вы не собираетесь писать эксплоит для DoS-атаки, следует учитывать этот факт.
Типы целевых систем
Мы будем работать с уязвимостями в следующих системах (конкретная версия не принципиальна):
- Win7 x86 VM
- Win7 x64 VM
- Win10 x64 VM
Начнем с архитектуры x86, и далее будем портировать эксплоит для системы Win7 x64. Некоторые эксплоиты не будут запускать на машинах с Win10 из-за присутствия новых защит. В этом случае мы либо будем изменять логику работы эксплоита, либо будем использовать полностью другой подход.
Используемое программное обеспечение:
Настройка систем для отладки
Отладочные системы, с которыми мы будем взаимодействовать, предназначены для загрузки уязвимого драйвера. На этих машинах часто будут возникать крахи, поскольку большинство исключений в ядре способствуют явлениям подобного рода. Необходимо выделить достаточно оперативной памяти для этих систем.
На каждой машине, которая будет отлаживаться, нужно сделать следующее:
- Внутри директории VirtualKD запустите файл target\vminstall.exe. Добавится новая загрузочная запись и будут доступны функции отладки и автоматическое подключение к серверу VirtualKD, установленному в системе, которая выступает в роли отладчика.
В случае с Windows 10 VM необходимо включить режим test signing, который позволяет загружать неподписанные драйвера в ядро.
После выполнения команды bcdedit /set testsinging on и перезагрузки на рабочем столе появится надпись «Test Mode».
- Запустите OSR Driver Loader. Зарегистрируйте и запустите службу. Возможно, потребуется перезагрузка.
- Установите дополнения на гостевой виртуальной машине (необязательное условие).
- Добавьте учетную запись с низкими привилегиями, которая понадобится во время эксплуатации.
C:\Windows\system32>net user low low /add
The command completed successfully.
В системе, которая будет выступать в роли отладчика, будет использоваться WinDBG. Вы сможете инспектировать память, структуры данных и при необходимости выполнять манипуляции. Наличие удаленной отладочной сессии во время падения целевой системы позволит нам подключаться к виртуальной машине и анализировать крахи.
Хост VirtualKD будет выполнять коммуникацию автоматически через именованный канал, вместо установки соединения вручную. Если вы отлаживаете через сеть в Win10 VM, потребуется протестировать соединение вручную.
- Установите Windows SDK . Вы можете выбрать только «Debugging Tools for Windows».
- Проверьте, что установлен отладчик WinDBG. По умолчанию используется папка C:\Program Files (x86)\Windows Kits\10\Debuggers.
Добавьте этот путь в качестве системного и установите путь к отладчику в VirtualKD
Перезапустите гостевые виртуальные машины. Система с VirtualKD, используемая в качестве отладчика, должна быть запущена. После перезагрузки вы сможете начать сессию в WinDBG.
Если все настроено корректно, WinDBG поставит выполнение на паузу и отобразит некоторую информацию, касающуюся целевой системы.
Рисунок 1: Остановка выполнения кода ядра
Символы содержат отладочную информацию для множества бинарных файлов в ОС Window. Загрузить символы можно при помощи следующей команды:
Включаем режим подробного информирования процесса отладки.
ed nt!Kd_Default_Mask 0xf
Должен загрузиться модуль HEVD:
kd> lm m HEVD
Browse full module list
start end module name
fffff80b`92b50000 fffff80b`92b59000 HEVD (deferred)
Сохраняем настройки профиля и любые изменения рабочей среды:
File -> Save Workspace to File
Введите команду g или нажмите клавишу F5 для продолжения выполнения (перечень других команд, которые вам могут пригодиться, хорошо описан в этом документе ).
Краткое описание модуля HEVD
Процедура DriverEntry является стартовой для каждого драйвера:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) <
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
UNICODE_STRING DeviceName, DosDeviceName = <0>;
- Эта процедура содержит вызов функции IoCreateDevice, содержащей имя драйвера, которое мы будем использовать во время коммуникации.
- В объект DriverObject будут добавлены нужные структуры и указатели на функции.
- Для нас важен указатель функции, связанный с процедурой DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] , отвечающей за обработку IOCTL (I/O Control; управление вводом/выводом);
- В HEVD эта функция называется IrpDeviceIoCtlHandler , которая представляет собой большое условное выражение со множеством ответвлений для каждого IOCTL. Каждая уязвимость имеет уникальный IOCTL.
Пример: HACKSYS_EVD_IOCTL_STACK_OVERFLOW представляет собой IOCTL, используемый для активации бреши, связанной с переполнением стека.
На этом первая часть завершается. В следующей статье мы поговорим о полезных нагрузках. На данный момент доступна только полезная нагрузка, предназначенная для кражи токенов, которая будет использоваться в третьей части.