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?)

Auf diesem Server läuft Ubuntu 12.04 LTS.

Antworten:


39

ERFOLG!

Ich konnte den privaten Schlüssel abrufen. Es war aber nicht einfach. Folgendes müssen Sie tun:

  1. 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.
  2. Holen Sie sich diese Datei - Quellcode für ein Tool namens Passepartout .
  3. 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.)

  4. Rennen ./build.sh.
  5. Holen Sie sich die PID von Apache mit:

    service apache2 status
    
  6. 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.

  7. 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:

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

Dies gibt einen Wert aus, den Sie mit jedem der Schlüssel abgleichen müssen. Führen Sie für jeden Schlüssel den folgenden Befehl aus:

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

Wenn einer von ihnen übereinstimmt, haben Sie den Schlüssel gefunden.


Kredit: dieser Artikel verwies mich auf Passepartout.


2
Gute Entdeckung auf diesem Dienstprogramm.
Falcon Momot

3
+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.
Nathan Osman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.