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蜜罐, 会话劫持, 欺骗防御, 端点可见性, 进程注入, 逆向工具