Инжекты — это техника внедрения своего кода в сторонние процессы с целью получения контроля или выполнения нужных действий. Поскольку такое может провернуть не только пентестер, но и злоумышленник, понимание этих техник позволяет эффективно предотвращать атаки и укреплять защищенность.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Windows Thread Pools
Механизм Windows Thread Pools призван значительно упростить программистам управление потоками. Под капотом решаются задачи асинхронного взаимодействия и управления производительностью при помощи переиспользования существующих потоков — это сокращает затраты ресурсов на их создание и уничтожение. Заодно решены проблемы с очередями потоков и еще вагоном мелких тонкостей, которые бы свели с ума программиста, если бы тот пытался реализовать все это самостоятельно.
Код, управляющий пулами потоков, преимущественно располагается в режиме пользователя (ntdll.
), и только небольшая его часть находится в ядре — поэтому не приходится тратить ресурсы на частое переключение контекстов между ядром и юзерспейсом.
Вот основные узлы Windows Thread Pools:
- рабочая фабрика (Worker Factory), которая управляет созданием и удалением новых потоков;
- рабочие очереди:
- очередь задач (task queue) — задачи, которые передаются в пул. Эти задачи могут быть как быстрыми (выполняться в течение короткого времени), так и более длительными. Пул потоков автоматически масштабируется — если задач много, пул может создать дополнительные потоки, чтобы справиться с нагрузкой;
- очередь ввода‑вывода (I/O completion queue) выполняет задачи, связанные с операциями ввода‑вывода, такие как файловые операции или сетевые запросы;
- очередь таймера (timer queue) позволяет выполнять задачи через определенные промежутки времени или в заданное время.
Именно эти части механизма Thread Pools наиболее интересны с точки зрения эксплуатации техники PoolParty.
Надо сказать, что все процессы, работающие в Windows, используют Thread Pools по умолчанию. Давай попробуем в этом убедиться экспериментально — запустим Process Explorer, выберем любой процесс и перейдем на вкладку Handles.
Как видишь, процесс svchost.
использует 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».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее