Pobieranie klucza RSA z działającej instancji Apache?

26

Utworzyłem parę kluczy RSA dla certyfikatu SSL i zapisałem klucz prywatny /etc/ssl/private/server.key. Niestety była to jedyna kopia mojego klucza prywatnego, którą miałem.

Potem przypadkowo nadpisałem plik na dysku (tak, wiem).

Apache nadal działa i nadal obsługuje żądania SSL, co doprowadziło mnie do przekonania, że ​​może być nadzieja na odzyskanie klucza prywatnego. (Być może gdzieś jest coś symbolicznego /proc?)

Na tym serwerze działa Ubuntu 12.04 LTS.

Nathan Osman
źródło

Odpowiedzi:

39

SUKCES!

Udało mi się odzyskać klucz prywatny. Ale to nie było łatwe. Oto, co musisz zrobić:

  1. Robić , że nie restartujesz serwera ani Apache. Gra kończy się w tym momencie. Oznacza to również upewnienie się, że żadna usługa monitorowania nie uruchomi ponownie Apache.
  2. Pobierz ten plik - kod źródłowy narzędzia o nazwie passe-partout .
  3. Wyodrębnij kod źródłowy i dostosuj wiersz 9 Makefile.maindla odczytu:

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

    (Zauważ, że $(OBJS)i$(LDFLAGS) są odwrócone w kolejności).

  4. Biegać ./build.sh .
  5. Chwyć PID Apache, używając:

    service apache2 status
    
  6. Uruchom passe-partoutpolecenie jako root:

    sudo passe-partout [PID]
    

    ... gdzie [PID]jest wartość uzyskana w kroku 5.

  7. Jeśli program się powiedzie, twój aktualny katalog będzie miał kilka dodatkowych kluczy:

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

Jeśli wszystko poszło dobrze (i mam nadzieję, że tak się stało), jednym z tych kluczy jest ten, którego potrzebujesz. Jeśli jednak używasz więcej niż jednego certyfikatu / pliku kluczy, musisz dowiedzieć się, który to plik. Oto jak to zrobić:

Najpierw pobierz kopię certyfikatu, który pasuje do podpisanego klucza. Zakładając, że plik ma nazwę server.crt, uruchom następującą komendę:

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

Spowoduje to wyświetlenie wartości, którą należy dopasować do każdego z kluczy. Dla każdego klucza uruchom następujące polecenie:

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

Jeśli jeden z nich pasuje, znalazłeś klucz.


Kredyt: ten artykuł wskazał mi passe-partout.

Nathan Osman
źródło
2
Dobre znalezisko w tym narzędziu.
Falcon Momot,
3
+1 za napisanie (i wirtualna +1 dla autora artykułu: zawstydzenie i wciąż zapisywanie pomaga innym w takiej sytuacji).
Joachim Sauer
2
Och, to jest wspaniałe i takie brudne. Kocham to.
Tom O'Connor,
8

Najprawdopodobniej przechowuje klucz w pamięci, co robi, ponieważ musi zachować kopię po upuszczeniu uprawnień i / lub odszyfrowaniu klucza za pomocą dostarczonego hasła.

Teoretycznie możesz wyciągnąć go z obrazu procesu, jeśli podłączysz debuger, ale jeśli postępują zgodnie z najlepszymi praktykami, zostanie zaszyfrowany na coś w pamięci.

To powiedziawszy, jeśli zdarzy się, że nadal jest otwarte, /proc/${PID}/fd/${SOMETHING}może nim być. Jeśli go nadpisałeś, twojego klucza nie będzie, ponieważ nadpisane zostaną dane. Jeśli skopiowałeś coś innego na to miejsce (lub usunąłeś go, odłączyłeś lub rekursywnie usunąłeś katalog macierzysty), będzie tam.

Falcon Momot
źródło
Kiedyś cpkopiowałem nowy klucz zamiast starego.
Nathan Osman
Przejrzałem deskryptory otwartych plików w /proc... niczym.
Nathan Osman
Prawdopodobnie nie utrzymywał wtedy kopii otwartej, co jest zwykłym przypadkiem czytania kluczy prywatnych; jedyne opcje to ustalenie, w jaki sposób i gdzie jest przechowywany ze źródła, wyciągnięcie go za pomocą debugera (zakładając, że masz wbudowane symbole) i odszyfrowanie go ... lub zastąpienie certyfikatu.
Falcon Momot,
Mam to! Miałeś rację - Apache przechowuje klucze w pamięci i udało mi się je odzyskać. Proszę zobaczyć moją odpowiedź.
Nathan Osman