¿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í?)
Pude recuperar la clave privada. Pero no fue fácil. Esto es lo que debes hacer:
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.
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).
Ejecutar ./build.sh.
Tome el PID de Apache usando:
service apache2 status
Ejecute el passe-partoutcomando como root:
sudo passe-partout [PID]
... donde [PID]está el valor que recuperó en el paso 5.
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:
+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.
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í.fuente
cp
copiar la nueva clave en lugar de la anterior./proc
... nada.