Svchost необходим при реализации так называемых общих сервисных процессов, когда несколько сервисов могут совместно использовать один процесс для снижения потребления ресурсов. Группирование нескольких служб в один процесс экономит вычислительные ресурсы, и это соображение особенно беспокоило разработчиков 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. Затем он уничтожает потоки, связанные со службой журнала событий. Коды для этой техники находятся в файле the technique_1.h
.
В этом методе Phant0m обнаруживает имена DLL, связанных с потоками. Служба журнала событий Windows использует wevtsvc.dll
. Полный путь: %WinDir%System32wevtsvc.dll
. Если поток использует эту DLL, это поток службы журнала событий Windows, а затем Phant0m уничтожает поток. Коды для этой техники находятся в файле the technique_2.h
.
Вы можете использовать Phant0m как отдельный EXE-файл, так и как рефлексивную DLL. Откройте проект в Microsoft Visual Studio, произведите настройки (выберите методы обнаружения и уничтожения) и скомпилируйте. Вы также можете использовать версию Reflective DLL с Cobalt Strike, для этого в репозитории есть файл Aggressor Script (phant0m.cna).
Метод fork и inject использовался с bdllspawn
в типе выполнения сценария Aggressor (phant0m.cna) для Cobalt Strike. Если вы хотите внедрить Phant0m в существующий процесс и запустить его, вы можете просмотреть этот проект (https://github.com/rxwx/cs-rdll-ipc-example), и вы сможете легко это сделать. Вы также можете преобразовать код в DLL, а затем в Shellcode с помощью Donut.
ПРИМЕЧАНИЕ. Проект поддерживает только архитектуру x64.