
Some Service DCOM Object 및 SeImpersonatePrivilege 악용.
DCOM은 기본 가장 수준으로 RPC_C_IMP_LEVEL_IDENTIFY를 사용하며, 기본 아웃바운드 IUnknown 호출에 대해서는 https://learn.microsoft.com/en-us/windows/win32/com/com-security-defaults를 참조하십시오. 물론 COM 서버는 CoInitializeSecurity를 명시적으로 호출하여 재정의할 수 있습니다.
대부분의 Windows 서비스는 기능을 제공하기 위해 자체 DCOM 서버를 등록하며, 공유 프로세스 서비스는 svchost가 호스팅하고 레지스트리에서 기본 가장 수준을 읽습니다.
일부 DCOM 호출에서 악성 IUnknown 객체를 파라미터로 전달하면, 서비스 프로세스는 ProxyObject에 대해 IRemUnknown::RemQueryInterface/RemRelease/RemAddref를 호출하며, 이때 우리는 DCOM Server이므로 CoImpersonateClient를 통해 SecurityImpersonation 토큰을 얻을 수 있습니다.
다음은 기본 설치에서 ImpersonationLevel을 RPC_C_IMP_LEVEL_IMPERSONATE로 명시적으로 설정한 경우입니다:
#12r2 이후
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\print@ImpersonationLevel
#2022만
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\McpManagementServiceGroup@ImpersonationLevel
해당 서비스는 PrinterNotify와 McpManagementService이며 SYSTEM으로 실행됩니다.
이 코드는 x64와 NetFX 4.x만 지원하지만, FX2.0/x86 호환을 위해 약간 수정할 수 있습니다(IUnknown vtbl hook, McpManagementPotato 참조).
csc /unsafe PrinterNotifyPotato.cs
csc /unsafe McpManagementPotato.cs
McpManagementPotato/PrinterNotifyPotato <command>


UnmarshalPwn에게 감사드립니다!
(그리고 제 고양이 Vanilla를 사랑합니다. 누군가 이걸 네코걸로 만들어 줄 수 있나요?)