Frage Abrufen eines RSA-Schlüssels von einer laufenden Apache-Instanz?


Ich habe ein RSA-Schlüsselpaar für ein SSL-Zertifikat erstellt und den privaten Schlüssel gespeichert /etc/ssl/private/server.key. Leider war dies die einzige Kopie des privaten Schlüssels, den ich hatte.

Dann habe ich versehentlich die Datei auf der Festplatte überschrieben (ja, ich weiß).

Apache läuft immer noch und bedient immer noch SSL-Anfragen, was mich zu der Annahme verleitet, dass es möglicherweise Hoffnung auf die Wiederherstellung des privaten Schlüssels gibt. (Vielleicht gibt es eine symbolische Verbindung irgendwo in /proc oder so?)

Auf diesem Server läuft Ubuntu 12.04 LTS.


26
2017-10-29 01:34


Ursprung




Antworten:


ERFOLG!

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

  1. Machen sicher Sie starten den Server oder Apache nicht neu. Das Spiel ist an diesem Punkt vorbei. Das bedeutet auch sicherzustellen, dass keine Überwachungsdienste Apache neu starten.
  2. Greifen Diese Datei - Quellcode für ein Werkzeug namens Passepartout.
  3. Extrahiere den Quellcode und passe Zeile 9 von Makefile.main lesen:

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

    (Beachten Sie, dass die $(OBJS) und $(LDFLAGS) sind in der Reihenfolge umgekehrt.)

  4. Lauf ./build.sh.
  5. Ergreifen Sie die PID von Apache mit:

    service apache2 status
    
  6. Führen Sie die passe-partout Befehl als root:

    sudo passe-partout [PID]
    

    ...woher [PID] ist der Wert, den Sie in Schritt 5 abgerufen haben.

  7. Wenn das Programm erfolgreich ist, wird Ihr aktuelles Verzeichnis eine Reihe zusätzlicher Schlüssel enthalten:

    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 Schlüssel, den Sie brauchen. Wenn Sie jedoch mehr als ein Zertifikat / eine Schlüsseldatei verwendet haben, müssen Sie herausfinden, um welche es sich handelt. Hier ist, wie Sie das tun:

Entnehmen Sie zuerst eine Kopie des Zertifikats, das dem signierten Schlüssel entspricht. Angenommen, die Datei wird benannt server.crtFühren Sie den folgenden Befehl aus:

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

Dies wird einen Wert ausgeben, den Sie mit jedem Schlüssel vergleichen 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 Beitrag wies mich auf Passepartout.


39
2017-10-29 04:26



Guter Fund zu diesem Dienstprogramm. - Falcon Momot
+1 für das Write-up (und ein virtuelles +1 für den Autor des Artikels: sich zu schämen und immer noch aufzuschreiben hilft anderen in dieser Situation). - Joachim Sauer
Oh, das ist fabelhaft und so dreckig. Ich liebe es. - Tom O'Connor


Höchstwahrscheinlich speichert es den Schlüssel im Speicher, was er tut, weil er eine Kopie behalten muss, nachdem er Privilegien fallen gelassen hat und / oder den Schlüssel mit einer mitgelieferten Passphrase entschlüsselt hat.

Theoretisch könnten Sie es aus dem Prozessabbild abrufen, wenn Sie einen Debugger anfügen. Wenn sie jedoch den Best Practices folgen, werden sie 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 überschrieben haben, ist Ihr Schlüssel nicht da, weil die überschreibenden Daten sein werden. 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), wird es dort sein.


8
2017-10-29 01:36



ich benutzte cp um den neuen Schlüssel anstelle des alten zu kopieren. - Nathan Osman
Ich habe die offenen Dateideskriptoren durchgesehen /proc... nichts. - Nathan Osman
Es hat wahrscheinlich keine Kopie offen gehalten, was der übliche Fall für das Lesen von privaten Schlüsseln ist; Sie können nur herausfinden, wie und wo es von der Quelle gespeichert wird, es mit einem Debugger herausziehen (vorausgesetzt, Sie haben mit Symbolen gebaut) und es entschlüsseln ... oder das Zertifikat ersetzen. - Falcon Momot
Ich habe es verstanden! Du hattest Recht - Apache behält die Schlüssel im Speicher und ich konnte sie abrufen. Bitte sehen Sie meine Antwort. - Nathan Osman