Collegamento nella memoria di Firefox

8

Sto cercando di imparare come collegarmi alla memoria del browser. Lo strumento Frida è un buon inizio per questo. Il mio obiettivo è estrarre le chiavi di sessione client-random, server-random e simmetriche stabilite alla fine di un handshake TLS. Impostando l'ambiente SSLKEYLOGFILE posso estrarre il client-random e la chiave master, tuttavia non emette la chiave server-random.

Dopo aver esaminato il codice sorgente per Firefox, questo può essere risolto facilmente stampando la chiave server-random nella funzione static void ssl3_RecordKeyLog(sslSocket *ss) in <firefox src/security/nss/lib/ssl/ssl3conn.c>

Tuttavia, questa non è una soluzione valida nel mio progetto in quanto rende scarsa la capacità di implementazione, ovvero la compilazione di Firefox ogni volta che c'è un nuovo aggiornamento non è generalmente una buona pratica per apportare modifiche al codice del browser e ridistribuirlo.

C'è un modo migliore per farlo? Più specificamente, qualcuna di queste due opzioni è valida? Non ho molta conoscenza dell'architettura del browser.

  • A. Uso di chiamate native C ++ in un'estensione per Firefox per chiamare questa funzione / qualsiasi funzione dal file src/security/nss/lib/ssl/ssl3conn.c .

  • B. Utilizza un hook del browser per chiamare il mio codice ogni volta che viene chiamata questa funzione nel browser.

Contesto: utilizzando i tre valori del server random, client random e master secret, voglio generare il keyblock che viene ulteriormente utilizzato per generare chiavi di crittografia utilizzate in una sessione TLS.

Sono consapevole che wireshark ha questa caratteristica, e con un minimo di modifica posso emettere le chiavi, ma non vorrei usare wireshark poiché consumerebbe più risorse sul computer host per un processo semplice come la generazione di chiavi.

Posso scrivere il mio codice libpcap per analizzare il traffico, ma vorrei mantenere questa come ultima opzione.

    
posta Christophe Strobbe 16.09.2016 - 01:42
fonte

1 risposta

2

Potresti provare questo con frida:

import frida
import sys

session = frida.attach("firefox.exe")
script = session.create_script("""
"use strict";
const PR_Read = Module.findExportByName("nss3.dll", "PR_Read");

Interceptor.attach(PR_Read, {
    onEnter: function (args) {
        let length = args[2].toInt32();
        let buffer = Memory.readByteArray(args[1], length - 1);
        console.log(buffer);
    }
});
""")

script.load()
sys.stdin.read()

Si noti che non ho provato questo codice, ma come sembra che tu sia riuscito a ottenere il client-random e la chiave principale, con PR_Write (che è ciò che output firefox), probabilmente otterrai il server random con PR_Read (che è ciò che risponde il server).

Fonti:

Come ho scoperto che:

  • ha esaminato la pagina che hai collegato.
  • ha trovato che il modo per ottenere ciò che l'output di firefox sta usando PR_Write
  • ha esaminato qual è la funzione su MDN
  • pensava che se c'è una scrittura, potrebbe esserci una lettura
  • cercato PR_Read su MDN
  • ha rilevato che ha la stessa firma di PR_Write
  • sostituito PR_Write con PR_Read
  • se la firma fosse diversa, avrei dovuto cambiare qualcosa in più (come gli args [])
risposta data 12.01.2017 - 15:37
fonte

Leggi altre domande sui tag