Einen RSA-Schlüssel von einer laufenden Instanz von Apache abrufen?
26
Ich habe ein RSA-Schlüsselpaar für ein SSL-Zertifikat erstellt und den privaten Schlüssel in gespeichert /etc/ssl/private/server.key. Leider war dies die einzige Kopie des privaten Schlüssels, die ich hatte.
Dann habe ich versehentlich die Datei auf der Festplatte überschrieben (ja, ich weiß).
Apache wird immer noch ausgeführt und verarbeitet SSL-Anfragen, was mich zu der Annahme veranlasst, dass es möglicherweise Hoffnung gibt, den privaten Schlüssel wiederherzustellen. (Vielleicht gibt es irgendwo einen symbolischen Link /procoder so?)
Ich konnte den privaten Schlüssel abrufen. Es war aber nicht einfach. Folgendes müssen Sie tun:
Stellen Sie sicher, dass Sie den Server oder Apache nicht neu starten. Das Spiel ist zu diesem Zeitpunkt beendet. Das bedeutet auch, sicherzustellen, dass keine Überwachungsdienste Apache neu starten.
Extrahieren Sie den Quellcode und passen Sie die Zeile 9 von Makefile.mainan, um Folgendes zu lesen:
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
(Beachten Sie, dass die $(OBJS)und $(LDFLAGS)in der Reihenfolge umgekehrt sind.)
Rennen ./build.sh.
Holen Sie sich die PID von Apache mit:
service apache2 status
Führen Sie den passe-partoutBefehl als root aus:
sudo passe-partout [PID]
... wo [PID]ist der Wert, den Sie in Schritt 5 abgerufen haben.
Wenn das Programm erfolgreich ist, enthält Ihr aktuelles Verzeichnis eine Reihe zusätzlicher Schlüssel:
you@server:~# ls
id_rsa-0.key id_rsa-1.key id_rsa-2.key
Wenn alles gut gegangen ist (und hoffentlich auch), ist einer dieser Schlüssel der, den Sie brauchen. Wenn Sie jedoch mehr als ein Zertifikat / eine Schlüsseldatei verwendet haben, müssen Sie herausfinden, um welches es sich handelt. So machen Sie das:
Holen Sie sich zuerst eine Kopie des Zertifikats, das dem signierten Schlüssel entspricht. Unter der Annahme, dass die Datei benannt ist server.crt, führen Sie den folgenden Befehl aus:
+1 für das Schreiben (und ein virtuelles +1 für den Artikelautor: sich zu schämen und es trotzdem aufzuschreiben, hilft anderen in dieser Situation).
Joachim Sauer
2
Oh, das ist fabelhaft und so dreckig. Ich liebe es.
Tom O'Connor
8
Höchstwahrscheinlich wird der Schlüssel im Speicher gespeichert, da eine Kopie aufbewahrt werden muss, nachdem Berechtigungen gelöscht und / oder der Schlüssel mit einer angegebenen Passphrase entschlüsselt wurden.
Theoretisch könnten Sie es aus dem Prozessabbild entfernen, wenn Sie einen Debugger anhängen. Wenn Sie jedoch bewährten Methoden folgen, wird es gegen etwas im Speicher verschlüsselt.
Das heißt, wenn es passiert, dass es noch offen ist, /proc/${PID}/fd/${SOMETHING}kann es sein. Wenn Sie es überschreiben, ist Ihr Schlüssel nicht vorhanden, da die überschreibenden Daten vorhanden sind. Wenn Sie etwas anderes an seinen Platz kopiert haben (oder es gelöscht oder die Verknüpfung aufgehoben oder das übergeordnete Verzeichnis rekursiv gelöscht haben), ist es dort.
Früher habe ich cpden neuen Schlüssel anstelle des alten Schlüssels kopiert.
Nathan Osman
Ich habe die offenen Dateideskriptoren in /proc... nichts durchsucht.
Nathan Osman
Wahrscheinlich hat es damals keine Kopie offen gehalten, was beim Lesen von privaten Schlüsseln der Fall ist. Sie haben nur die Möglichkeit, herauszufinden, wie und wo es in der Quelle gespeichert ist, es mit einem Debugger abzurufen (vorausgesetzt, Sie haben Symbole erstellt) und es zu entschlüsseln ... oder das Zertifikat zu ersetzen.
Falcon Momot
Ich habe es verstanden! Sie hatten Recht - Apache speichert die Schlüssel und ich konnte sie abrufen. Bitte sehen Sie meine Antwort.
Höchstwahrscheinlich wird der Schlüssel im Speicher gespeichert, da eine Kopie aufbewahrt werden muss, nachdem Berechtigungen gelöscht und / oder der Schlüssel mit einer angegebenen Passphrase entschlüsselt wurden.
Theoretisch könnten Sie es aus dem Prozessabbild entfernen, wenn Sie einen Debugger anhängen. Wenn Sie jedoch bewährten Methoden folgen, wird es gegen etwas im Speicher verschlüsselt.
Das heißt, wenn es passiert, dass es noch offen ist,
/proc/${PID}/fd/${SOMETHING}
kann es sein. Wenn Sie es überschreiben, ist Ihr Schlüssel nicht vorhanden, da die überschreibenden Daten vorhanden sind. Wenn Sie etwas anderes an seinen Platz kopiert haben (oder es gelöscht oder die Verknüpfung aufgehoben oder das übergeordnete Verzeichnis rekursiv gelöscht haben), ist es dort.quelle
cp
den neuen Schlüssel anstelle des alten Schlüssels kopiert./proc
... nichts durchsucht.