Svchost 在实现所谓的共享服务进程中至关重要,其中多个服务可以共享一个进程以减少资源消耗。将多个服务分组到单个进程中可以节省计算资源,NT 设计者特别关心这一点,因为与其他操作系统(例如 Unix 系列)相比,创建 Windows 进程需要更多时间并消耗更多内存。 1
简而言之,这意味着;在 Windows 操作系统上,svchost.exe 管理服务,并且服务实际上作为线程在 svchost.exe 下运行。 Phant0m 以事件日志服务为目标,找到负责事件日志服务的进程,检测并杀死负责事件日志服务的线程。因此,虽然事件日志服务似乎在系统中运行(因为 Phant0m 没有终止进程),但它实际上并未运行(因为 Phant0m 终止了线程)并且系统不收集日志。
Phant0m 使用两个不同的选项来检测事件日志服务的进程 ID。第一种是通过 SCM(服务控制管理器)进行检测,第二种是通过 WMI(Windows 管理规范)进行检测。您希望 Phant0m 使用哪种方法检测事件日志服务的进程 ID,请更改 main.cpp 文件中的以下行。
例如,如果您希望通过 SCM 检测进程 ID,则应按如下方式编辑它。 (不要同时设置所有值,仅设置您想要的一种技术。)
// 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.
例如,如果您希望使用 Technique-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 将使用 NtQueryInformationThread API 检测事件日志服务的线程,以获取线程的 TEB 地址并从 TEB 中读取 SubProcessTag。然后它会终止与事件日志服务相关的线程。该技术的代码位于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 中打开项目,进行设置(选择检测和终止技术)并编译。您还可以将反射 DLL 版本与 Cobalt Strike 一起使用,为此,存储库中有一个 Aggressor 脚本文件 (phant0m.cna)。
Cobalt Strike 的 Aggressor 脚本 (phant0m.cna) 的执行类型中使用了 Fork 和注入方法以及bdllspawn
。如果您想将 Phant0m 注入到现有进程中并运行它,您可以查看此项目(https://github.com/rxwx/cs-rdll-ipc-example)并且可以轻松完成。您还可以将代码转换为 DLL,然后使用 Donut 转换为 Shellcode。
注意:该项目仅支持x64架构。