Açık Susam: Elektron Kodu İncelemesiyle Açık Yönlendirmeyi RCE’ye Yükseltiyoruz | Eugene Lim tarafından | Başlangıç


Eugene Lim
Başlangıç

İyisiyle kötüsüyle Node.js, geliştiricilerin popülerlik tablolarını hızla yükseltti. React, React Native ve Electron gibi çerçeveler sayesinde geliştiriciler mobil ve yerel platformlar için kolaylıkla istemciler oluşturabilir. Bu istemciler, tek bir JavaScript dosyasının etrafındaki ince sarmalayıcılar halinde sunulur.

Her modern kolaylıkta olduğu gibi bunda da ödünler var. İşin güvenlik tarafında, yönlendirme ve şablonlama mantığını istemci tarafına taşımak, saldırganların kullanılmayan API uç noktalarını, gizlenmemiş sırları ve daha fazlasını keşfetmesini kolaylaştırır. Webpacked React uygulamalarını orijinal kaynak kodlarına ayrıştıran, yazdığım bir araç olan Webpack Exploder’a göz atın.

Yerel masaüstü uygulamaları için, Electron uygulamalarının derlemesi ve hata ayıklaması daha da kolaydır. Saldırganlar, Ghidra/Radare2/Ida ve tonlarca montaj kodu arasında gezinmek yerine, Electron’un yerleşik Chromium DevTools’unu kullanabilir. Bu arada, Electron’un belgeleri, uygulamaların basit bir tek satırlık paketten açılabilen katran benzeri bir format olan asar arşivlerine paketlenmesini öneriyor.

Saldırganlar, kaynak kodu kullanarak istemci tarafındaki güvenlik açıklarını arayabilir ve bunları kod yürütmeye aktarabilir. Sıra dışı arabellek taşmalarına gerek yok — Electron’s nodeIntegration ayarı, uygulamaları hesaplamayı başlatmaktan bir XSS uzakta tutar.

Jasmin Landry’nin gösterdiği gibi bir Electron uygulamasında XSS’nin tehlikeleri.

Uygulamaları test etmede beyaz kutu yaklaşımını seviyorum. Ne aradığınızı biliyorsanız, zayıf noktaları yakınlaştırabilir ve istismarınızı koddan geçerken takip edebilirsiniz.

Bu blog yazısı, bir hata ödül programındaki isimsiz bir Electron uygulamasına ilişkin beyaz kutu incelememi ele alacak. Bazı hata ayıklamaların yardımıyla açık yönlendirmeyi uzaktan kod yürütmeye nasıl yükselttiğimi göstereceğim. Kod örnekleri değiştirildi ve anonimleştirildi.

Yolculuğum bir gün Jasmin’in tweet’ini fark ettiğimde ve kendime biraz Electron hackleme yapmak için ilham aldığımda başladı. Uygulamayı MacOS’a yükleyerek başladım, ardından kaynak kodunu aldım:

  1. Şuraya göz at: Application dosya.
  2. Uygulamaya sağ tıklayın ve seçin Show Package Contents.
  3. Girin Contents içeren bir dizin app.asar dosya.
  4. Koşmak npx asar extract app.asar source (Düğüm kurulmalıdır).
  5. Yeniden derlenmiş kaynak kodunu yeni sayfada görüntüleyin source dizin!

Savunmasız Yapılandırmayı Keşfetmek

İçine bakmak package.jsonyapılandırmayı buldum "main": "app/index.js"bana asıl sürecin şu andan itibaren başlatıldığını söyledi: index.js dosya. Hızlı bir kontrol index.js bunu doğruladı nodeIntegration olarak ayarlandı true çoğu için BrowserWindow örnekler. Bu, saldırgan tarafından kontrol edilen JavaScript’i kolayca yerel kod yürütmeye yükseltebileceğim anlamına geliyordu. Ne zaman nodeIntegration öyle truepenceredeki JavaScript, aşağıdaki gibi yerel Node.js işlevlerine erişebilir: require ve böylece tehlikeli modülleri içe aktarın child_process. Bu, klasik Elektron hesaplama yüküne yol açar require('child_process').execFile('/Applications/Calculator.app/Contents/MacOS/Calculator',function(){}).

XSS’yi deneme

Şimdi tek yapmam gereken bir XSS vektörü bulmaktı. Uygulama, platformlar arası bir işbirliği aracıydı (Slack veya Zoom’u düşünün), dolayısıyla kısa mesajlar veya paylaşılan yüklemeler gibi çok sayıda girdi vardı. Uygulamayı kaynak kodundan başlattım electron . --proxy-server=127.0.0.1:8080Burp Suite aracılığıyla web trafiğini proxy olarak kullanıyor.

Aşağıdaki gibi HTML verilerini test etmeye başladım: pwned girişlerin her birinde. Çok geçmeden ilkini aldım zaptedilmiş! Bu umut verici bir işaretti. Ancak standart XSS verileri aşağıdaki gibi veya basitçe yürütülemedi. Hata ayıklamaya başlamam gerekiyordu.

CSP’yi atlamak

Varsayılan olarak Electron uygulamalarında DevTools’a klavye kısayoluyla erişebilirsiniz. Ctrl+Shift+I veya F12 anahtar. Anahtarları ezdim ama hiçbir şey olmadı. Uygulamanın varsayılan klavye kısayollarını kaldırdığı ortaya çıktı. Bu gizemi çözmek için aradım globalShortcut (Electron’ın klavye kısayol modülü) kaynak kodunda. Bir sonuç ortaya çıktı:

electron.globalShortcut.register('CommandOrControl+H', () => {
activateDevMenu();
});

Aha! Uygulamanın gizli bir menüyü açmak için kendi özel klavye kısayolu vardı. girdim CMD+H ve bir Developer menü çubuğunda menü belirdi. Gibi bir dizi ilginç öğe içeriyordu. Update Ve Callbackama en önemlisi vardı DevTools! DevTools’u açtım ve XSS verilerimi test etmeye devam ettim. Kısa sürede neden başarısız oldukları anlaşıldı; DevTools konsolunda İçerik Güvenliği Politikası (CSP) ihlalinden şikayet eden bir hata mesajı belirdi. Uygulamanın kendisi aşağıdaki CSP’yi içeren bir URL yüklüyordu:

Content-Security-Policy: script-src 'self' 'unsafe-eval' https://cdn.heapanalytics.com https://heapanalytics.com https://*.s3.amazonaws.com https://fast.appcues.com https://*.firebaseio.com

CSP kapsam dışı bıraktı unsafe-inline politika, olay işleyicilerini engelliyor svg yük. Ayrıca, yüklerim JavaScript kullanılarak sayfaya dinamik olarak enjekte edildiğinden, tipik olarak

Source link