KingOfTheNOPs/CDP-Enable-BOF
GitHub: KingOfTheNOPs/CDP-Enable-BOF
一个用于在运行中的 Chrome/Edge 进程里远程启用 CDP 调试端口的 x64 BOF,服务于红队后渗透阶段的会话劫持需求。
Stars: 116 | Forks: 10
# CDP-Enable-BOF
`CDP-Enable-BOF` 是一个 x64 BOF,用于在正在运行的 `msedge.exe` 或 `chrome.exe` 进程中启用 Chrome DevTools Protocol。
基于 [CDP-Enable](https://github.com/deathflamingo/CDP-Enabler/) 以及 [Cedric Van Bockhaven 的利用 DevTools Protocol 进行现代会话劫持技术](https://specterops.io/so-con/)。
## 用法
```
cdp_enable <9000-65535>
```
## 工作原理
- 查找请求的活动浏览器进程及其顶层窗口
- 定位已加载的浏览器模块(`msedge.dll` 或 `chrome.dll`)
- 从远程进程读取该模块的 PE 头和节区
- 在运行时使用掩码字节签名解析以下内部符号:
- `StartRemoteDebuggingServer`
- `operator new`
- `TCPServerSocketFactory::CreateForHttpServer`
- `TCPServerSocketFactory` vtable
- 分配两个小型远程 stub 以及一个上下文块
- 临时安装一个远程窗口过程
- 在浏览器 UI 线程上触发该窗口过程
- 在请求的端口上调用 `StartRemoteDebuggingServer`
在浏览器 UI 线程上执行最终内部调用是关键技巧,这使得在存在 CFG / TLS / CET 敏感执行的情况下依然能保持可靠性。
## 验证
使用附带的 Python 脚本来证明 CDP 已启动并可达:
```
python .\grab_cookies.py --port 9001 --output cookies.json
```
如果 CDP 工作正常,该脚本将:
- 从 `http://127.0.0.1:9001/json/version` 解析浏览器 websocket
- 连接到 websocket
- 将 cookie 转储到 `cookies.json`
可选的域名过滤器:
```
python .\grab_cookies.py --port 9001 --domain microsoft.com --output ms_cookies.json
```
## 常见问题
问题:“Failed to resolve symbol signatures”
原因:Edge 版本不匹配 - 签名是特定于版本的
解决方案:请参阅下文的“查找新签名”
测试的 Chrome 版本:147.0.7727.102
测试的 Edge 版本:147.0.3912.98
## 查找新签名
这些脚本用于为更新的浏览器版本查找新签名及支持运行的输入:
- `StartRemoteDebuggingServer`
- `operator new`
- `TCPServerSocketFactory::CreateForHttpServer`
- 推导出的 `TCPServerSocketFactory` vtable 信息
### 提取 DLL
将你目标浏览器版本中的 DLL 复制到工作目录。在这台机器上,安装的 DLL 位于带有版本号的子目录中:
```
Copy-Item "C:\Program Files\Google\Chrome\Application\147.0.7727.138\chrome.dll" .
Copy-Item "C:\Program Files (x86)\Microsoft\Edge\Application\147.0.3912.98\msedge.dll" .
```
### 提取匹配的 PDB
对于 Chrome:
```
& 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symchk.exe' /v chrome.dll /s srv*C:\symbols*https://chromium-browser-symsrv.commondatastorage.googleapis.com
```
对于 Edge:
```
symchk /v /ocx edge-symchk.txt /s SRV*c:\symbols*https://msdl.microsoft.com/download/symbols .\msedge.dll
```
### 运行脚本
查找 `StartRemoteDebuggingServer`:
```
python .\find_start_server.py .\chrome.dll
python .\find_start_server.py .\msedge.dll
```
Edge 输出示例:
```
{
"binary": "C:\\Users\\antrovmp\\Desktop\\CDP-Enable-BOF\\msedge.dll",
"pdb": "c:\\symbols\\msedge.dll.pdb\\23DB3E4A1AB4F3B44C4C44205044422E1\\msedge.dll.pdb",
"symbol": "?StartRemoteDebuggingServer@DevToolsAgentHost@content@@SAXV?$unique_ptr@VDevToolsSocketFactory@content@@U?$default_delete@VDevToolsSocketFactory@content@@@__Cr@std@@@__Cr@std@@AEBVFilePath@base@@1W4RemoteDebuggingServerMode@12@@Z",
"signature_rva": "0x0321EAC2",
"signature_va": "0x000000018321EAC2",
"signature_length": 30,
"signature_hex": "41 57 41 56 41 54 56 57 55 53 48 83 EC 50 44 89 CD 4C 89 C3 48 89 D7 48 89 CE 48 8B 05 5D",
"signature_c_initializer": "0x41, 0x57, 0x41, 0x56, 0x41, 0x54, 0x56, 0x57, 0x55, 0x53, 0x48, 0x83, 0xEC, 0x50, 0x44, 0x89, 0xCD, 0x4C, 0x89, 0xC3, 0x48, 0x89, 0xD7, 0x48, 0x89, 0xCE, 0x48, 0x8B, 0x05, 0x5D",
"copy_to_code": "Use this for EDGE_START_SIG if analyzing msedge.dll, or CHROME_START_SIG if analyzing chrome.dll.",
"text_hits": 1
}
```
将 `signature_c_initializer` 复制到 `cdp_enable_bof.c` 中的起始签名数组中:
- Edge: 第 168 行的 `EDGE_START_SIG`
- Edge 掩码: 第 181 行的 `EDGE_START_MASK`
- Chrome: 第 194 行的 `CHROME_START_SIG`
- Chrome 掩码: 第 207 行的 `CHROME_START_MASK`
对于 Edge,使用新的 `signature_c_initializer` 替换 `EDGE_START_SIG` 中的字节。对于 Chrome,对 `CHROME_START_SIG` 执行相同操作。
查找支持的输入:
```
python .\find_cdp_inputs.py .\chrome.dll
python .\find_cdp_inputs.py .\msedge.dll
```
Edge 输出示例:
```
{
"binary": "msedge.dll",
"operator_new": {
"rva": "0x036335D8",
"va": "0x00000001836335D8",
"signature": "40 53 48 83 EC 20 48 8B D9 EB ?? 48 8B CB E8 ?? ?? ?? ?? 85 C0 74 ?? 48 8B CB",
"copy_to_code": "OPERATOR_NEW_SIG"
},
"tcp_server_socket_factory": {
"create_for_http_server": {
"rva": "0x016C7310",
"va": "0x00000001816C7310",
"signature_hex": "48 89 D0 0F B7 51 08 48",
"signature_c_initializer": "0x48, 0x89, 0xD0, 0x0F, 0xB7, 0x51, 0x08, 0x48",
"copy_to_code": "EDGE_ENTRY1_SIG",
"vtable_rva": "0x0FBDCA70",
"vtable_va": "0x000000018FBDCA70"
},
"layout": {
"size": 16,
"vtable_offset": 0,
"port_offset": 8
}
}
}
```
重要字段及其去向:
- `operator_new.copy_to_code` -> 第 221 行的 `OPERATOR_NEW_SIG`
- `tcp_server_socket_factory.create_for_http_server.copy_to_code` ->
第 242 行的 `EDGE_ENTRY1_SIG` 或第 246 行的 `CHROME_ENTRY1_SIG`
- `tcp_server_socket_factory.layout` 用于对 BOF 所预期的对象布局进行健全性检查:大小为 `16`,vtable 偏移量为 `0`,端口偏移量为 `8`
该脚本还会推导出 TCPServerSocketFactory vtable 的位置。如果该辅助程序发生偏移,BOF 仍会通过第 228 行和第 234 行的 `VTABLE_ENTRY0_SIG` / `VTABLE_ENTRY0_MASK` 辅助工具对其进行解析。
## 注意事项
- 仅支持 x64
- 已在 `msedge.exe` 和 `chrome.exe` 上测试过
- 该 BOF 仅针对你明确作为参数传递的浏览器
- 当前的 Chrome 解析器使用了更强的掩码 `CreateForHttpServer` 签名,以避免在浏览器补丁级别的更新中出现误报
标签:BOF, SCP, SSH蜜罐, 会话劫持, 欺骗防御, 端点可见性, 进程注入, 逆向工具