DCOM Potato
原创 zcgonvh 2022-12-09 12:08 北京
去年猫猫托梦的两颗土豆。
去年猫猫托梦带来的洞,两个EXP原理一样,只有服务不同,所以存在一些微小的差别。
漏洞原理是
McpManagement/PrinterNotify
这两个服务通过svchost
托管,并公开了自己的DCOM对象。svchost有个特性,在注册表
(https://www.geoffchappell.com/studies/windows/win32/services/svchost/process/index.htm)可以配置自定义的ImpersonateLevel
,这个值会传递给CoInitializeSecurity
,从而更改所有远程IUnknown
默认对外连接的模拟等级。默认安装的情况下有且只有这两个服务配置了ImpersonateLevel,且均为
RPC_C_IMP_LEVEL_IMPERSONATE
:#after 12r2HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\print@ImpersonationLevel#2022 onlyHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\McpManagementServiceGroup@ImpersonationLevel
所以只要自己实现一个COM对象,在
IUnknown::QueryInterface/Release/Addref
中直接调用CoImpersonateClient
,就能捕获到一个SecurityImpersonation
等级的token,之后创建进程什么的就随意了。核心技巧都是六七年前的东西,取Token可以认为是James Forshaw 15年那个祖传的 CaptureImpersonationToken.cpp PrinterNotify UnmarshalPwn
当然了,微软一直认为“SeImpersonatePrivilege to LOCAL SYSTEM is a feature by design, not a security boundary”,安心用一段时间还是可以的。
另致防御/应急/PR:“修补”方法是禁用没用的
PrinterNotify/McpManagement
服务,对服务器没有任何影响,哪怕它是个打印服务器。