
Windows - Вооружение привилегированных записей в файлы с помощью Update Session Orchestrator service
⚠️ Обновление от 06.06.2020: этот трюк больше не работает на последних сборках Windows 10 Insider Preview. Это означает, что хотя он всё ещё работает в основной версии Windows 10, следует ожидать, что в ближайшие месяцы он будет исправлен.
Эта PoC демонстрирует технику, которую можно использовать для превращения уязвимостей привилегированной записи файлов в оружие в Windows. Она представляет собой альтернативу «эксплойту» загрузки DLL через DiagHub, найденному Джеймсом Форшоу (он же @tiraniddo), который был исправлен Microsoft, начиная со сборки 1903.
Начиная с Windows 10, Microsoft представила службу Update Session Orchestrator. Как обычный пользователь, вы можете взаимодействовать с этой службой через COM и, например, запустить «проверку обновлений» (т.е. проверить наличие обновлений) или начать загрузку ожидающих обновлений. Существует даже недокументированная встроенная утилита usoclient.exe, которая служит этой цели.
С точки зрения атакующего эта служба интересна тем, что она работает как NT AUTHORITY\System и пытается загрузить несуществующую DLL (windowscoredeviceinfo.dll) при каждом создании сеанса обновления.
Это означает, что если мы найдем уязвимость привилегированной записи файлов в Windows или в стороннем ПО, мы сможем скопировать собственную версию windowscoredeviceinfo.dll в C:\Windows\Sytem32\, а затем загрузить её через службу USO для получения произвольного выполнения кода с правами NT AUTHORITY\System.
Для дополнительной информации:
Часть 1 - https://itm4n.github.io/usodllloader-part1/
Часть 2 - https://itm4n.github.io/usodllloader-part2/
Решение состоит из двух проектов: WindowsCoreDeviceInfo и UsoDllLoader.
Предоставляет PoC DLL, который при вызове функции QueryDeviceInformation() запускает bind shell на порту 1337 (только localhost). Именно эта функция используется рабочими процессами USO.
Это урезанная версия usoclient.exe. Её можно запускать от имени обычного пользователя для взаимодействия со службой USO и загрузки windowscoredeviceinfo.dll. После этого она попытается подключиться к bind shell. В случае ошибок обратитесь к разделу «Известные проблемы».
Решение уже предварительно настроено, так что компиляция должна быть простой. Я использую Visual Studio 2019. С более старыми версиями может не работать.
Release и архитектуру x64..\x64\Release\WindowsCoreDeviceInfo.dll и загрузчик .\x64\Release\UsoDllLoader.exe.Для целей тестирования вы можете:
WindowsCoreDeviceInfo.dll в C:\Windows\System32\.NT AUTHORITY\SYSTEM.Если UsoDllLoader.exe не сработает, вы можете проделать вышеописанное вручную.
WindowsCoreDeviceInfo.dll в C:\Windows\System32\.usoclient StartInteractiveScan от имени обычного пользователя. Обратите внимание, что команда не выдаст никакого отклика.nc.exe 127.0.0.1 1337 для подключения к bindshell.Этот метод, вероятно, не сработает, если одно или несколько обновлений ожидают установки или обновления устанавливаются.
В зависимости от версии Windows UsoDllLoader.exe может завершаться с различными кодами ошибок. Я не слишком глубоко исследовал эти проблемы. Причина в том, что это всего лишь PoC, который я разработал для удобства. Самое важное — это DLL, а не загрузчик. Подробнее см. «Использование 2».