
Some Service DCOMオブジェクトとSeImpersonatePrivilegeの悪用。
DCOMはデフォルトの偽装レベルとして RPC_C_IMP_LEVEL_IDENTIFY を使用します。既定のアウトバウンド IUnknown 呼び出しについては https://learn.microsoft.com/en-us/windows/win32/com/com-security-defaults を参照してください。もちろん、COMサーバーは CoInitializeSecurity を明示的に呼び出すことでオーバーライドできます。
ほとんどのWindowsサービスは機能を提供するためにDCOMサーバーを登録していることが知られています。Shared Process Service は svchost によってホストされ、レジストリ からデフォルトの偽装レベルを読み取ります。
あるDCOM呼び出しのパラメータとして悪意のある IUnknown オブジェクトを渡すと、サービスプロセスはProxyObject上で IRemUnknown::RemQueryInterface/RemRelease/RemAddref を呼び出します。このとき、私たちは DCOM Server 側であるため、CoImpersonateClient によって SecurityImpersonation トークンを取得できます。
以下は、デフォルトインストールで ImpersonationLevel が RPC_C_IMP_LEVEL_IMPERSONATE として明示的に設定されている箇所です。
#after 12r2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\print@ImpersonationLevel
#2022 only
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\McpManagementServiceGroup@ImpersonationLevel
これらのサービスは PrinterNotify と McpManagementService であり、SYSTEM として実行されます。
このコードは x64 と NetFX 4.x のみをサポートしていることに注意してください。ただし、FX2.0/x86 互換のために少し変更することもできます(IUnknown vtbl フック、McpManagementPotato を参照)。
csc /unsafe PrinterNotifyPotato.cs
csc /unsafe McpManagementPotato.cs
McpManagementPotato/PrinterNotifyPotato <command>


UnmarshalPwn に感謝します!
(そして愛する私の猫、Vanilla を誰かネコ娘にしてくれませんか?)