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

26

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

Então, eu acidentalmente gravei o arquivo no disco (sim, eu sei).

O Apache ainda está em execução e ainda está atendendo a solicitações 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 em /proc ou algo assim?)

Este servidor está executando o Ubuntu 12.04 LTS.

    
por Nathan Osman 29.10.2013 / 02:34

2 respostas

39

SUCESSO!

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

  1. Faça sure 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. Agarre este arquivo - código-fonte para uma ferramenta chamada passe-partout .
  3. Extraia o código-fonte e ajuste a linha 9 de Makefile.main para ler:

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

    (Observe que $(OBJS) e $(LDFLAGS) estão invertidos na ordem.)

  4. Executar ./build.sh .
  5. Agarre o PID do Apache usando:

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

    sudo passe-partout [PID]
    

    ... onde [PID] é o valor que você recuperou na etapa 5.

  7. Se o programa for bem-sucedido, seu diretório atual terá um monte de 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 / keyfile em uso, será necessário descobrir qual deles é. Veja como você faz isso:

Primeiro, pegue uma cópia do certificado que corresponda à chave assinada. Supondo que o arquivo tenha o nome server.crt , execute o seguinte comando:

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

Isto produzirá um valor que você precisará combinar com cada uma das chaves. Para cada chave, execute o seguinte comando:

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

Se uma delas coincidir, você encontrou a chave.

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

    
por 29.10.2013 / 05:26
8

O mais provável é que esteja armazenando a chave na memória, o que ela faz porque precisa manter uma cópia depois de descartar privilégios e / ou descriptografar a chave usando uma senha fornecida.

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

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

    
por 29.10.2013 / 02:36