Electron Desktop Apps
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
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:
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.
Electron'ın 2 işlem türü vardır:
Ana İşlem (NodeJS'ye tam erişime sahiptir)
Render İşlemi (güvenlik nedenleriyle NodeJS'ye kısıtlı erişime sahip olmalıdır)
Bir render işlemi, bir dosyayı yükleyen bir tarayıcı penceresi olacaktır:
renderer process ayarları main.js dosyası içinde main process'te 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.
Electron uygulaması, Node apileri aracılığıyla cihaza 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
- 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ü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:
Bazı RCE yükleri buradan:
Başlatma ana yapılandırmasını değiştirin ve aşağıdaki gibi bir proxy kullanmayı ekleyin:
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 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:
Bu ayarda belirtilen script, renderer'daki diğer scriptlerden önce yüklenir, bu nedenle Node API'lerine sınırsız erişime sahiptir:
Bu nedenle, script node-features'ı sayfalara aktarabilir:
Eğer contextIsolation
açıksa, bu çalışmayacak
contextIsolation, web sayfası scriptleri ile JavaScript Electron'un iç kodu arasında ayrılmış bağlamlar tanıtır, böylece her kodun JavaScript yürütmesi birbirini etkilemez. Bu, RCE olasılığını ortadan kaldırmak için gerekli bir özelliktir.
Eğer bağlamlar izole edilmemişse, bir saldırgan:
renderer'da keyfi JavaScript çalıştırabilir (XSS veya harici sitelere yönlendirme)
Preload veya Electron iç kodunda kullanılan yerleşik yöntemi kendi fonksiyonu ile üstüne yazabilir
üstüne yazılmış fonksiyonun kullanılmasını tetikleyebilir
RCE?
Yerleşik yöntemlerin üzerine yazılabileceği 2 yer vardır: Preload kodunda veya Electron iç kodunda:
Bir bağlantıya tıkladığınızda kısıtlamalar uygulanıyorsa, bunları normal sol tıklama yerine orta tıklama yaparak atlatabilirsiniz.
Bu örnekler hakkında daha fazla bilgi için https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 ve 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ı bağlantılarla etkileşime girdiğinde veya yeni pencereler açtığında, uygulamanın güvenliği ve işlevselliği için kritik olan belirli olay dinleyicileri tetiklenir:
Bu dinleyiciler, masaüstü uygulaması tarafından kendi iş mantığını uygulamak için geçersiz kılınır. 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. Eğer bu fonksiyon false
dönerse, bu, bağlantının harici olarak açılması gerektiğini, shell.openExternal
fonksiyonunu kullanarak belirtir.
İşte basitleştirilmiş bir pseudocode:
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, bu kaynak, bu açığı istismar edebilecek Windows protokol örneklerini içermektedir.
Windows protokol istismarına örnekler şunlardır:
contextIsolation
'ı devre dışı bırakmak, yerel dosyaları okumak ve dışarı aktarmak için <webview>
etiketlerinin kullanılmasına olanak tanır, <iframe>
'e benzer. Sağlanan bir örnek, bu açığı kullanarak iç dosyaların içeriğini okuma yöntemini göstermektedir:
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:
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. Bununla ilgili bir örneği bu yazıda görebilirsiniz: https://blog.electrovolt.io/posts/discord-rce/
Bir XSS bulduğunuzu varsayalım ama RCE'yi tetikleyemiyorsanız veya dahili dosyaları ç alamıyorsanız, bunu kimlik bilgilerini phishing ile çalmak için kullanmayı deneyebilirsiniz.
Öncelikle, yeni bir URL açmaya çalıştığınızda neler olduğunu, ön uçtaki JS kodunu kontrol ederek bilmeniz gerekiyor:
openInternally
çağrısı, bağlantının platforma ait bir bağlantı olup olmadığına göre masaüstü penceresinde açılacağına veya üçüncü taraf bir kaynak olarak tarayıcıda açılacağına karar verecektir.
Eğer fonksiyonun kullandığı regex bypass'lere karşı savunmasızsa (ö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:
Electronegativity Electron tabanlı uygulamalardaki yanlış yapılandırmaları ve güvenlik anti-paterni tanımlamak için bir araçtır.
Electrolint Electronegativity kullanan Electron uygulamaları için açık kaynaklı bir VS Code eklentisidir.
nodejsscan üçüncü taraf kütüphanelerdeki zafiyetleri kontrol etmek için
Electro.ng: Satın almanız gerekiyor
https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s adresinde zayıf Electron uygulamalarını istismar etmek için bir laboratuvar bulabilirsiniz.
Laboratuvarda size yardımcı olacak bazı komutlar:
Electron güvenliği hakkında daha fazla araştırma ve yazı için https://github.com/doyensec/awesome-electronjs-hacking
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)