
PoC для повышения привилегий в Windows 10 Diagnostics Hub Standard Collector Service
PoC для повышения привилегий в Windows 10 Diagnostics Hub Standard Collector Service
Библиотеку Diagnostics Hub Packaging, используемую службой Windows Standard Collector, можно принудить скопировать произвольный файл в произвольное место из-за отсутствия олицетворения клиента в DiagnosticsHub.StandardCollector.Runtime.dll.
Подробное описание того, как эта уязвимость была найдена и использована, доступно здесь: Уязвимость повышения привилегий в Windows Standard Collector Service.
Служба Standard Collector позволяет задавать несколько значений при настройке сеанса диагностики, включая временный каталог и идентификатор сеанса. Идентификатор сеанса может быть любым GUID, а временный каталог — любым расположением, к которому у пользователя есть права на запись. Если сеанс сбора настроен с идентификатором c13851b2-b1e1-438f-bf73-949df897f1bf и временным путём C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\, при вызове метода GetCurrentResult объекта ICollectionSession происходят следующие события:
C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etlC:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65Эти папки и ETL-файлы создаются службой сбора для пакета .diagsession, который обычно создается после завершения сеанса. Вызов метода Stop объекта ICollectionSession приведет к тому, что служба сбора зафиксирует пакет диагностики, вызвав Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage. Функция CommitPackage скопирует или переместит исходный файл {scratch path}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl в папку со случайным GUID: {scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl
Операция копирования/перемещения, запускаемая функцией CommitPackagingResult в DiagnosticsHub.StandardCollector.Runtime.dll, выполняется без олицетворения пользователя (в отличие от первоначального создания файлов/папок), что приводит к возможной проблеме TOCTOU, если целевая папка будет заменена точкой подключения (mount point), перенаправляющей копирование в произвольное место. Чтобы использовать эту проблему с пользой для себя, атакующему необходимо подменить содержимое ETL-файла до его копирования. Это можно сделать, выиграв состояние гонки с помощью OpLock после того, как служба освободит дескриптор файла.
Хотя мы не полностью контролируем имя копируемого .etl-файла, мы можем использовать трюк с симлинком в каталоге объектов, чтобы контролировать его. Схема с точкой подключения и симлинком будет выглядеть примерно так:
{scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\ -> \RPC Control\\RPC Control\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl -> C:\Windows\System32\anything.dllКонтроль над содержимым файла, местом копирования и именем файла дает атакующему множество возможностей для загрузки DLL. Однако включенный PoC демонстрирует, что контроль над именем файла не нужен, поскольку служба сбора с радостью загружает DLL с любым именем, если она находится в каталоге C:\Windows\System32 или C:\Windows\System32\DiagSvcs. Это делается путем запуска нового сеанса сбора с агентом, имя сборки которого совпадает с именем скопированной DLL c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl.
Включенный PoC представляет собой решение VS с проектом C++ DLL для нагрузки, запускающей notepad.exe, и проектом C# для взаимодействия со службой и эксплуатации уязвимости с помощью библиотеки NtApiDotNet.
Шаги для воспроизведения:
Ожидаемый результат:
Операция фиксации пакета выполняется с олицетворением пользователя и завершается ошибкой при попытке скопировать файл.
Наблюдаемый результат:
Файл копируется в целевую папку точки подключения C:\Windows\System32, затем загружается как агент сбора, и, наконец, notepad.exe запускается с привилегиями SYSTEM.