mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/network-services-pentesting/pentesting-web/electron-des
This commit is contained in:
		
							parent
							
								
									14d621535a
								
							
						
					
					
						commit
						09d886e466
					
				@ -6,12 +6,12 @@
 | 
			
		||||
 | 
			
		||||
Electron结合了本地后端(使用**NodeJS**)和前端(**Chromium**),尽管它缺乏现代浏览器的一些安全机制。
 | 
			
		||||
 | 
			
		||||
通常,您可能会在`.asar`应用程序中找到electron应用程序代码,获取代码需要提取它:
 | 
			
		||||
通常,您可能会在`.asar`应用程序中找到electron应用代码,获取代码需要提取它:
 | 
			
		||||
```bash
 | 
			
		||||
npx asar extract app.asar destfolder #Extract everything
 | 
			
		||||
npx asar extract-file app.asar main.js #Extract just a file
 | 
			
		||||
```
 | 
			
		||||
在 Electron 应用的源代码中,在 `packet.json` 文件内,可以找到指定的 `main.js` 文件,其中设置了安全配置。
 | 
			
		||||
在Electron应用的源代码中,在`packet.json`文件内,可以找到指定的`main.js`文件,其中设置了安全配置。
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
"name": "standard-notes",
 | 
			
		||||
@ -37,7 +37,7 @@ win.loadURL(`file://path/to/index.html`)
 | 
			
		||||
Electron 应用程序 **可以通过 Node apis 访问设备**,尽管可以配置以防止它:
 | 
			
		||||
 | 
			
		||||
- **`nodeIntegration`** - 默认情况下为 `off`。如果开启,允许从 renderer process 访问 node 特性。
 | 
			
		||||
- **`contextIsolation`** - 默认情况下为 `on`。如果关闭,主进程和渲染进程不会隔离。
 | 
			
		||||
- **`contextIsolation`** - 默认情况下为 `on`。如果关闭,主进程和渲染进程不被隔离。
 | 
			
		||||
- **`preload`** - 默认情况下为空。
 | 
			
		||||
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - 默认情况下为 off。它将限制 NodeJS 可以执行的操作。
 | 
			
		||||
- Node Integration in Workers
 | 
			
		||||
@ -111,7 +111,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
 | 
			
		||||
 | 
			
		||||
## RCE: XSS + nodeIntegration
 | 
			
		||||
 | 
			
		||||
如果 **nodeIntegration** 设置为 **on**,网页的 JavaScript 可以通过调用 `require()` 轻松使用 Node.js 功能。例如,在 Windows 上执行 calc 应用程序的方法是:
 | 
			
		||||
如果 **nodeIntegration** 设置为 **on**,网页的 JavaScript 可以通过调用 `require()` 轻松使用 Node.js 功能。例如,在 Windows 上执行计算器应用程序的方法是:
 | 
			
		||||
```html
 | 
			
		||||
<script>
 | 
			
		||||
require("child_process").exec("calc")
 | 
			
		||||
@ -123,7 +123,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
 | 
			
		||||
 | 
			
		||||
## RCE: preload
 | 
			
		||||
 | 
			
		||||
在此设置中指示的脚本是**在渲染器中加载其他脚本之前**,因此它具有**对 Node API 的无限访问权限**:
 | 
			
		||||
在此设置中指示的脚本是在渲染器中**加载其他脚本之前**,因此它具有**对 Node API 的无限访问权限**:
 | 
			
		||||
```javascript
 | 
			
		||||
new BrowserWindow{
 | 
			
		||||
webPreferences: {
 | 
			
		||||
@ -148,7 +148,7 @@ runCalc()
 | 
			
		||||
</script>
 | 
			
		||||
</body>
 | 
			
		||||
```
 | 
			
		||||
> [!NOTE] > **如果 `contextIsolation` 开启,这将不起作用**
 | 
			
		||||
> [!NOTE] > **如果 `contextIsolation` 开启,这将无法工作**
 | 
			
		||||
 | 
			
		||||
## RCE: XSS + contextIsolation
 | 
			
		||||
 | 
			
		||||
@ -157,11 +157,11 @@ _**contextIsolation**_ 引入了 **网页脚本与 JavaScript Electron 内部代
 | 
			
		||||
如果上下文没有被隔离,攻击者可以:
 | 
			
		||||
 | 
			
		||||
1. 在渲染器中执行 **任意 JavaScript**(XSS 或导航到外部网站)
 | 
			
		||||
2. **覆盖内置方法**,该方法用于预加载或 Electron 内部代码,变为自己的函数
 | 
			
		||||
2. **覆盖内置方法**,该方法在预加载或 Electron 内部代码中被使用,替换为自己的函数
 | 
			
		||||
3. **触发** 使用 **被覆盖的函数**
 | 
			
		||||
4. RCE?
 | 
			
		||||
 | 
			
		||||
内置方法可以在两个地方被覆盖:在预加载代码中或在 Electron 内部代码中:
 | 
			
		||||
内置方法可以被覆盖的地方有两个:在预加载代码中或在 Electron 内部代码中:
 | 
			
		||||
 | 
			
		||||
{{#ref}}
 | 
			
		||||
electron-contextisolation-rce-via-preload-code.md
 | 
			
		||||
@ -187,7 +187,7 @@ window.addEventListener('click', (e) => {
 | 
			
		||||
 | 
			
		||||
在部署 Electron 桌面应用程序时,确保 `nodeIntegration` 和 `contextIsolation` 的正确设置至关重要。已确定,**客户端远程代码执行 (RCE)** 针对预加载脚本或 Electron 的主进程本地代码在这些设置到位时有效防止。
 | 
			
		||||
 | 
			
		||||
当用户与链接交互或打开新窗口时,会触发特定的事件监听器,这对应用程序的安全性和功能至关重要:
 | 
			
		||||
当用户与链接互动或打开新窗口时,会触发特定的事件监听器,这对应用程序的安全性和功能至关重要:
 | 
			
		||||
```javascript
 | 
			
		||||
webContents.on("new-window", function (event, url, disposition, options) {}
 | 
			
		||||
webContents.on("will-navigate", function (event, url) {}
 | 
			
		||||
@ -200,7 +200,7 @@ webContents.on("will-navigate", function (event, url) {}
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
Electron JS安全最佳实践建议不要使用`openExternal`函数接受不受信任的内容,因为这可能通过各种协议导致RCE。操作系统支持不同的协议,这些协议可能触发RCE。有关此主题的详细示例和进一步解释,可以参考[此资源](https://positive.security/blog/url-open-rce#windows-10-19042),其中包括能够利用此漏洞的Windows协议示例。
 | 
			
		||||
Electron JS安全最佳实践建议不要使用`openExternal`函数接受不受信任的内容,因为这可能通过各种协议导致RCE。操作系统支持不同的协议,这些协议可能触发RCE。有关此主题的详细示例和进一步解释,可以参考[这个资源](https://positive.security/blog/url-open-rce#windows-10-19042),其中包括能够利用此漏洞的Windows协议示例。
 | 
			
		||||
 | 
			
		||||
在macos中,`openExternal`函数可以被利用来执行任意命令,例如`shell.openExternal('file:///System/Applications/Calculator.app')`。
 | 
			
		||||
 | 
			
		||||
@ -226,11 +226,11 @@ window.open(
 | 
			
		||||
```
 | 
			
		||||
## 读取内部文件:XSS + contextIsolation
 | 
			
		||||
 | 
			
		||||
**禁用 `contextIsolation` 使得可以使用 `<webview>` 标签**,类似于 `<iframe>`,用于读取和外泄本地文件。提供的示例演示了如何利用此漏洞读取内部文件的内容:
 | 
			
		||||
**禁用 `contextIsolation` 使得可以使用 `<webview>` 标签**,类似于 `<iframe>`,用于读取和提取本地文件。提供的示例演示了如何利用此漏洞读取内部文件的内容:
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
此外,还分享了另一种 **读取内部文件** 的方法,突出了 Electron 桌面应用中的一个关键本地文件读取漏洞。这涉及注入脚本以利用该应用并外泄数据:
 | 
			
		||||
此外,还分享了另一种 **读取内部文件** 的方法,突出了 Electron 桌面应用中的一个关键本地文件读取漏洞。这涉及注入脚本以利用该应用并提取数据:
 | 
			
		||||
```html
 | 
			
		||||
<br /><br /><br /><br />
 | 
			
		||||
<h1>
 | 
			
		||||
@ -262,7 +262,7 @@ webContents.on("will-navigate", function (event, url) {}                    // o
 | 
			
		||||
```
 | 
			
		||||
对**`openInternally`**的调用将决定**链接**是作为平台的链接在**桌面窗口**中**打开**,还是作为**第三方资源**在**浏览器**中打开。
 | 
			
		||||
 | 
			
		||||
如果该函数使用的**正则表达式****易受绕过攻击**(例如**未对子域的点进行转义**),攻击者可能会利用XSS**打开一个新窗口**,该窗口位于攻击者的基础设施中,**向用户请求凭据**:
 | 
			
		||||
如果该函数使用的**regex**对绕过**漏洞**(例如**未转义子域的点**)是**脆弱的**,攻击者可以利用XSS**打开一个新窗口**,该窗口位于攻击者的基础设施中,**向用户请求凭据**:
 | 
			
		||||
```html
 | 
			
		||||
<script>
 | 
			
		||||
window.open("<http://subdomainagoogleq.com/index.html>")
 | 
			
		||||
@ -295,31 +295,31 @@ remoteMain.enable(mainWindow.webContents)
 | 
			
		||||
```javascript
 | 
			
		||||
import { dialog, getCurrentWindow } from '@electron/remote'
 | 
			
		||||
```
 | 
			
		||||
该**[博客文章](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)**指出了远程模块中对象**`app`**暴露的一些有趣的**函数**:
 | 
			
		||||
**[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** 指出了一些由远程模块的对象 **`app`** 暴露的有趣 **函数**:
 | 
			
		||||
 | 
			
		||||
- **`app.relaunch([options])`**
 | 
			
		||||
- **重新启动**应用程序,通过**退出**当前实例并**启动**一个新实例。对于**应用更新**或重大**状态变化**非常有用。
 | 
			
		||||
- **重新启动** 应用程序,通过 **退出** 当前实例并 **启动** 新实例。对于 **应用更新** 或重大 **状态变化** 很有用。
 | 
			
		||||
- **`app.setAppLogsPath([path])`**
 | 
			
		||||
- **定义**或**创建**一个目录以存储**应用日志**。可以使用**`app.getPath()`**或**`app.setPath(pathName, newPath)`**来**检索**或**修改**日志。
 | 
			
		||||
- **定义** 或 **创建** 一个目录来存储 **应用日志**。可以使用 **`app.getPath()`** 或 **`app.setPath(pathName, newPath)`** 来 **检索** 或 **修改** 日志。
 | 
			
		||||
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
 | 
			
		||||
- **注册**当前可执行文件作为指定**协议**的**默认处理程序**。如有需要,可以提供**自定义路径**和**参数**。
 | 
			
		||||
- **注册** 当前可执行文件作为指定 **协议** 的 **默认处理程序**。如有需要,可以提供 **自定义路径** 和 **参数**。
 | 
			
		||||
- **`app.setUserTasks(tasks)`**
 | 
			
		||||
- **添加**任务到**任务类别**中(在Windows上)。每个任务可以控制应用程序如何**启动**或传递什么**参数**。
 | 
			
		||||
- **添加** 任务到 **任务类别** 在 **跳转列表**(在 Windows 上)。每个任务可以控制应用程序如何 **启动** 或传递什么 **参数**。
 | 
			
		||||
- **`app.importCertificate(options, callback)`**
 | 
			
		||||
- **将**一个**PKCS#12证书**导入系统的**证书存储**(仅限Linux)。可以使用**回调**来处理结果。
 | 
			
		||||
- **导入** 一个 **PKCS#12 证书** 到系统的 **证书存储**(仅限 Linux)。可以使用 **回调** 来处理结果。
 | 
			
		||||
- **`app.moveToApplicationsFolder([options])`**
 | 
			
		||||
- **将**应用程序移动到**应用程序文件夹**(在macOS上)。有助于确保Mac用户的**标准安装**。
 | 
			
		||||
- **移动** 应用程序到 **应用程序文件夹**(在 macOS 上)。帮助确保 Mac 用户的 **标准安装**。
 | 
			
		||||
- **`app.setJumpList(categories)`**
 | 
			
		||||
- **设置**或**移除****自定义Jump List**(在Windows上)。可以指定**类别**以组织任务如何呈现给用户。
 | 
			
		||||
- **设置** 或 **移除** 一个 **自定义跳转列表** 在 **Windows** 上。可以指定 **类别** 来组织任务如何显示给用户。
 | 
			
		||||
- **`app.setLoginItemSettings(settings)`**
 | 
			
		||||
- **配置**在**登录**时启动的**可执行文件**及其**选项**(仅限macOS和Windows)。
 | 
			
		||||
- **配置** 在 **登录** 时启动的 **可执行文件** 及其 **选项**(仅限 macOS 和 Windows)。
 | 
			
		||||
```javascript
 | 
			
		||||
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
 | 
			
		||||
Native.app.exit()
 | 
			
		||||
```
 | 
			
		||||
## systemPreferences 模块
 | 
			
		||||
 | 
			
		||||
在 Electron 中访问系统偏好设置和发出系统事件的 **主要 API**。像 **subscribeNotification**、**subscribeWorkspaceNotification**、**getUserDefault** 和 **setUserDefault** 这样的函数都是这个模块的 **一部分**。
 | 
			
		||||
在 Electron 中访问系统偏好设置和 **发出系统事件** 的 **主要 API**。像 **subscribeNotification**、**subscribeWorkspaceNotification**、**getUserDefault** 和 **setUserDefault** 这样的函数都是这个模块的 **一部分**。
 | 
			
		||||
 | 
			
		||||
**示例用法:**
 | 
			
		||||
```javascript
 | 
			
		||||
@ -336,19 +336,19 @@ console.log('Recent Places:', recentPlaces);
 | 
			
		||||
```
 | 
			
		||||
### **subscribeNotification / subscribeWorkspaceNotification**
 | 
			
		||||
 | 
			
		||||
* **监听** **本机 macOS 通知**,使用 NSDistributedNotificationCenter。
 | 
			
		||||
* **监听** **本地 macOS 通知**,使用 NSDistributedNotificationCenter。
 | 
			
		||||
* 在 **macOS Catalina** 之前,您可以通过将 **nil** 传递给 CFNotificationCenterAddObserver 来嗅探 **所有** 分发的通知。
 | 
			
		||||
* 在 **Catalina / Big Sur** 之后,沙盒应用仍然可以通过按 **名称** 注册通知来 **订阅** **许多事件**(例如,**屏幕锁定/解锁**、**卷挂载**、**网络活动**等)。
 | 
			
		||||
 | 
			
		||||
### **getUserDefault / setUserDefault**
 | 
			
		||||
 | 
			
		||||
* **与** **NSUserDefaults** 交互,存储 **应用程序** 或 **全局** 偏好设置在 macOS 上。
 | 
			
		||||
* **与** **NSUserDefaults** **接口**,它在 macOS 上存储 **应用程序** 或 **全局** 偏好设置。
 | 
			
		||||
 | 
			
		||||
* **getUserDefault** 可以 **检索** 敏感信息,例如 **最近的文件位置** 或 **用户的地理位置**。
 | 
			
		||||
 | 
			
		||||
* **setUserDefault** 可以 **修改** 这些偏好设置,可能会影响应用的 **配置**。
 | 
			
		||||
 | 
			
		||||
* 在 **旧版 Electron**(v8.3.0 之前),只有 **标准套件** 的 NSUserDefaults 是 **可访问的**。
 | 
			
		||||
* 在 **旧版 Electron**(v8.3.0 之前)中,只有 **标准套件** 的 NSUserDefaults 是 **可访问的**。
 | 
			
		||||
 | 
			
		||||
## Shell.showItemInFolder
 | 
			
		||||
 | 
			
		||||
@ -356,9 +356,21 @@ console.log('Recent Places:', recentPlaces);
 | 
			
		||||
 | 
			
		||||
有关更多信息,请查看 [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
 | 
			
		||||
 | 
			
		||||
## Content Security Policy
 | 
			
		||||
 | 
			
		||||
Electron 应用应具有 **内容安全策略 (CSP)** 以 **防止 XSS 攻击**。**CSP** 是一种 **安全标准**,有助于 **防止** 在浏览器中 **执行** **不受信任的代码**。
 | 
			
		||||
 | 
			
		||||
它通常在 **`main.js`** 文件或 **`index.html`** 模板中通过 **meta 标签** 配置 CSP。
 | 
			
		||||
 | 
			
		||||
有关更多信息,请查看:
 | 
			
		||||
 | 
			
		||||
{{#ref}}
 | 
			
		||||
pentesting-web/content-security-policy-csp-bypass/
 | 
			
		||||
{{#endref}}
 | 
			
		||||
 | 
			
		||||
## **工具**
 | 
			
		||||
 | 
			
		||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity) 是一个识别 Electron 应用程序中的错误配置和安全反模式的工具。
 | 
			
		||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity) 是一个识别 Electron 应用程序中配置错误和安全反模式的工具。
 | 
			
		||||
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) 是一个用于 Electron 应用程序的开源 VS Code 插件,使用 Electronegativity。
 | 
			
		||||
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) 用于检查易受攻击的第三方库
 | 
			
		||||
- [**Electro.ng**](https://electro.ng/): 您需要购买它
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user