Svchost는 리소스 소비를 줄이기 위해 여러 서비스가 프로세스를 공유할 수 있는 소위 공유 서비스 프로세스를 구현하는 데 필수적입니다. 여러 서비스를 단일 프로세스로 그룹화하면 컴퓨팅 리소스가 절약되며, Windows 프로세스를 만드는 데 Unix 계열과 같은 다른 운영 체제보다 더 많은 시간이 걸리고 더 많은 메모리를 소비하기 때문에 이러한 고려 사항은 NT 디자이너에게 특히 중요했습니다. 1
이는 간단히 말해서 다음을 의미합니다. Windows 운영 체제에서 svchost.exe는 서비스를 관리하며 서비스는 실제로 svchost.exe에서 스레드로 실행됩니다. Phant0m은 이벤트 로그 서비스를 대상으로 하며 이벤트 로그 서비스를 담당하는 프로세스를 찾아서 이벤트 로그 서비스를 담당하는 스레드를 감지하고 종료합니다. 따라서 이벤트 로그 서비스가 시스템에서 실행 중인 것처럼 보이지만(Phant0m이 프로세스를 종료하지 않았기 때문에) 실제로는 실행되지 않고(Phant0m이 스레드를 종료했기 때문에) 시스템이 로그를 수집하지 않습니다.
Phant0m은 두 가지 다른 옵션을 사용하여 이벤트 로그 서비스의 프로세스 ID를 감지합니다. 첫 번째는 SCM(Service Control Manager)을 통해 감지하는 것이고, 두 번째는 WMI(Windows Management Instrumentation)를 통해 감지하는 것입니다. 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에서 프로젝트를 열고 설정을 지정한 후(탐지 및 종료 기술 선택) 컴파일합니다. Cobalt Strike와 함께 Reflective DLL 버전을 사용할 수도 있습니다. 이를 위해 저장소에 Aggressor 스크립트 파일(phant0m.cna)이 있습니다.
Cobalt Strike의 경우 Aggressor Script(phant0m.cna) 실행 유형에서 bdllspawn
과 함께 Fork and inject 방식을 사용했습니다. 기존 프로세스에 Phant0m을 주입하고 실행하려면 이 프로젝트(https://github.com/rxwx/cs-rdll-ipc-example)를 검토하면 쉽게 할 수 있습니다. 코드를 DLL로 변환한 다음 Donut을 사용하여 Shellcode로 변환할 수도 있습니다.
참고: 이 프로젝트는 x64 아키텍처만 지원합니다.