web-dev-qa-db-fra.com

Accrocher à la mémoire Firefox

J'essaie d'apprendre à accrocher à la mémoire du navigateur. Le outil de Frida est un bon début. Mon objectif est d'extraire les clés de session client, aléatoire et symétriques du client, aléatoire et symétrique établies à la fin d'une poignée de main TLS. En définissant l'environnement SSLKEYLOGFILE, je peux extraire le client-aléatoire et la touche maître, mais elle ne produit pas la clé de serveur-aléatoire.

Après avoir traversé le code source pour Firefox, cela peut être corrigé facilement en imprimant la clé de serveur-aléatoire dans la fonction static void ssl3_RecordKeyLog(sslSocket *ss) à <firefox src/security/nss/lib/ssl/ssl3conn.c>

Cependant, il ne s'agit pas d'une solution viable dans mon projet car elle rend le déploiement pauvre pauvre, c'est-à-dire la compilation de Firefox chaque fois qu'il y a une nouvelle mise à jour n'est généralement pas une bonne pratique pour apporter des modifications au code du navigateur et la redistribuer.

Y a-t-il une meilleure manière de faire cela? Plus spécifiquement, les deux options sont-elles viables? Je n'ai pas beaucoup de connaissances sur l'architecture du navigateur.

  • A. Utilisation d'appels natifs C++ dans une extension Firefox pour appeler cette fonction/n'importe quelle fonction du fichier src/security/nss/lib/ssl/ssl3conn.c.

  • B. Utilisez un crochet de navigateur pour appeler mon propre code chaque fois que cette fonction est appelée dans le navigateur.

Contexte: Utilisation des trois valeur du serveur Secret aléatoire et maître du client, je souhaite générer la touche qui est autrefois utilisée pour générer des clés de cryptage utilisés dans une session TLS.

Je suis conscient que Wirehark a cette fonctionnalité et avec un minimum de changement, je peux émettre les clés, mais je ne voudrais pas utiliser Wireshark car elle consomme plus de ressources sur l'ordinateur hôte pour un processus simple comme une génération de clé.

Je peux écrire mon propre code libpcap pour analyser le trafic, mais je voudrais garder cela comme dernière option.

8
user124499

Vous voudrez peut-être essayer cela avec 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()

Notez que je n'ai pas essayé ce code, mais comme vous semblez avoir réussi à obtenir le client-aléatoire et la clé principale, avec pr_write (qui est ce que Firefox Sorties), vous obtiendrez probablement le serveur aléatoire avec pr_read (qui est ce que le serveur répond).

Sources:


Comment j'ai trouvé que:

  • regardé la page que vous avez liée.
  • a constaté que la façontte d'obtenir ce que la sortie Firefox utilise pr_write
  • regardé quelle est la fonction sur le MDN
  • deviné que s'il y a une écriture, il pourrait y avoir une lecture
  • recherché pr_read sur le MDN
  • trouvé qu'il a la même signature que pr_write
  • remplacé pr_write avec pr_read
  • si la signature était différente, j'aurais peut-être dû changer de plus de choses autour (comme les arguments [])
2
satibel