
Инструмент для обнаружения повышения привилегий в Windows, который анализирует журналы загрузки Process Monitor для выявления перехвата DLL, слабых ACL и других путей повышения привилегий, автоматически генерируя исходный код прокси-DLL.
Enable Boot Logging.

raw.PML.Ctrl-R.boot.PML.Crassus.exe boot.PML.results.csv.Компания Accenture создала инструмент Spartacus, который находит возможности перехвата DLL в Windows. Взяв Spartacus за основу, мы создали Crassus, чтобы расширить возможности обнаружения повышения привилегий в Windows, не ограничиваясь поиском отсутствующих файлов. ACL, используемые файлами и каталогами привилегированных процессов, позволяют найти больше, чем просто поиск отсутствующих файлов для достижения цели.
...но с изюминкой: Crassus использует SysInternals Process Monitor и парсит необработанные файлы PML. Обычное использование — создать журнал загрузки с помощью Process Monitor, а затем проанализировать его с помощью Crassus. Он также автоматически генерирует исходный код для прокси-библиотек DLL со всеми необходимыми экспортами для уязвимых библиотек DLL.
version.dll, Crassus создаст файлы version.cpp и version.def со всеми включёнными в них экспортами. По умолчанию прокси-библиотеки DLL запускают calc.exe. Включены сценарии сборки для сборки DLL в Visual Studio или MinGW.Общая суть работы Crassus может быть резюмирована в этой блок-схеме:






Crassus разработан как проект Visual Studio 2019. Чтобы собрать Crassus.exe:
Crassus.slnCtrl+Shift+B на клавиатуреЕсли вы доверяете запуску чужого кода, не зная, что он делает, Crassus.exe предоставлен в этом репозитории.
Enable Boot Logging.

Ctrl-R.boot.PML. Причина повторного сохранения файла журнала двоякая:
| Аргумент | Описание |
|---|---|
<PMLFILE> | Расположение (файл) существующего файла журнала событий ProcMon. |
--verbose | Включить подробный вывод. |
--debug | Включить отладочный вывод. |
Проанализируйте журнал загрузки Process Monitor, сохранённый в boot.PML. Все уязвимые пути будут сохранены в results.csv, а все файлы исходного кода прокси-библиотек DLL — в подкаталоге stubs.
C:\tmp> Crassus.exe boot.PML
Ниже приведён шаблон, используемый при создании прокси-библиотек DLL. Для DLL, обнаруженных Crassus, прокси-библиотека DLL будет содержать те же имена экспортов, что указаны в %_EXPORTS_%, а также те же ординалы, что указаны в файле .def. Crassus определит, нужно ли собирать библиотеку DLL как 32-битную или 64-битную, анализируя архитектуру родительского процесса, и соответствующим образом пометит исходный код в поле %_BUILD_AS_%.
Если реальную DLL не удаётся найти с помощью журнала Process Monitor или если имя экспорта проблематично, сценарии сборки перейдут к созданию DLL без указанных экспортов.
#pragma once
//%_BUILD_AS%
#include <windows.h>;
extern "C" {
VOID Payload() {
// Запустите здесь вашу полезную нагрузку.
WinExec("calc.exe", 1);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
Payload();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifdef ADD_EXPORTS
%_EXPORTS_%
#endif
}
Для приложений, которые небезопасно используют значение переменной OPENSSLDIR, поддельный файл openssl.cnf можно разместить в указанном месте. В этом примере программа загрузит C:\tmp\calc.dll. Убедитесь, что используете 32-битную библиотеку для 32-битных процессов и 64-битную библиотеку для 64-битных процессов.
[openssl_init]
# Эта попытка загрузить файл c:\tmp\calc.dll при инициализации OpenSSL
# Сценарии сборки должны определить, нужно ли собирать библиотеку calc.dll как 32- или 64-битную
/tmp/calc = asdf
Компиляция возможна с помощью cl.exe, входящего в состав Visual Studio. В частности:
cl.exe /DADD_EXPORTS /D_USRDLL /D_WINDLL <target>.cpp /LD /Fe<target>.dll /link /DEF:<target>.def
Чтобы автоматизировать процесс сборки, включая указание, должна ли библиотека быть 64- или 32-битной:
build.bat..dll.Примечание: Из-за неудачного поведения vcvarsall.bat, которое определённо не является ошибкой, вы можете столкнуться с проблемами при попытке запустить build.bat более одного раза в одном сеансе командной строки разработчика Visual Studio. Если возникает ошибка, просто закройте окно и запустите его снова.
Если Visual Studio недоступен, прокси-библиотеки DLL можно скомпилировать с помощью MinGW-w64. Например, на платформе Ubuntu MinGW можно установить следующей командой: sudo apt install g++-mingw-w64-x86-64-win32 g++-mingw-w64-i686-win32
# Создание 32-битной DLL
i686-w64-mingw32-g++ -c -o <target>.o <target>.cpp -D ADD_EXPORTS
i686-w64-mingw32-g++ -o <target>.dll <target>.o <target>.def -s -shared -Wl,--subsystem,windows
# Создание 64-битной DLL
x86_64-w64-mingw32-g++ -c -o <target>.o <target>.cpp -D ADD_EXPORTS
x86_64-w64-mingw32-g++ -o <target>.dll <target>.o <target>.def -s -shared -Wl,--subsystem,windows
Чтобы автоматизировать процесс сборки, включая указание, должна ли библиотека быть 64- или 32-битной:
bash ./build.sh.dll.Как описано в VU#114757, старые версии программного обеспечения Acronis содержат множественные уязвимости повышения привилегий.
openssl.cnf в месте, доступном для создания непривилегированным пользователем.C:\ProgramData\Acronis.Crassus автоматически находит обе эти проблемы.

Разместив наш скомпилированный файл curl.dll в каталоге C:\ProgramData\Acronis\Agent\var\atp-downloader\ и перезагрузившись с новым журналом загрузки Process Monitor, мы видим, что наша полезная нагрузка, запускающая calc.exe, выполняется с привилегиями SYSTEM.

Уязвимое программное обеспечение Acronis пытается загрузить openssl.cnf из двух разных мест. Мы разместим наш файл шаблона openssl.cnf в c:\jenkins_agent\workspace\tp-openssl-win-vs2013\17\product\out\standard\vs_2013_release\openssl\ssl и 32-битную полезную нагрузку calc.dll в c:\tmp.

Как описано в VU#240785, старые версии программного обеспечения Atlassian Bitbucket уязвимы для повышения привилегий из-за слабых ACL каталога установки. Как и в случае с любым программным обеспечением Windows, которое устанавливается за пределами C:\Program Files\ или других мест с ограниченным ACL, установщик программного обеспечения должен явно задать ACL для целевого каталога.
Crassus находит множество способов достижения повышения привилегий с помощью этого программного обеспечения, включая:

В выводе Crassus мы видим, что c:\atlassian\bitbucket\7.9.1\elasticsearch\bin\elasticsearch-service-x64.exe является привилегированным, но поскольку он выполняется, мы не можем просто заменить его. Однако мы можем использовать другой трюк для его перехвата. Возможно, мы сможем просто переименовать каталог, в котором он находится, создать новый каталог с тем же именем и разместить там нашу полезную нагрузку с тем же именем.

После перезагрузки с журналом загрузки Process Monitor мы видим, что наш размещённый файл elasticsearch-service-x64.exe выполняется вместо реального, судя по значку калькулятора Windows.

Как описано в VU#287178, старые версии программного обеспечения McAfee уязвимы для повышения привилегий через openssl.cnf. Давайте посмотрим:

Чтобы понять, почему в этом журнале загрузки есть две разные ссылки на openssl.cnf, обратимся к файлу results.csv:

Обратите внимание, что загрузка файла openssl.cnf из пути D:\ потребует дальнейшего ручного исследования, поскольку возможность загрузки такого пути зависит от конкретной платформы и доступного доступа к системе. Возможно, получится создать оптический диск, предоставляющий файл openssl.cnf, который также ссылается на путь, разрешающийся на оптический диск.
SQL Server 2022 не очевидно уязвим для повышения привилегий из-за слабых ACL, если только он не установлен в нестандартное место. Если он установлен в каталог за пределами C:\Program Files, Crassus выявит несколько возможностей для повышения привилегий. Большинство приложений Windows, включающих привилегированный компонент, по-видимому, эксплуатируемы таким образом, если они установлены в каталог, который изначально не имеет безопасных ACL.

Если Crassus сообщает о привилегированной загрузке файла, который пользователь может разместить или изменить, это не обязательно означает, что это эксплуатируемый сценарий. Хотя Crassus ищет потенциально интересные типы файлов, файл журнала Process Monitor напрямую не указывает, что ассоциированный процесс сделал бы с этим файлом, если бы он там был. Это может быть так же просто, как извлечение значка программы. Исследование стека вызовов файловой операции в Process Monitor может дать подсказку о том, что было бы сделано. Или просто разместите файл и исследуйте поведение с новым журналом загрузки Process Monitor, если предпочитаете более лёгкий путь грубой силы. Вы также можете столкнуться с отсутствующей библиотекой, где либо Crassus не может найти саму библиотеку, чтобы узнать, какие экспорты должны присутствовать, либо экспорты, найденные Crassus, конфликтуют таким образом, что это препятствует правильной компиляции DLL. В таких случаях Crassus перейдёт к созданию DLL, которая не экспортирует ни одного имени функции. В зависимости от того, как целевое приложение загружает библиотеку, отсутствие ожидаемых имён функций и/или номеров ординалов может помешать целевому приложению успешно загрузить библиотеку. Этот сценарий потребует ручных усилий для определения того, как должна выглядеть прокси-библиотека DLL.
Crassus будет искать привилегированные файловые операции для обнаружения путей, представляющих интерес. Вы можете столкнуться со сценарием, когда и привилегированный, и непривилегированный процессы обращаются к одному пути, но только непривилегированный процесс выполняет то, что может там находиться. Или вы можете столкнуться со сценарием, когда родительский процесс выполняется с привилегиями, но явно порождает дочерние процессы с более низкими привилегиями.
Особенно при первой установке программного обеспечения или при установке обновлений Process Monitor может регистрировать файловую операцию, которая выглядит эксплуатируемой, но не происходит каждый раз при загрузке системы. Эксплуатация этих операций может быть возможна при первой перезагрузке после такого события. Чтобы избежать таких граничных случаев, убедитесь, что последующие журналы загрузки содержат те же зарегистрированные файловые операции при последующих перезагрузках.
Будь то опечатка, ошибка или новая функция, Crassus очень открыт для вклада, если мы согласны со следующим: