
Windows Event Log Killer

Svchost является ключевым в реализации так называемых разделяемых процессов-служб, где несколько служб могут использовать один процесс для снижения потребления ресурсов. Группировка нескольких служб в один процесс экономит вычислительные ресурсы, и это соображение было особенно важным для разработчиков Windows NT, поскольку создание процессов в Windows занимает больше времени и потребляет больше памяти, чем в других операционных системах, например, в семействе Unix.1
Это означает, что в операционных системах Windows svchost.exe управляет службами и службы фактически работают как потоки внутри svchost.exe. Phant0m нацеливается на службу журнала событий и, находя процесс, ответственный за эту службу, обнаруживает и убивает потоки, отвечающие за службу журнала событий. Таким образом, хотя служба журнала событий остаётся видимой как запущенная в системе (поскольку Phant0m не убивает процесс), она фактически не работает (поскольку Phant0m убил потоки), и система не собирает журналы.

Phant0m использует два разных способа для определения идентификатора процесса службы журнала событий. Первый — через SCM (Диспетчер управления службами), второй — через WMI (Инструментарий управления Windows). Чтобы указать, каким методом Phant0m должен определять идентификатор процесса, измените следующие строки в файле main.cpp.
Например, если вы хотите, чтобы идентификатор процесса определялся через SCM, измените следующим образом. (Не устанавливайте все значения одновременно, укажите только один желаемый метод.)
// PID detection techniques configuration section.
#define PID_FROM_SCM 1 // If you set it to 1, the PID of the Event Log service is obtained from the Service Manager.
#define PID_FROM_WMI 0 // If you set it to 1, the PID of the Event Log service is obtained from the WMI.
Например, если вы хотите, чтобы потоки убивались с помощью Техники-1, измените следующим образом. (Не устанавливайте все значения одновременно, укажите только один желаемый метод.)
// TID detection and kill techniques configuration section.
#define KILL_WITH_T1 1 // If you set it to 1, Technique-1 will be use. For more information; https://github.com/hlldz/Phant0m
#define KILL_WITH_T2 0 // If you set it to 1, Technique-2 will be use. For more information; https://github.com/hlldz/Phant0m
Phant0m использует два разных способа для обнаружения и уничтожения потоков службы журнала событий.
Когда каждая служба регистрируется на машине под управлением Windows Vista или новее, Диспетчер управления службами (SCM) присваивает службе уникальный числовой тег (в порядке возрастания). Затем при создании службы этот тег присваивается TEB главного потока службы. Впоследствии этот тег распространяется на все потоки, созданные главным потоком службы. Например, если поток службы Foo создаёт рабочий поток RPC (обратите внимание: рабочие потоки RPC не используют механизм пула потоков, об этом позже), то этот поток получит тег службы Foo.2
Итак, в этой технике Phant0m обнаруживает потоки службы журнала событий с помощью API NtQueryInformationThread для получения адреса TEB потока и чтения SubProcessTag из TEB. Затем он убивает потоки, связанные со службой журнала событий. Код этой техники находится в файле technique_1.h.
В этой технике Phant0m определяет имена DLL, связанных с потоками. Служба журнала событий Windows использует wevtsvc.dll. Полный путь: %WinDir%\System32\wevtsvc.dll. Если поток использует эту DLL, значит, это поток службы журнала событий Windows, и Phant0m убивает его. Код этой техники находится в файле technique_2.h.
Вы можете использовать Phant0m как в виде отдельного EXE-файла, так и в виде отражаемой DLL. Откройте проект в Microsoft Visual Studio, настройте параметры (выберите методы обнаружения и уничтожения) и скомпилируйте. Версию с отражаемой DLL можно также использовать с Cobalt Strike; для этого в репозитории находится файл сценария Aggressor (phant0m.cna).

В сценарии Aggressor (phant0m.cna) для Cobalt Strike использовался метод fork и inject с bdllspawn. Если вы хотите внедрить Phant0m в уже существующий процесс и запустить его, вы можете изучить этот проект (https://github.com/rxwx/cs-rdll-ipc-example) и легко это сделать. Вы также можете преобразовать код в DLL, а затем в шелл-код с помощью Donut.
ПРИМЕЧАНИЕ: Проект поддерживает только архитектуру x64.