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?)
Udało mi się odzyskać klucz prywatny. Ale to nie było łatwe. Oto, co musisz zrobić:
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.
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).
Biegać ./build.sh .
Chwyć PID Apache, używając:
service apache2 status
Uruchom passe-partoutpolecenie jako root:
sudo passe-partout [PID]
... gdzie [PID]jest wartość uzyskana w kroku 5.
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ę:
+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.
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ź.
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.źródło
cp
kopiowałem nowy klucz zamiast starego./proc
... niczym.