Recupero di una chiave RSA da un'istanza in esecuzione di Apache?


26

Ho creato una coppia di chiavi RSA per un certificato SSL e ho archiviato la chiave privata /etc/ssl/private/server.key. Purtroppo questa era l'unica copia della chiave privata che avevo.

Quindi ho accidentalmente sovrascritto il file sul disco (sì, lo so).

Apache è ancora in esecuzione e continua a soddisfare le richieste SSL, inducendomi a credere che ci possa essere speranza nel recupero della chiave privata. (Forse c'è un collegamento simbolico da qualche parte /proco qualcosa del genere?)

Questo server esegue Ubuntu 12.04 LTS.

Risposte:


39

SUCCESSO!

Sono stato in grado di recuperare la chiave privata. Ma non è stato facile. Ecco cosa devi fare:

  1. Make sicuro non si riavviare il server o Apache. Il gioco è finito a quel punto. Ciò significa anche assicurarsi che nessun servizio di monitoraggio riavvii Apache.
  2. Prendi questo file - codice sorgente per uno strumento chiamato passe-partout .
  3. Estrarre il codice sorgente e regolare la riga 9 di Makefile.mainper leggere:

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

    (Notare che $(OBJS)e e $(LDFLAGS)sono invertiti in ordine.)

  4. Corri ./build.sh.
  5. Prendi il PID di Apache usando:

    service apache2 status
    
  6. Esegui il passe-partoutcomando come root:

    sudo passe-partout [PID]
    

    ... dove si [PID]trova il valore recuperato nel passaggio 5.

  7. Se il programma ha esito positivo, la directory corrente avrà un sacco di chiavi extra:

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

Se tutto è andato bene (e si spera che sia successo), una di quelle chiavi è quella di cui hai bisogno. Tuttavia, se si utilizzava più di un certificato / file di chiavi in ​​uso, è necessario capire quale sia. Ecco come lo fai:

Per prima cosa prendi una copia del certificato che corrisponde alla chiave firmata. Supponendo che il file sia denominato server.crt, eseguire il comando seguente:

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

Questo genererà un valore che dovrai abbinare a ciascuna delle chiavi. Per ogni chiave, eseguire il comando seguente:

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

Se uno di questi corrisponde, hai trovato la chiave.


Ringraziamento: questo articolo mi ha indicato passe-partout.


2
Buona scoperta su quell'utilità.
Falcon Momot,

3
+1 per il writeup (e un +1 virtuale per l'autore dell'articolo: vergognarsi e scriverlo ancora aiuta gli altri in quella situazione).
Joachim Sauer,

2
Oh, è favoloso e così sporco. Lo adoro.
Tom O'Connor,

8

Molto probabilmente sta memorizzando la chiave in memoria, cosa che fa perché ha bisogno di conservare una copia dopo che ha perso i privilegi e / o decodifica la chiave usando una passphrase fornita.

In teoria, potresti estrarlo dall'immagine di processo se hai collegato un debugger, anche se se seguono le migliori pratiche verrà crittografato rispetto a qualcosa in memoria.

Detto questo, se succede che è ancora aperto, /proc/${PID}/fd/${SOMETHING}può essere. Se lo sovrascrivi, la tua chiave non sarà lì perché saranno i dati di sovrascrittura. Se hai copiato qualcos'altro al suo posto (o cancellato o scollegato, o cancellato in modo ricorsivo la sua directory principale), sarà lì.


Ho usato cpper copiare la nuova chiave al posto di quello vecchio.
Nathan Osman,

Ho guardato attraverso i descrittori di file aperti in /proc... niente.
Nathan Osman,

Probabilmente non ha tenuto aperta una copia allora, che è il solito caso per leggere le chiavi private; le tue uniche opzioni sono capire come e dove è archiviato dal sorgente, estrarlo usando un debugger (supponendo che tu abbia costruito con i simboli) e decrittografarlo ... o sostituire il certificato.
Falcon Momot,

Capito! Avevi ragione: Apache mantiene le chiavi in ​​memoria e sono stato in grado di recuperarle. Si prega di vedere la mia risposta.
Nathan Osman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.