Récupérer une clé RSA d'une instance en cours d'exécution d'Apache?

26

J'ai créé une paire de clés RSA pour un certificat SSL et stocké la clé privée dans /etc/ssl/private/server.key. Malheureusement, c'était la seule copie de la clé privée que j'avais.

Ensuite, j'ai accidentellement écrasé le fichier sur le disque (oui, je sais).

Apache est toujours en cours d'exécution et sert toujours les demandes SSL, ce qui m'amène à croire qu'il peut y avoir de l'espoir dans la récupération de la clé privée. (Peut-être qu'il y a un lien symbolique quelque part /procou quelque chose?)

Ce serveur exécute Ubuntu 12.04 LTS.

Nathan Osman
la source

Réponses:

39

SUCCÈS!

J'ai pu récupérer la clé privée. Mais ce n'était pas facile. Voici ce que vous devez faire:

  1. Assurez - vous que vous ne redémarrez pas le serveur ou Apache. Le jeu est terminé à ce stade. Cela signifie également de s'assurer qu'aucun service de surveillance ne redémarre Apache.
  2. Prenez ce fichier - le code source d' un outil appelé passe-partout .
  3. Extrayez le code source et ajustez la ligne 9 Makefile.mainpour lire:

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

    (Notez que le $(OBJS)et $(LDFLAGS)sont inversés dans l'ordre.)

  4. Courez ./build.sh.
  5. Récupérez le PID d'Apache en utilisant:

    service apache2 status
    
  6. Exécutez la passe-partoutcommande en tant que root:

    sudo passe-partout [PID]
    

    ... où [PID]est la valeur que vous avez récupérée à l'étape 5.

  7. Si le programme réussit, votre répertoire actuel aura un tas de clés supplémentaires:

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

Si tout s'est bien passé (et j'espère que cela s'est passé), l'une de ces clés est celle dont vous avez besoin. Cependant, si vous aviez plus d'un certificat / fichier de clés en cours d'utilisation, alors vous devez déterminer lequel il s'agit. Voici comment procéder:

Prenez d'abord une copie du certificat qui correspond à la clé signée. En supposant que le fichier est nommé server.crt, exécutez la commande suivante:

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

Cela produira une valeur que vous devrez faire correspondre avec chacune des clés. Pour chaque clé, exécutez la commande suivante:

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

Si l'un d'eux correspond, vous avez trouvé la clé.


Crédit: cet article m'a indiqué le passe-partout.

Nathan Osman
la source
2
Bonne trouvaille sur cet utilitaire.
Falcon Momot
3
+1 pour l'écriture (et un +1 virtuel pour l'auteur de l'article: avoir honte et l'écrire toujours aide les autres dans cette situation).
Joachim Sauer
2
Oh, c'est fabuleux et tellement sale. J'aime cela.
Tom O'Connor
8

Il est très probable qu'il stocke la clé en mémoire, ce qu'il fait car il doit conserver une copie après avoir supprimé les privilèges et / ou déchiffré la clé à l'aide d'une phrase de passe fournie.

En théorie, vous pouvez le retirer de l'image de processus si vous attachez un débogueur, bien que s'ils suivent les meilleures pratiques, il sera chiffré par rapport à quelque chose en mémoire.

Cela dit, s'il arrive qu'il l'ait encore ouvert, /proc/${PID}/fd/${SOMETHING}peut-être. Si vous l'avez écrasé, votre clé ne sera pas là car les données d'écrasement le seront. Si vous avez copié quelque chose d'autre à sa place (ou supprimé ou dissocié, ou supprimé récursivement son répertoire parent), il sera là.

Falcon Momot
la source
J'avais l'habitude cpde copier la nouvelle clé à la place de l'ancienne.
Nathan Osman
J'ai regardé les descripteurs de fichiers ouverts dans /proc... rien.
Nathan Osman
Il n'a probablement pas gardé de copie ouverte à ce moment-là, ce qui est le cas habituel pour la lecture des clés privées; vos seules options sont de comprendre comment et où il est stocké à partir de la source, de le retirer à l'aide d'un débogueur (en supposant que vous avez construit avec des symboles) et de le déchiffrer ... ou de remplacer le certificat.
Falcon Momot
J? ai compris! Vous aviez raison - Apache garde les clés en mémoire et j'ai pu les récupérer. Veuillez voir ma réponse.
Nathan Osman