
DISM API 트리거와 스레드 가장을 통해 TrustedInstaller를 가장하는 BOF
BOF로 DISM API 트리거 및 스레드 가장을 통해 TrustedInstaller를 가장합니다.
Cobalt Strike Beacon을 관리자 컨텍스트에서 NT AUTHORITY\SYSTEM으로 상승시키며, 토큰 그룹에 NT SERVICE\TrustedInstaller SID를 포함합니다. 이를 통해 TrustedInstaller가 소유한 파일, 레지스트리 키 및 기타 개체를 수정할 수 있습니다(즉, SYSTEM만으로는 충분하지 않을 수 있는 작업).
TrustedInstaller가 되는 대부분의 공개적인 접근 방식은 서비스 제어 관리자(SCM)를 통해 직접 TrustedInstaller 서비스를 시작합니다(예: sc start TrustedInstaller 또는 StartServiceW). 이는 작동하지만, SCM과의 상호작용은 방어자들에게 잘 알려져 있고 일반적으로 로깅됩니다.
trustme는 다른 접근 방식을 사용합니다:
dismapi.dll을 로드하고 DISM 상태 검사를 실행합니다. DISM API(DismCheckImageHealth)는 내부적으로 서비스 스택 작업의 부작용으로 TrustedInstaller.exe를 시작합니다. DISM 세션은 열린 상태로 유지되어 TrustedInstaller가 사용되기 전에 종료되지 않도록 합니다.
NtGetNextProcess를 사용하여 프로세스 목록을 순회합니다. OpenProcess 또는 CreateToolhelp32Snapshot 대신 NtGetNextProcess를 통해 간접적으로 프로세스 핸들을 열거하고 NtQueryInformationProcess(ProcessImageFileName)로 이미지 이름을 일치시킵니다.
NtImpersonateThread를 통해 TrustedInstaller 스레드를 가장합니다. 마찬가지로 TID로 직접 열지 않고 NtGetNextThread로 스레드를 순회합니다. 사용 가능한 스레드를 찾으면 이를 가장하고 결과 토큰을 BeaconUseToken으로 Beacon에 등록합니다.
정리합니다. DISM 세션을 닫고, dismapi.dll을 Beacon 프로세스에서 해제하며, 핸들을 해제합니다. 가장 토큰은 rev2self를 실행할 때까지 Beacon 세션에 유지됩니다.
SeDebugPrivilege가 있어야 합니다(관리자 계정의 경우 기본적으로 있음, BOF가 자동으로 활성화함)trustme.c와 같은 디렉터리에 Cobalt Strike bof_template 저장소의 beacon.h가 필요합니다.
MinGW (Linux/macOS):
x86_64-w64-mingw32-gcc -c trustme.c -o trustme.x64.o -masm=intel -Wall
MSVC (Windows, x64 네이티브 도구 프롬프트에서):
cl.exe /c /GS- /Fo"trustme.x64.o" trustme.c
trustme.x64.o (및/또는 trustme.x86.o)를 trustme.cna와 같은 디렉터리에 배치합니다.trustme.cna를 로드합니다.beacon> trustme
[+] SeDebugPrivilege 활성화됨
[*] DISM 상태 검사 완료, TrustedInstaller가 실행 중이어야 함
[*] TrustedInstaller.exe 발견 (PID: 31337)
[+] 스레드 가장 성공 (ID: SYSTEM)
[+] Beacon 세션에 토큰 적용됨
[+] 이제 TrustedInstaller로 실행 중입니다. 되돌리려면 'rev2self'를 사용하세요.
beacon> shell whoami /groups | findstr TrustedInstaller
NT SERVICE\TrustedInstaller Well-known group S-1-5-80-956008885-... 기본적으로 활성화됨, 활성 그룹, 그룹 소유자
beacon> rev2self