¿Recuperar una clave RSA de una instancia en ejecución de Apache?


26

Creé un par de claves RSA para un certificado SSL y almacené la clave privada /etc/ssl/private/server.key. Lamentablemente, esta fue la única copia de la clave privada que tenía.

Luego accidentalmente sobrescribí el archivo en el disco (sí, lo sé).

Apache todavía se está ejecutando y atiende solicitudes SSL, lo que me hace creer que puede haber esperanza en recuperar la clave privada. (¿Quizás haya un enlace simbólico en algún lugar /proco algo así?)

Este servidor ejecuta Ubuntu 12.04 LTS.

Respuestas:


39

¡ÉXITO!

Pude recuperar la clave privada. Pero no fue fácil. Esto es lo que debes hacer:

  1. Hacer seguro de que no reinicie el servidor o Apache. El juego terminó en ese punto. Eso también significa asegurarse de que ningún servicio de monitoreo reinicie Apache.
  2. Tome este archivo : código fuente de una herramienta llamada passe-partout .
  3. Extraiga el código fuente y ajuste la línea 9 Makefile.mainpara leer:

    $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
    

    (Tenga en cuenta que $(OBJS)y $(LDFLAGS)se invierten en orden).

  4. Ejecutar ./build.sh.
  5. Tome el PID de Apache usando:

    service apache2 status
    
  6. Ejecute el passe-partoutcomando como root:

    sudo passe-partout [PID]
    

    ... donde [PID]está el valor que recuperó en el paso 5.

  7. Si el programa tiene éxito, su directorio actual tendrá un montón de claves adicionales:

    you@server:~# ls
    id_rsa-0.key  id_rsa-1.key  id_rsa-2.key
    

Si todo salió bien (y con suerte lo hizo), una de esas claves es la que necesita. Sin embargo, si tenía más de un certificado / archivo de claves en uso, entonces necesita averiguar cuál es. Así es como lo haces:

Primero tome una copia del certificado que coincida con la clave firmada. Suponiendo que el archivo se llama server.crt, ejecute el siguiente comando:

openssl x509 -noout -modulus -in server.crt | openssl md5

Esto generará un valor que deberá comparar con cada una de las claves. Para cada tecla, ejecute el siguiente comando:

openssl rsa -noout -modulus -in id_rsa-0.key | openssl md5

Si uno de ellos coincide, has encontrado la clave.


Crédito: este artículo me señaló a passe-partout.


2
Buen hallazgo en esa utilidad.
Falcon Momot

3
+1 para la redacción (y un +1 virtual para el autor del artículo: estar avergonzado y aún escribirlo ayuda a otros en esa situación).
Joachim Sauer

2
Oh, eso es fabuloso y muy sucio. Me encanta.
Tom O'Connor

8

Lo más probable es que esté almacenando la clave en la memoria, lo que hace porque necesita conservar una copia después de que suelta los privilegios y / o descifra la clave utilizando una frase de contraseña suministrada.

En teoría, podría sacarlo de la imagen del proceso si adjunta un depurador, aunque si siguen las mejores prácticas, se cifrará contra algo en la memoria.

Dicho esto, si sucede que todavía lo tiene abierto, /proc/${PID}/fd/${SOMETHING}puede ser. Si lo sobrescribió, su clave no estará allí porque los datos de sobrescritura estarán. Si copió algo más en su lugar (o lo eliminó o desvinculó, o eliminó recursivamente su directorio principal), estará allí.


Solía cpcopiar la nueva clave en lugar de la anterior.
Nathan Osman

Miré a través de los descriptores de archivos abiertos en /proc... nada.
Nathan Osman

Probablemente no mantuvo una copia abierta entonces, que es el caso habitual para leer claves privadas; sus únicas opciones son averiguar cómo y dónde se almacena desde la fuente, extraerlo con un depurador (suponiendo que haya creado con símbolos) y descifrarlo ... o reemplazar el certificado.
Falcon Momot

¡Entiendo! Tenías razón: Apache guarda las claves en la memoria y pude recuperarlas. Por favor mira mi respuesta.
Nathan Osman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.