Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Гипервизор производства корпорации Microsoft, как и любая другая программа, создан людьми, а значит, содержит определенное количество ошибок. Поиск этих ошибок — занятие не только увлекательное, но и полезное: во‑первых, Microsoft располагает собственной программой Bug Bounty (о ее особенностях я расскажу чуть ниже), а во‑вторых… Во‑вторых, знания об уязвимостях и недокументированных возможностях приложений ценны сами по себе. В сегодняшней статье мы рассмотрим принципы отладки гипервизора Hyper-V и разберемся в его особенностях.
Гипервизор компании Microsoft используется в большом числе компонентов Windows и, как любой сложный продукт, не лишен допущенных при разработке ошибок. Число уязвимостей, найденных в этом продукте только в 2020 году, составило 21.
В 2020 году в Hyper-V была обнаружена 21 уязвимость
Для Hyper-V Microsoft предлагает отдельную программу баг‑баунти, размер выплат которой может достигать 250 тысяч долларов. Однако стоит упомянуть, что Microsoft не работает со странами, которые находятся в санкционном списке США. Россия формально присутствует в этом списке, поэтому следует проявлять осмотрительность, когда отправляешь информацию об уязвимостях в Microsoft, если ты еще ни разу не получал вознаграждение напрямую от вендора. Лучше воспользоваться услугами посредника, иначе ты можешь столкнуться с тем, что обнаруженная тобою уязвимость вдруг одновременно будет найдена другой компанией или исследователем. И неважно, что уязвимость оставалась в продукте несколько лет (этот вариант был проверен на практике).
Чтобы искать уязвимости в Hyper-V, нужно владеть методами отладки этого гипервизора. Актуальные способы отладки и будут темой сегодняшней статьи. Для этих целей можно использовать эмуляторы, поддерживающие вложенную виртуализацию (такие как VMware Workstation или сам Hyper-V), либо обычный компьютер или ноутбук.
Термины
hvix64.exe
— Intel, hvax64.exe
— AMD, hvaa64.exe
— ARM). В статье рассматривается гипервизор для процессоров Intel.vmcall\vmmcall\hvc
(в зависимости от производителя процессора);
Hyper-V состоит из нескольких компонентов, краткое описание его структуры можно найти в документации. Для отладки компонентов Hyper-V ты можешь использовать WinDbg либо другой отладчик пользовательского режима или режима ядра, однако для подключения непосредственно к гипервизору необходимо выполнить несколько дополнительных шагов, чтобы настроить рутовый раздел.
Для отладки гипервизора Microsoft разработала специальное расширение WinDbg hvexts.dll
, которое, к сожалению, не входит в дистрибутив и доступно только партнерам Microsoft (поскольку этому расширению требуются символы для модуля гипервизора, которые Microsoft не предоставляет). Также в каталоге winxp
, находящемся в папке WinDbg, есть расширение nvkd.dll
, которое предназначено для отладки расширений виртуального коммутатора Hyper-V.
Файл справки WinDbg содержит описание отладки гипервизора через COM-порт (отладка Hyper-V через нуль‑модемное кабельное соединение в файле debugger.chm
), подразумевающее наличие двух физических машин. Также гипервизор можно отладить, если запустить его в любом поддерживаемом программном обеспечении виртуализации. Далее мы будем использовать 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). Введи \.pipecom_1
.
Создание COM-порта для виртуальной машины
Для настройки отладки введи в командной строке опции отладки гипервизора:
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.dll
kdhvcom.dll
kd1934.dll
kdhv1394.dll
kdusb.dll
kdnet.dll (разные производители сетевых карт — разные модули)
kd.dll
В нашем случае мы используем kdhvcom.dll
.
Перезагрузи Windows Server 2019. Загрузка остановится и будет ждать подключения отладчика.
Открой HHD software Free Virtual Serial Ports, выбери File, затем Create Pipe Port. В поле Pipe name укажи то же значение, что было раньше заполнено для виртуальной машины, — \.pipecom_1
. Чекбокс Create pipe должен быть отключен (в противном случае будет создан новый именованный канал, а не выполнено подключение к существующему). Нажми OK.
Создание нового порта
Виртуальный COM-порт нужно создавать после запуска виртуальной машины, иначе ты увидишь ошибку, что канал не был создан (VMware создает канал после запуска ВМ).
Запусти утилиту vmdemux (находится в папке с WinDbg x64) с указанием имени только что созданного COM-порта в качестве одного из параметров:
vmdemux.exe -src com:port=com2,baud=115200
Утилита создаст два именованных канала: Vm0
для гипервизора и Vm1
для root-раздела.
Утилита vmdemux создаст два именованных канала
Ты можешь подключить WinDbg Preview к каждому каналу для тестирования:
WinDBGx.exe -k com:port=.pipeVm1,pipe,reconnect,resets=0 – root-разделWinDBGx.exe -k com:port=.pipeVm0,pipe,reconnect,resets=0 – гипервизор
Подключение WinDbg к созданным нами каналам
После этого можно открыть файл hvix64.exe в IDA PRO, выбрать WinDbg в качестве отладчика и указать в process options → connection string: com:port=\.pipeVm0,pipe,resets=0
.
Выбери Process Attach, нажми Same.
Отладчик остановится внутри гипервизора.
Отладчик остановится внутри гипервизора
По сравнению с Windows Server 2012 (R2) в актуальной версии серверной винды появился новый модуль — kdstub.dll
. Ранние версии гипервизора статически линковались с библиотекой отладки и имели достаточно большой размер (2–3 Мбайт), размер текущей версии (10.0.17763.1577) гипервизора hvix64.exe
— 1230 Кбайт. В случае сетевой отладки kdstub.dll
будет заменен подходящим отладочным модулем, например kd_02_8086.dll
.
При сетевой отладке kdstub.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 /renew
. Опция bcdedit /dbgsettings nodhcp
позволяет использовать 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.Debugger.State.PseudoRegisters.General
. Exentry — псевдорегистр, отображающий адрес загрузки модуля гипервизора (hvix64).
Exentry — псевдорегистр, отображающий адрес загрузки модуля гипервизора
Отладка виртуальной машины может быть выполнена с использованием встроенных возможностей процесса vmwp.exe
(на одну ВМ один экземпляр). Эту возможность впервые упомянул на форуме OSR online один из архитекторов Hyper-V Джейк Ошинс (Jake Oshins). Более подробно описал Рафаэль Ривера (Rafael Rivera — @WithinRafael) в своем блоге. Я обновил скрипт Риверы и выложил его на GitHub.
Скрипт также может сконфигурировать параметры загрузчика гостевой ОС при помощи PowerShell direct. Для этого:
Выключи гостевую ОС.
Укажи параметры для скрипта hyperv-dbg-2019.ps1
.
Параметры для скрипта 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, но в моих экспериментах интенсивная отладка (например, трассировка) несколько раз приводила к тому, что все зависало.
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 доступен в магазине Microsoft Store. Этот эмулятор работает на базе Hyper-V. Сам эмулятор запускается как Hyper-V ВМ, Windows 10X — вложенная ВМ.
Необходимо смонтировать образ flash.vhdx
(просто два раза щелкнуть мышью на файле), с которым работает эмулятор и который расположен в папке по следующему пути:
C:ProgramFilesWindowsAppsMicrosoft.Windows10XEmulatorImage10.0.19578.0Previ_1.0.1.0_x64__8wekyb3d8bbweContent
Скопируй файл в другое место, если у тебя появляются сообщения об ошибках доступа. Имя каталога может отличаться для различных версий эмулятора. До и после монтирования список разделов может выглядеть следующим образом.
Состояние системы до монтирования
Состояние системы после монтирования
Выбери том с меткой VIRT_EFIESP:
Get-Volume | ? {$_.FileSystemLabel -eq "VIRT_EFIESP"} | Format-Listmountvol Z: ?Volume{12aef83a-6cf2-4ea1-932f-b3a586a65308}
bcdedit /store "Z:efiMicrosoftbootBCD" /dbgsettings
Команда bcdedit /enum all /v /store "Z:efiMicrosoftbootBCD"
покажет опции загрузочной записи операционной системы эмулятора. Чтобы у нас появилась возможность отладки гостевой ОС, понадобится дамп ядра, который можно получить с использованием встроенных функций эмулятора.
Получение дампа ядра
Открой Windows device portal — «Отладка». Загрузи live kernel dump, а затем открой его в WinDbg и запусти скрипт decypher_kdnet_key.py
. Скрипт найдет параметры kdnet
и закодирует в формате Base36.
Использование скрипта decypher_kdnet_key.py
Теперь запусти WinDbg, используя команду windbgx.exe -k net:port=50005,key=2k85xmoorkrbx.u7xg1f35gwi4.24033ib08wzhs.2o8xly2z2ik5y
. В результате ты сможешь подключиться к ОС хоста.
Подключение к хостовой ОС
На эту тему опубликованы два исследования: Hyper-V backdoor Дмитрия Олексюка (@d_olex) и Voyager, созданный @_xeroxz. Их суть — в замене загрузочных файлов Windows в целях перехвата процесса загрузки гипервизора и интеграции своих управляющих модулей. Полноценной отладкой это сложно назвать, но с применением этого метода появляется возможность читать и изменять память Hyper-V. Подробности ты найдешь на страницах упомянутых проектов.
Загрузи последнюю сборку бэкдора и запусти скрипт bootkit_installer.ps1
в хостовой ОС (протестировано в виртуальной среде на Windows Server 2019 внутри VMware Workstation). Перезагрузим хостовую ОС и увидим следующую картину.
Запуск скрипта bootkit_installer.ps1
В гостевой ОС мы можем запустить backdoor_client.exe
и получить доступ к различным структурам данных Hyper-V.
Доступ к различным структурам данных Hyper-V на гостевой ОС
Второй проект, Voyager, может быть загружен с сайта GitHacks. Бинарников он не содержит, поэтому их необходимо скомпилировать с помощью Visual Studio для подходящей версии Windows. После чего запустить файл launch.bat
, который заменит загрузочные файлы Windows. После перезагрузки мы увидим следующую картину.
Загрузка ОС после применения Voyager
Для проверки работоспособности можно запустить example.exe
внутри гостевой ВМ.
Проверка работоспособности Voyager
Надеюсь, мы увидим в будущем больше примеров для этого проекта.
Отладку позволяет выполнить модуль EXDi для LiveCloudKd без включения опции отладки в загрузчике гостевой ОС. Все подробности можно узнать в соответствующей документации.
Radare2 — консольное средство отладки, поддерживающее очень много режимов. Мы рассмотрим только отладку ядра Windows. Бинарники можно загрузить с того же github.com по адресу https://github.com/radareorg/radare2/releases.
Незначительно изменив исходники, можно получить дополнительную информацию о 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.dll
и с использованием собственного протокола winkd.
Сперва необходимо настроить гипервизор в режиме сетевой отладки, как это было описано раньше, и запустить Radare2 следующим образом:
radare2 -d "windbg://-k net:port=50011,key=1.2.3.4"
Запуск Radare2
Подключено! Теперь ты можешь выполнять стандартные команды WinDbg, используя префикс =!
.
Выполнение стандартных команд отладчика
Можно попробовать подключиться к гипервизору по сети, выполнив команду radare2 -D winkd winkd://192.168.174.1:50011:1.2.3.4
. Я получил ошибку открытия UDP-сокета, хотя netstat
показал, что порт открыт. Возможно, это ошибка настройки на моем стенде, но исправить ее мне не удалось. В связи с этим будем использовать отладку через COM-порт. Для этого нужно настроить гипервизор так, как это было описано раньше, запустить vmdemux
и подключить Radare2 к именованному каналу:
radare2 -D winkd winkd://\.pipeVm0
Используя данные протокола отладки, можно получить дополнительную информацию о загруженном модуле Hyper-V.
Получение дополнительной информации о загруженном модуле Hyper-V
Иногда Radare2 не может подключиться к COM-порту и виснет. В этом случае нужно просто сперва подключиться обычным WinDbg-отладчиком, отключиться и подсоединиться с помощью Radare2.
Источник: xakep.ru