
Spartacus — инструментарий для перехвата DLL/COM
[!CAUTION] Этот репозиторий не поддерживается, посетите https://github.com/sadreck/Spartacus для последней версии.
Если вы видели фильм «Спартак» 1960 года, вы помните сцену, где римляне просят Спартака сдаться. В тот момент, когда настоящий Спартак встал, многие другие также встали и заявили, что они — Спартак, используя фразу «I AM SPARTACUS».
Когда процесс, уязвимый для DLL-хиджакинга, запрашивает загрузку DLL, это похоже на вопрос «КТО ТАКОЙ VERSION.DLL?», и случайные каталоги начинают заявлять: «Я — VERSION.DLL» и «НЕТ, Я — VERSION.DLL». И так появился Спартак.
[Защита] Режим мониторинга, пытающийся выявить запущенные приложения, которые проксируют вызовы, как в случае «DLL-хиджакинг в процессе». Это сделано для быстрого обнаружения очевидных уязвимостей, и на него не следует полагаться.Найдите и загрузите последнюю версию Spartacus в разделе Releases. В противном случае просто клонируйте этот репозиторий и соберите из исходников.
Ниже приведено описание каждого из режимов, поддерживаемых Spartacus.
Примечание: Аргументы командной строки значительно изменились с v1 на v2.
Исходная функциональность Spartacus заключалась исключительно в поиске уязвимостей DLL-хиджакинга. Принцип работы:
CreateFile..dll.procmon.exe или procmon64.exe.Drop Filtered Events для минимизации размера выходного PML.Auto Scroll.ENTER.ENTER.NAME_NOT_FOUND и PATH_NOT_FOUND.Соберите все события и сохраните их в C:\Data\logs.pml. Все уязвимые DLL будут сохранены в C:\Data\VulnerableDLLFiles.csv, а все решения для прокси- DLL — в C:\Data\Solutions.
--mode dll --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose
Проанализируйте существующий выходной файл PML, сохраните результаты в CSV и создайте решения Visual Studio для прокси- DLL.
--mode dll --existing --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose


Новая функция Spartacus — выявление уязвимостей локального COM-хиджакинга. Принцип работы:
RegOpenKey.procmon.exe или procmon64.exe.Drop Filtered Events для минимизации размера выходного PML.Auto Scroll.ENTER.ENTER.InprocServer32 и с результатом NAME_NOT_FOUND.HKEY_CURRENT_USER, ищет его GUID в HKEY_CLASSES_ROOT и включает его детали в экспортный CSV (если найден).Для COM-хиджакинга Spartacus также поддерживает сканирование локальной системы на предмет некорректно настроенных COM-записей:
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE.InProcServer, InProcServer32, LocalServer или LocalServer32.Соберите все события и сохраните их в C:\Data\logs.pml. Вся информация об уязвимых COM-объектах будет сохранена в C:\Data\VulnerableCOM.csv.
--mode com --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Обработайте существующий файл PML для выявления уязвимых COM-записей.
--mode com --existing --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Перечислите реестр локальной системы для выявления отсутствующих/некорректно настроенных COM-библиотек и исполняемых файлов.
--mode com --acl --csv C:\Data\VulnerableCOM.csv --verbose


Spartacus поддерживает создание решений Visual Studio, формируя каркасные проекты для использования на основе DLL, которую вы хотите использовать.
DllMain.DllMain.version.dll, вы могли бы запустить свой имплант из GetFileVersionInfoExW, если эта функция вызывается уязвимым приложением.Создайте решение, которое перенаправляет все экспорты (без проксирования функций).
--mode proxy --dll C:\Windows\System32\version.dll --solution "C:\data\tmp\refactor-version" --overwrite --verbose --external-resources
Можно передать несколько DLL одновременно.
--mode proxy --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\userenv.dll --solution "C:\data\tmp\dll-collection" --overwrite --verbose --external-resources
Создайте прокси для максимально возможного количества функций (на основе вывода Ghidra).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose
То же, что и выше, но используйте внешние файлы ресурсов для создания решения (если их нужно изменить).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources
Используйте предварительно сгенерированные прототипы функций для тех, для которых Ghidra не смог извлечь определения.
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources --prototypes C:\data\prototypes.csv
Создайте прокси только для функций GetFileVersionInfoExW и GetFileVersionInfoExA.
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\version.dll --solution C:\Projects\spartacus-version --verbose --overwrite --external-resources --only "GetFileVersionInfoExW, GetFileVersionInfoExA"
Создайте базу данных прототипов функций из существующих файлов *.h, что поможет создать прокси-функции для тех, для которых Ghidra не смог извлечь определение.
--mode proxy --action prototypes --path "C:\Program Files (x86)\Windows Kits" --csv C:\data\prototypes.csv --verbose
Выведите список экспортов DLL и проверьте, есть ли для каждой функции предварительно сгенерированный прототип.
--mode proxy --action exports --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\amsi.dll --prototypes ./Assets/prototypes.csv
Spartacus теперь поддерживает создание самоподписанных сертификатов (с копированием атрибутов из существующих файлов) и подписание DLL-файлов.
Создайте сертификат для подписи, используя свойства из C:\Windows\System32\version.dll (должна быть подписанная DLL).
--mode sign --action generate --pfx "C:\Output\certificate.pfx" --password "Welcome1" --not-before "2022-12-31 00:00:55" --not-after "2026-01-01 00:00:01" --copy-from C:\Windows\System32\version.dll --verbose
Подпишите DLL с помощью существующего/созданного сертификата.
--mode sign --action sign --pfx "C:\Output\certificate.pfx" --password "Welcome1" --path "C:\Input\MyFakeVersion.dll" --algorithm SHA256 --verbose
Spartacus также имеет режим --detect, который пытается выявить активное проксирование DLL. Логика следующая:
Чтобы использовать эту функцию, просто запустите Spartacus с аргументом --detect.
Spartacus поддерживает режим --sign, который позволяет как создавать самоподписанные сертификаты, так и подписывать ими скомпилированные DLL.
Создайте самоподписанный сертификат, копируя данные издателя/владельца из существующего файла:
--mode sign --action generate --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --not-before "2023-01-01 00:00:04" --not-after "2025-01-01 00:00:42" --copy-from C:\Windows\System32\version.dll --verbose
И используйте этот сертификат для подписания скомпилированного файла:
--mode sign --action sign --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --path "C:\Projects\Spartacus-AMSI\amsi.dll" --algorithm SHA256 --verbose
Чтобы облегчить себе жизнь, используйте файл CommandLineGenerator.html.
Будь то опечатка, ошибка или новая функция, Spartacus открыт для вкладов при условии соблюдения следующих пунктов:
proxy.| Режим | Аргумент | Описание |
|---|
--mode | Определяет используемый режим: dll, proxy, com или detect. | |
all | --verbose | Включить подробный вывод. |
all | --debug | Включить отладочный вывод. |
all | --external-resources | По умолчанию Spartacus использует встроенные ресурсы для создания файлов решений VS и т.д. Если необходимо изменить шаблоны, используйте этот аргумент, чтобы Spartacus загружал все файлы из папки ./Assets. |
dll, com | --procmon | Расположение (файл) SysInternals Process Monitor: procmon.exe или procmon64.exe |
dll, com | --pml | Расположение (файл) для сохранения файла журнала событий ProcMon. Если файл существует, он будет перезаписан. При использовании с --existing указывает файл журнала для чтения (не будет перезаписан). |
dll, com | --pmc | Указывает пользовательский файл ProcMon (PMC). Этот файл не будет изменён и будет использован как есть. |
dll, com | --csv | Расположение (файл) для сохранения CSV-вывода выполнения. |
dll, proxy | --solution | Путь к каталогу, где будут сохранены решения для прокси- DLL. |
dll, com | --existing | Переключатель, указывающий, что Spartacus должен обработать существующий файл журнала событий ProcMon (PML). Для указания файла журнала используйте --pml; полезно, если ProcMon работал часами или использовался в Boot Logging. |
dll | --all | По умолчанию любые DLL в каталогах Windows или Program Files пропускаются. Используйте этот параметр, чтобы включить их в вывод. |
proxy | --ghidra | Путь к файлу analyzeHeadless.bat Ghidra. Используется, когда требуется проксировать конкретные функции, а не только DllMain. |
proxy | --dll | Путь к DLL, которую нужно проксировать. Можно указать несколько экземпляров этого аргумента. Кроме того, могут содержать подстановочные знаки, например C:\Windows\System32\*.dll — однако все пути должны заканчиваться на *.dll. |
proxy, sign | --overwrite | Если файл --solution (прокси) или --pfx (подпись) уже существует, используйте этот флаг для перезаписи. |
proxy | --only | Создать прокси-функции только для функций, определённых в этой переменной. Значения разделяются запятыми, например 'WTSFreeMemory,WTSFreeMemoryExA,WTSSetUserConfigA'. |
proxy | --action | Действие по умолчанию — создание решения VS. --action prototypes принимает в качестве входных данные папку Windows SDK и анализирует файлы *.h для создания базы данных прототипов функций. --action exports отображает экспортные функции DLL, а при использовании с --prototypes показывает, было ли предварительно сгенерировано определение функции. |
sign | --action | При использовании --action с модулем sign принимает одно из двух значений: generate для создания PFX и sign для подписания файла. |
proxy | --path | В настоящее время работает только с --action prototypes; указывает расположение каталога Windows SDK. |
proxy | --prototypes | Расположение файла prototypes.csv (сейчас находится в папке ./Assets). |
com | --acl | Перечислить локальную систему на предмет отсутствующих/некорректно настроенных COM-библиотек и исполняемых файлов. |
sign | --subject | Используется с --action generate для указания владельца сертификата. |
sign | --issuer | Используется с --action generate для указания издателя сертификата. |
sign | --copy-from | Используется с --action generate для указания существующего подписанного файла, из которого копируются данные издателя и владельца. |
sign | --not-before | Используется с --action generate для определения даты начала действия сертификата. Формат: ГГГГ-ММ-ДД ЧЧ:ММ:СС. |
sign | --not-after | Используется с --action generate для определения даты окончания действия сертификата. Формат: ГГГГ-ММ-ДД ЧЧ:ММ:СС. |
sign | --pfx | При использовании с --action generate указывает, куда будет сохранён PFX-файл. При использовании с --action sign указывает, откуда будет загружен PFX-файл. |
sign | --password | При использовании с --action generate задаёт пароль для --pfx файла. |
sign | --path | При использовании с --action sign указывает расположение исполняемого файла/DLL для подписания. |
sign | --algorithm | При использовании с --action sign задаёт алгоритм хеширования для подписания. Варианты: MD5, SHA1, SHA256, SHA384, SHA512. |
sign | --timestamp | При использовании с --action sign задаёт сервер меток времени, например http://timestamp.sectigo.com или http://timestamp.digicert.com. |