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?)
Consegui recuperar a chave privada. Mas não foi fácil. Aqui está o que você precisa fazer:
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.
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).
Corra ./build.sh.
Pegue o PID do Apache usando:
service apache2 status
Execute o passe-partoutcomando como root:
sudo passe-partout [PID]
... onde [PID]está o valor que você recuperou na etapa # 5.
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:
+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.
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á.fonte
cp
copiar a nova chave no lugar da antiga./proc
... nada.