Содержание статьи
- Отладка через COM-порт
- Отладка по сети
- Отладка с использованием встроенных возможностей vmwp.exe
- Отладка через протокол GDB
- Отладка эмулятора Windows 10X
- Отладка Hyper-V c помощью подмененного загрузчика
- Отладка secure kernel
- Отладка с помощью Radare2
- Radare2 и интерфейс dbgeng.dll
- Radare2 и встроенный протокол
- Cutter
- QEMU
- Ghidra + плагин ret-sync
- Загрузка гипервизора
- Поиск символьной информации
- Утилиты
- Гипервызовы
- Вывод
Гипервизор компании Microsoft используется в большом числе компонентов Windows и, как любой сложный продукт, не лишен допущенных при разработке ошибок. Число уязвимостей, найденных в этом продукте только в 2020 году, составило 21.
Для Hyper-V Microsoft предлагает отдельную программу баг‑баунти, размер выплат которой может достигать 250 тысяч долларов. Однако стоит упомянуть, что Microsoft не работает со странами, которые находятся в санкционном списке США. Россия формально присутствует в этом списке, поэтому следует проявлять осмотрительность, когда отправляешь информацию об уязвимостях в Microsoft, если ты еще ни разу не получал вознаграждение напрямую от вендора. Лучше воспользоваться услугами посредника, иначе ты можешь столкнуться с тем, что обнаруженная тобою уязвимость вдруг одновременно будет найдена другой компанией или исследователем. И неважно, что уязвимость оставалась в продукте несколько лет (этот вариант был проверен на практике).
Чтобы искать уязвимости в Hyper-V, нужно владеть методами отладки этого гипервизора. Актуальные способы отладки и будут темой сегодняшней статьи. Для этих целей можно использовать эмуляторы, поддерживающие вложенную виртуализацию (такие как VMware Workstation или сам Hyper-V), либо обычный компьютер или ноутбук.
Термины
-
Гипервизор — компонент Hyper-V, отвечающий за функционирование подсистемы аппаратной виртуализации процессора (
hvix64.
— Intel,exe hvax64.
— AMD,exe hvaa64.
— ARM). В статье рассматривается гипервизор для процессоров Intel.exe -
Гипервызов (hypercall) — вызов заданной функции в гипервизоре с помощью инструкции
vmcall/
(в зависимости от производителя процессора).vmmcall/ hvc - Root-раздел — Windows Server 2019 с включенным компонентом Hyper-V.
- Гостевой раздел (виртуальная машина, ВМ) — операционная система, запущенная в системе виртуализации Hyper-V.
- VMCS (virtual-machine control structure) — структура, определяющая логику работы гипервизора.
- VMX root — режим, в котором работает гипервизор.
- VMX non-root — режим, в котором работает операционная система и обслуживаемое ею прикладное программное обеспечение.
- VM exit — переход из VMX non-root в VMX root при выполнении инструкций или условий, заданных в VMCS или заложенных непосредственно в логику работы процессора.
Отладка через COM-порт
Hyper-V состоит из нескольких компонентов, краткое описание его структуры можно найти в документации. Для отладки компонентов Hyper-V ты можешь использовать WinDbg либо другой отладчик пользовательского режима или режима ядра, однако для подключения непосредственно к гипервизору необходимо выполнить несколько дополнительных шагов, чтобы настроить рутовый раздел.
Для отладки гипервизора Microsoft разработала специальное расширение WinDbg hvexts.
, которое, к сожалению, не входит в дистрибутив и доступно только партнерам Microsoft (поскольку этому расширению требуются символы для модуля гипервизора, которые Microsoft не предоставляет). Также в каталоге winxp
, находящемся в папке WinDbg, есть расширение nvkd.
, которое предназначено для отладки расширений виртуального коммутатора Hyper-V.
Файл справки WinDbg содержит описание отладки гипервизора через COM-порт (отладка Hyper-V через нуль‑модемное кабельное соединение в файле debugger.
), подразумевающее наличие двух физических машин. Также гипервизор можно отладить, если запустить его в любом поддерживаемом программном обеспечении виртуализации. Далее мы будем использовать VMware Workstation.
Для начала нужно установить Windows Server 2019 в качестве гостевой ОС и включить компонент Hyper-V. Если напрямую подключиться к виртуальному COM-порту VMware, то при коммуникации пойдут ошибки обмена пакетов (сложно сказать, с чем это связано). Используй какую‑нибудь бесплатную утилиту эмуляции COM-порта для стабилизации соединения (я установил утилиту эмулятора COM-порта Free Virtual Serial Ports от HHD-software версии 3.32. Последняя версия 4.12 выдает ошибки, когда vmdemux пытается открыть COM-порт).
Общий порядок действий таков.
-
Создай COM-порт для виртуальной машины VMware (Hardware → Add → Serial port → Use named pipe). Введи
\\.\
.pipe\ com_1 -
Для настройки отладки введи в командной строке опции отладки гипервизора:
bcdedit /hypervisorsettings serial DEBUGPORT:1 BAUDRATE:115200bcdedit /set hypervisordebug onЗатем нужно ввести параметры отладки хостовой ОС (будет использован тот же COM-порт):
bcdedit /set dbgtransport kdhvcom.dllbcdedit /dbgsettings serial DEBUGPORT:1 BAUDRATE:115200bcdedit /debug onДополнительно (для отладки загрузки гипервизора — см. соответствующий раздел статьи):
Bcdedit /set bootdebug onНиже приведен список модулей отладки, присутствующих в Windows:
kdcom.dllkdhvcom.dllkd1934.dllkdhv1394.dllkdusb.dllkdnet.dll (разные производители сетевых карт — разные модули)kd.dllВ нашем случае мы используем
kdhvcom.
.dll Перезагрузи Windows Server 2019. Загрузка остановится и будет ждать подключения отладчика.
-
Открой HHD software Free Virtual Serial Ports, выбери File, затем Create Pipe Port. В поле Pipe name укажи то же значение, что было раньше заполнено для виртуальной машины, —
\\.\
. Чекбокс Create pipe должен быть отключен (в противном случае будет создан новый именованный канал, а не выполнено подключение к существующему). Нажми OK.pipe\ com_1 Виртуальный COM-порт нужно создавать после запуска виртуальной машины, иначе ты увидишь ошибку, что канал не был создан (VMware создает канал после запуска ВМ).
-
Запусти утилиту vmdemux (находится в папке с WinDbg x64) с указанием имени только что созданного COM-порта в качестве одного из параметров:
vmdemux.exe -src com:port=com2,baud=115200Утилита создаст два именованных канала:
Vm0
для гипервизора иVm1
для root-раздела. -
Ты можешь подключить WinDbg Preview к каждому каналу для тестирования:
WinDBGx.exe -k com:port=\\.\pipe\Vm1,pipe,reconnect,resets=0 – root-разделWinDBGx.exe -k com:port=\\.\pipe\Vm0,pipe,reconnect,resets=0 – гипервизор После этого можно открыть файл hvix64.exe в IDA PRO, выбрать WinDbg в качестве отладчика и указать в process options → connection string:
com:
.port=\\.\ pipe\ Vm0, pipe, resets=0 Выбери Process Attach, нажми Same.
-
Отладчик остановится внутри гипервизора.
-
По сравнению с Windows Server 2012 (R2) в актуальной версии серверной винды появился новый модуль —
kdstub.
. Ранние версии гипервизора статически линковались с библиотекой отладки и имели достаточно большой размер (2–3 Мбайт), размер текущей версии (10.0.17763.1577) гипервизораdll hvix64.
— 1230 Кбайт. В случае сетевой отладкиexe kdstub.
будет заменен подходящим отладочным модулем, напримерdll kd_02_8086.
.dll Во всех подробностях настройка отладки через COM-порт в среде Hyper-V описана в статье Саара Амара (@AmarSaar).
Отладка по сети
В Windows Server 2012 и выше появилась возможность отладки гипервизора по сети. Также эта возможность присутствует во всех версиях Windows 10. Для этого в хостовой ОС необходимо выполнить команды, чтобы настроить параметры отладки гипервизора:
bcdedit /set hypervisordebug onbcdedit /hypervisorsettings NET HOSTIP:192.168.2.1 PORT:50000
Если есть необходимость, для отладки ОС на хосте нужно указать другой порт:
bcdedit /debug yesbcdedit /dbgsettings net hostip:192.168.2.1 port:50002
После выполнения команд будет отображена строка для подключения. В настройках виртуальной машины VMware нужно установить тип адаптера Host Only, в настройках виртуальной сети (Edit → Virtual Network Editor) настроить DHCP для этого адаптера и убедиться, что гостевая ОС нормально получает этот адрес, например выполнив команду ipconfig /
. Опция bcdedit /
позволяет использовать IP-адрес операционной системы. В этом случае настройка DHCP необязательна.
После этого нужно запустить два экземпляра IDA PRO, выбрать тип отладки KernelMode, указать в Process Option → Connection string следующие строки, полученные в результате выполнения приведенных выше команд:
net:port=50002,Key=1.2.3.4 — root partition
net:port=50000,Key=5.6.7.8 — hypervisor
Это позволяет одновременно отлаживать root-раздел и гипервизор. Сетевая отладка гораздо проще в конфигурации, дает бо́льшую производительность и стабильнее, поэтому я рекомендую использовать ее там, где это возможно. Выполнить некоторые команды WinDbg можно даже без наличия символов. Если какие‑то из перечисленных ниже команд не будут доступны, просто повторно загрузи следующие расширения WinDbg:
.load kext
.load kdexts
.load exts
.load ext
Здесь:
-
lm
— просмотр загруженных модулей (обычно hv и модуль отладки); -
k
— просмотр стека; -
d
,e
— чтение/запись данных по виртуальным адресам; -
!d
,!e
— чтение/запись данных в физической памяти; -
r
— отображение значений регистров; -
!vtop
— трансляция виртуальных адресов в физические. Сперва нужно получить содержимое регистраcr3
и использовать его как первый параметр. Виртуальный адрес — второй параметр.
2: kd> !vtop 0x10839d000 0xfffffbb3aa6c3e66Amd64VtoP: Virt fffffbb3aa6c3e66, pagedir 000000010839d000Amd64VtoP: PML4E 000000010839dfb8Amd64VtoP: PDPE 000000010a603670Amd64VtoP: PDE 000000010a604a98Amd64VtoP: Large page mapped phys 00000001000c3e66Virtual address fffffbb3aa6c3e66 translates to physical address 1000c3e66.!pte2va!ptov <cr3>
dx
-расширение доступно тоже, но с некоторыми ограничениями (из‑за отсутствия символов): @$debuggerRootNamespace.
. Exentry — псевдорегистр, отображающий адрес загрузки модуля гипервизора (hvix64).
Отладка с использованием встроенных возможностей vmwp.exe
Отладка виртуальной машины может быть выполнена с использованием встроенных возможностей процесса vmwp.
(на одну ВМ один экземпляр). Эту возможность впервые упомянул на форуме OSR online один из архитекторов Hyper-V Джейк Ошинс (Jake Oshins). Более подробно описал Рафаэль Ривера (Rafael Rivera — @WithinRafael) в своем блоге. Я обновил скрипт Риверы и выложил его на GitHub.
Скрипт также может сконфигурировать параметры загрузчика гостевой ОС при помощи PowerShell direct. Для этого:
Выключи гостевую ОС.
-
Укажи параметры для скрипта
hyperv-dbg-2019.
.ps1 Запусти скрипт от имени администратора (или отключи UAC).
-
Запусти WinDbg следующей командой:
WinDBG -k net:port=50010,target=127.0.0.1,key=1.2.3.4 Выполни команду break (Ctrl-Break), после которой отладчик остановится внутри гостевой ОС. Теперь можно исследовать ВМ, используя стандартные команды WinDbg, но в моих экспериментах интенсивная отладка (например, трассировка) несколько раз приводила к тому, что все зависало.
Отладка через протокол GDB
VMware Workstation поддерживает встроенный GDB-отладчик. Чтобы его включить, нужно добавить несколько строк в конфигурационный файл VMware:
debugStub.listen.guest64 = "TRUE"debugStub.listen.guest64.remote = "TRUE" — для подключения с других сетевых машин
debugStub.hideBreakpoints = "TRUE"monitor.debugOnStartGuest64 = "TRUE" — остановка сразу же после включения VM
Затем ты можешь подключить IDA PRO, «Гидру» или Radare2 к активированному серверу GDB. Пример отладки через GDB-протокол будет показан в разделе «Загрузка гипервизора».
Отладка эмулятора Windows 10X
Эмулятор Windows 10X доступен в магазине Microsoft Store. Этот эмулятор работает на базе Hyper-V. Сам эмулятор запускается как Hyper-V ВМ, Windows 10X — вложенная ВМ.
Необходимо смонтировать образ flash.
(просто два раза щелкнуть мышью на файле), с которым работает эмулятор и который расположен в папке по следующему пути:
C:\ProgramFiles\WindowsApps\Microsoft.Windows10XEmulatorImage10.0.19578.0Previ_1.0.1.0_x64__8wekyb3d8bbwe\Content
Скопируй файл в другое место, если у тебя появляются сообщения об ошибках доступа. Имя каталога может отличаться для различных версий эмулятора. До и после монтирования список разделов может выглядеть следующим образом.
Выбери том с меткой VIRT_EFIESP:
Get-Volume | ? {$_.FileSystemLabel -eq "VIRT_EFIESP"} | Format-Listmountvol Z: \\?\Volume{12aef83a-6cf2-4ea1-932f-b3a586a65308}\
bcdedit /store "Z:\efi\Microsoft\boot\BCD" /dbgsettings
Команда bcdedit /
покажет опции загрузочной записи операционной системы эмулятора. Чтобы у нас появилась возможность отладки гостевой ОС, понадобится дамп ядра, который можно получить с использованием встроенных функций эмулятора.
Открой Windows device portal — «Отладка». Загрузи live kernel dump, а затем открой его в WinDbg и запусти скрипт decypher_kdnet_key.
. Скрипт найдет параметры kdnet
и закодирует в формате Base36.
Теперь запусти WinDbg, используя команду windbgx.
. В результате ты сможешь подключиться к ОС хоста.
Отладка Hyper-V c помощью подмененного загрузчика
На эту тему опубликованы два исследования: Hyper-V backdoor Дмитрия Олексюка (@d_olex) и Voyager, созданный @_xeroxz. Их суть — в замене загрузочных файлов Windows в целях перехвата процесса загрузки гипервизора и интеграции своих управляющих модулей. Полноценной отладкой это сложно назвать, но с применением этого метода появляется возможность читать и изменять память Hyper-V. Подробности ты найдешь на страницах упомянутых проектов.
Загрузи последнюю сборку бэкдора и запусти скрипт bootkit_installer.
в хостовой ОС (протестировано в виртуальной среде на Windows Server 2019 внутри VMware Workstation). Перезагрузим хостовую ОС и увидим следующую картину.
В гостевой ОС мы можем запустить backdoor_client.
и получить доступ к различным структурам данных Hyper-V.
Второй проект, Voyager, может быть загружен с сайта GitHacks. Бинарников он не содержит, поэтому их необходимо скомпилировать с помощью Visual Studio для подходящей версии Windows. После чего запустить файл launch.
, который заменит загрузочные файлы Windows. После перезагрузки мы увидим следующую картину.
Для проверки работоспособности можно запустить example.
внутри гостевой ВМ.
Надеюсь, мы увидим в будущем больше примеров для этого проекта.
Отладка secure kernel
Отладку позволяет выполнить модуль EXDi для LiveCloudKd без включения опции отладки в загрузчике гостевой ОС. Все подробности можно узнать в соответствующей документации.
Отладка с помощью Radare2
Radare2 — консольное средство отладки, поддерживающее очень много режимов. Мы рассмотрим только отладку ядра Windows. Бинарники можно загрузить по адресу github.com/radareorg/radare2.
Незначительно изменив исходники, можно получить дополнительную информацию о Hyper-V (модифицированные бинарники приложены к статье). Для начала рекомендую почитать официальные источники, они содержат отличные инструкции.
До запуска необходимо скопировать следующие расширения WinDbg x64 в папку с Radare2:
ext.dll
exts.dll
kdexts.dll
kext.dll
Не забудь указать путь к папке с установленным WinDbg x64 в переменной окружения _NT_DEBUGGER_EXTENSION_PATH
. Вот некоторые команды для тестирования успешности подключения:
-
pd
— дизассемблирование; -
xq
— отображение региона памяти;@0x< address> -
v
— переключение в режим GUI.
Radare2 может подключаться к ядру Windows в двух режимах: через интерфейс dbgeng.
и с использованием собственного протокола winkd.
Radare2 и интерфейс dbgeng.dll
Сперва необходимо настроить гипервизор в режиме сетевой отладки, как это было описано раньше, и запустить Radare2 следующим образом:
radare2 -d "windbg://-k net:port=50011,key=1.2.3.4"
Подключено! Теперь ты можешь выполнять стандартные команды WinDbg, используя префикс =!
.
Radare2 и встроенный протокол
Можно попробовать подключиться к гипервизору по сети, выполнив команду radare2
. Я получил ошибку открытия UDP-сокета, хотя netstat
показал, что порт открыт. Возможно, это ошибка настройки на моем стенде, но исправить ее мне не удалось. В связи с этим будем использовать отладку через COM-порт. Для этого нужно настроить гипервизор так, как это было описано раньше, запустить vmdemux
и подключить Radare2 к именованному каналу:
radare2 -D winkd winkd://\\.\pipe\Vm0
Используя данные протокола отладки, можно получить дополнительную информацию о загруженном модуле Hyper-V.
Иногда Radare2 не может подключиться к COM-порту и виснет. В этом случае нужно просто сперва подключиться обычным WinDbg-отладчиком, отключиться и подсоединиться с помощью Radare2.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»