Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Недавно появился новый вид инжектов в легитимные процессы. Называется он PoolParty и использует Windows Thread Pools — масштабный и сложный механизм управления потоками в Windows. Предлагаю разобраться, как устроен этот механизм и как его можно использовать в пентестерских целях.
Инжекты — это техника внедрения своего кода в сторонние процессы с целью получения контроля или выполнения нужных действий. Поскольку такое может провернуть не только пентестер, но и злоумышленник, понимание этих техник позволяет эффективно предотвращать атаки и укреплять защищенность.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Механизм Windows Thread Pools призван значительно упростить программистам управление потоками. Под капотом решаются задачи асинхронного взаимодействия и управления производительностью при помощи переиспользования существующих потоков — это сокращает затраты ресурсов на их создание и уничтожение. Заодно решены проблемы с очередями потоков и еще вагоном мелких тонкостей, которые бы свели с ума программиста, если бы тот пытался реализовать все это самостоятельно.
Код, управляющий пулами потоков, преимущественно располагается в режиме пользователя (ntdll.dll
), и только небольшая его часть находится в ядре — поэтому не приходится тратить ресурсы на частое переключение контекстов между ядром и юзерспейсом.
Вот основные узлы Windows Thread Pools:
Именно эти части механизма Thread Pools наиболее интересны с точки зрения эксплуатации техники PoolParty.
Надо сказать, что все процессы, работающие в Windows, используют Thread Pools по умолчанию. Давай попробуем в этом убедиться экспериментально — запустим Process Explorer, выберем любой процесс и перейдем на вкладку Handles.
Фабрики в процессе svchost.exe
Как видишь, процесс svchost.exe
использует Worker Factory, а значит, механизм Thread Pools активен.
Для демонстрации техники PoolParty мы попробуем атаковать рабочие фабрики. А для этого нужно понять, как они создаются.
NTSTATUS NTAPI NtCreateWorkerFactory(_Out_ PHANDLE WorkerFactoryHandleReturn,_In_ ACCESS_MASK DesiredAccess,_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,_In_ HANDLE CompletionPortHandle,_In_ HANDLE WorkerProcessHandle,_In_ PVOID StartRoutine,_In_opt_ PVOID StartParameter,_In_opt_ ULONG MaxThreadCount,_In_opt_ SIZE_T StackReserve,_In_opt_ SIZE_T StackCommit);
NtCreateWorkerFactory
— функция NTAPI, которая создает рабочую фабрику Thread Pools. Обрати внимание на интересные аргументы — WorkerProcessHandle
и StartRoutine
.
StartRoutine
— это указатель на код, который будет выполнен фабрикой при запуске нового потока, а WorkerProcessHandle
— дескриптор процесса, в контексте которого будут выполняться рабочие потоки. Это может быть дескриптор текущего процесса или другого для распределенной обработки. А что, если попробовать модифицировать код StartRoutine
, чтобы он выполнял наш пейлоад, таким образом заставляя фабрику работать на нас?
Но до непосредственной модификации StartRoutine
нужна небольшая подготовка.
Взаимодействие с элементами Thread Pools реализуется через дескрипторы. Соответственно, для получения доступа к рабочей фабрике целевого процесса нужно сначала найти ее хендл и захватить его, используя функцию WinAPI DuplicateHandle
.
Источник: xakep.ru