Conexión a la memoria de Firefox

8

Estoy tratando de aprender a conectarse a la memoria del navegador. La herramienta Frida es un buen comienzo para esto. Mi objetivo es extraer las claves de sesión aleatorias de cliente, servidor aleatorio y simétricas establecidas al final de un protocolo de enlace TLS. Al configurar el entorno SSLKEYLOGFILE puedo extraer el cliente y la clave maestra, sin embargo, no genera la clave del servidor.

Después de revisar el código fuente de Firefox, esto se puede solucionar fácilmente imprimiendo la clave aleatoria del servidor en la función static void ssl3_RecordKeyLog(sslSocket *ss) at <firefox src/security/nss/lib/ssl/ssl3conn.c>

Sin embargo, esta no es una solución viable en mi proyecto, ya que hace que la capacidad de implementación sea deficiente, es decir, compilar Firefox cada vez que hay una nueva actualización, generalmente no es una buena práctica hacer cambios en el código del navegador y redistribuirlo.

¿Hay una mejor manera de hacer esto? Más específicamente, ¿alguna de estas dos opciones es viable? No tengo mucho conocimiento sobre la arquitectura del navegador.

  • A. Usando llamadas nativas de C ++ en una extensión de Firefox para llamar a esta función / cualquier función del archivo src/security/nss/lib/ssl/ssl3conn.c .

  • B. Use un enlace del navegador para llamar a mi propio código cada vez que se llame a esta función en el navegador.

Contexto: Utilizando los tres valores de servidor aleatorio, cliente aleatorio y maestro secreto, quiero generar el bloqueo de clave que se usa para generar las claves de cifrado utilizadas en una sesión TLS.

Soy consciente de que wireshark tiene esta característica, y con un cambio mínimo puedo enviar las claves, pero no me gustaría usar Wirehark ya que consumiría más recursos en la computadora host para un proceso simple como la generación de claves.

Puedo escribir mi propio código libpcap para analizar a través del tráfico, pero me gustaría mantener esto como la última opción.

    
pregunta Christophe Strobbe 16.09.2016 - 01:42
fuente

1 respuesta

2

Es posible que desee probar esto 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()

Tenga en cuenta que no he probado este código, pero como parece haber logrado obtener el cliente aleatorio y la clave maestra, con PR_Write (que es lo que produce Firefox), probablemente obtendrá el servidor al azar con PR_Read (que es lo que responde el servidor).

Fuentes:

Cómo encontré eso:

  • miró la página que has vinculado.
  • encontró que la forma de obtener qué salida de Firefox está usando PR_Write
  • miró cuál es la función en MDN
  • supuso que si hay una escritura, podría haber una lectura
  • buscó PR_Read en MDN
  • encontró que tiene la misma firma que PR_Write
  • reemplazó PR_Write con PR_Read
  • si la firma fuera diferente, podría haber tenido que cambiar algunas cosas más (como los argumentos [])
respondido por el satibel 12.01.2017 - 15:37
fuente

Lea otras preguntas en las etiquetas