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?)
J'ai pu récupérer la clé privée. Mais ce n'était pas facile. Voici ce que vous devez faire:
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.
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.)
Courez ./build.sh.
Récupérez le PID d'Apache en utilisant:
service apache2 status
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.
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:
+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à.
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.
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à.la source
cp
de copier la nouvelle clé à la place de l'ancienne./proc
... rien.