Recuperando uma chave RSA de uma instância em execução do Apache?


26

Criei um par de chaves RSA para um certificado SSL e armazenei a chave privada /etc/ssl/private/server.key. Infelizmente, essa foi a única cópia da chave privada que eu tinha.

Em seguida, sobrescrevi acidentalmente o arquivo no disco (sim, eu sei).

O Apache ainda está em execução e ainda atende solicitações de SSL, levando-me a acreditar que pode haver esperança na recuperação da chave privada. (Talvez haja um link simbólico em algum lugar /procou algo assim?)

Este servidor está executando o Ubuntu 12.04 LTS.

Respostas:


39

SUCESSO!

Consegui recuperar a chave privada. Mas não foi fácil. Aqui está o que você precisa fazer:

  1. Certifique- se de não reiniciar o servidor ou o Apache. O jogo acabou nesse ponto. Isso também significa garantir que nenhum serviço de monitoramento reinicie o Apache.
  2. Pegue este arquivo - código-fonte para uma ferramenta chamada passe-partout .
  3. Extraia o código fonte e ajuste a linha 9 de Makefile.mainpara ler:

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

    (Note-se que a $(OBJS)e $(LDFLAGS)são invertidas de modo).

  4. Corra ./build.sh.
  5. Pegue o PID do Apache usando:

    service apache2 status
    
  6. Execute o passe-partoutcomando como root:

    sudo passe-partout [PID]
    

    ... onde [PID]está o valor que você recuperou na etapa # 5.

  7. Se o programa for bem-sucedido, seu diretório atual terá várias chaves extras:

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

Se tudo correu bem (e espero que tenha acontecido), uma dessas chaves é a que você precisa. No entanto, se você tiver mais de um certificado / arquivo de chaves em uso, precisará descobrir qual é. Aqui está como você faz isso:

Primeiro, pegue uma cópia do certificado que corresponde à chave assinada. Supondo que o arquivo seja nomeado server.crt, execute o seguinte comando:

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

Isso produzirá um valor que você precisará corresponder a cada uma das chaves. Para cada chave, execute o seguinte comando:

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

Se um deles corresponder, você encontrou a chave.


Crédito: este artigo me indicou passe-partout.


2
Boa descoberta sobre esse utilitário.
Falcon Momot

3
+1 para a redação (e um +1 virtual para o autor do artigo: sentir vergonha e continuar anotando ajuda a outras pessoas nessa situação).
Joachim Sauer

2
Oh, isso é fabuloso e tão sujo. Eu amo isso.
Tom O'Connor

8

Provavelmente, ele está armazenando a chave na memória, o que faz porque precisa manter uma cópia depois de eliminar privilégios e / ou descriptografar a chave usando uma senha fornecida.

Em teoria, você poderia tirá-lo da imagem do processo se anexasse um depurador, mas, se eles estiverem seguindo as práticas recomendadas, ele será criptografado contra algo na memória.

Dito isto, se acontecer que ele ainda está aberto, /proc/${PID}/fd/${SOMETHING}pode ser isso. Se você a substituir, sua chave não estará lá porque os dados de substituição estarão. Se você copiou alguma outra coisa em seu lugar (ou a excluiu ou desvinculou ou excluiu recursivamente o diretório pai), ele estará lá.


Eu costumava cpcopiar a nova chave no lugar da antiga.
Nathan Osman

Eu olhei através dos descritores de arquivos abertos em /proc... nada.
Nathan Osman

Provavelmente, não mantinha uma cópia aberta, o que é o caso usual para a leitura de chaves privadas; suas únicas opções são descobrir como e onde ele é armazenado da fonte, retirá-lo usando um depurador (supondo que você tenha construído com símbolos) e descriptografá-lo ... ou substituir o certificado.
Falcon Momot

Deixa comigo! Você estava certo - o Apache mantém as chaves na memória e eu consegui recuperá-las. Por favor, veja minha resposta.
Nathan Osman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.