
Библиотека Crystal Palace для проксирования вызовов Nt API через Threadpool. Обновлено для call-гаджетов.
Это обобщение https://github.com/AlmondOffSec/LibTPLoadLib для проксирования API с произвольным количеством аргументов (на самом деле максимум 11, но этого достаточно). Предоставляется в виде разделяемой библиотеки Crystal Palace. API сделан совместимым с LibTP от @rasta-mouse для лёгкого переключения с помощью spec-файлов. Хуки предоставлены, чтобы продемонстрировать новейшие возможности Crystal Palace.
ВНИМАНИЕ ⚠️ : Этот проект не готов к использованию как есть. Я не предоставляю модуль, в котором можно найти call-гаджет. Вам придётся найти свой собственный. Подробнее читайте в блоге.
Примечание : Из-за возможности передавать 11 аргументов (7 из которых будут помещены в стек), call-гаджет должен находиться внутри функции с достаточно большим стековым кадром. Ищите add rsp не менее 0x68.
ВНИМАНИЕ ⚠️ : Из-за внутренних особенностей этой техники невозможно получить возвращаемое значение проксируемой функции. Проксирование NTAPI, как правило, более практично, поскольку их возвращаемое значение — это «всего лишь» NTSTATUS. Однако это затрудняет понимание того, действительно ли функция завершилась успешно 🙃.
Найдите рабочий гаджет в модуле, доступном на целевой системе. В src/tp_gadget.c впишите его имя в вызов LoadLibraryA и в функцию GetCallGadgetAddress, чтобы она получала его адрес. При необходимости модифицируйте ассемблерную заглушку (sub rsp значение, регистр, который будет использовать гаджет для вызова).
Скомпилируйте проект: make. Результат — разделяемая библиотека Crystal Palace libtp_gadget.x64.zip.
Скомпилируйте пример COFF (он просто загрузит wininet.dll, затем локально выделит память и выполнит шеллкод): make -C example_print. Результатом будет COFF-файл example_print.x64.o.
Создайте spec-файл Crystal Palace, предписывающий линковщику использовать наши хуки на DFR: возьмите Simple PIC spec-файл Tradecraft Garden и добавьте следующие строки между mergelib "../libtcg.x64.zip" и export:
mergelib "../libtp_gadget.x64.zip"
attach "KERNEL32$LoadLibraryA" "H_LoadLibraryA"
optout "ProxyNtApi" "H_LoadLibraryA"
attach "NTDLL$NtOpenProcess" "H_NtOpenProcess"
attach "NTDLL$NtAllocateVirtualMemory" "H_NtAllocateVirtualMemory"
attach "NTDLL$NtWriteVirtualMemory" "H_NtWriteVirtualMemory"
attach "NTDLL$NtProtectVirtualMemory" "H_NtProtectVirtualMemory"
attach "NTDLL$NtFreeVirtualMemory" "H_NtFreeVirtualMemory"
attach "NTDLL$NtClose" "H_NtClose"
attach "NTDLL$NtCreateThreadEx" "H_NtCreateThreadEx"
attach "NTDLL$NtOpenThread" "H_NtOpenThread"
attach "NTDLL$NtSuspendThread" "H_NtSuspendThread"
attach "NTDLL$NtResumeThread" "H_NtResumeThread"
attach "NTDLL$NtGetContextThread" "H_NtGetContextThread"
attach "NTDLL$NtSetContextThread" "H_NtSetContextThread"
attach "NTDLL$NtWaitForSingleObject" "H_NtWaitForSingleObject"
Свяжите всё вместе с помощью Crystal Palace, чтобы получить PIC-шеллкод: path/to/crystalpalace/link simplepic_modified/loader.spec example_print/example_print.x64.o out.bin.
Запустите шеллкод любым загрузчиком.