Descriptografa o tráfego SSL com a ferramenta de linha de comando openssl - continuação

1

Eu recebi uma resposta para minha pergunta original aqui Espero que seja ok para fazer uma pergunta de acompanhamento postando outra pergunta. De minha pergunta original acima, eu era capaz de descriptografar o cliente pre master secret / key usando minha chave privada, como foi explicado para mim usando o

openssl rsautl -em cpre.key -key key.pem -decrypt -out spre.key

Isso parece bastante simples e criou um arquivo de 48 bytes. Eu sei que o que estou fazendo não vai realmente descriptografar ou criptografar o tráfego https que estou trabalhando nisso em pequenos passos. O próximo passo da minha leitura será gerar o master segredo / key e, a partir da resposta no meu post anterior, parece que eu deveria ser capaz de fazer isso com o openssl, o qual estou lutando um pouco aqui para fazer isso. Eu vim com uma variação de openssl dgst

echo -n 'value' | openssl dgst-sha256 -mac hmac -macopt hexkey: $ (hexkey)

onde o valor é "segredo mestre" + client.random + server.random e hexkey é o meu segredo pré mestre descriptografado da etapa anterior. Eu estou fazendo esse passo corretamente? Do jeito que eu entendo o RFC desde a primeira vez que ele produz 32 bytes e o RFC explica que será de 48 bytes. A maneira que eu estou interpretando o RFC é que eu preciso pegar esse resultado e passá-lo novamente, o que gera 32 bytes adicionais dos quais eu pego os primeiros 16 e concateno que no final dos primeiros 32 para obter meus 48 bytes para o segredo mestre / chave. Estou completamente fora deste próximo passo depois de ter descriptografado e ter a chave pré-master do lado do servidor? obrigado David B

    
por David B 24.07.2018 / 21:08

1 resposta

0

Preliminarmente, espero que você não tenha feito o que mostrou. Exceto para os rótulos, todos os dados usados na derivação de chave TLS são dados binários que não podem ser fornecidos com precisão como argumento para um comando echo do shell ou qualquer outro comando, exceto possivelmente a versão integrada em zsh se você desativar os escapes e certamente não pode ser "digitado" (mesmo cortado e colado) em um argumento literal com aspas simples.

Se você realmente tiver os dados em arquivos, eles poderão ser usados. Os dados binários podem ser lidos e gravados em arquivos - pelo menos nas plataformas que o OpenSSL suporta. Se você não tem arquivos (mas tem pipes), pode contornar isso passando os dados em hexadecimais e com exceção de -macopt hexkey: , que já usa hexadecimal, usando um programa como xxd -r ou printf com o hex formado em escapes, ou echo com o hex formado em escapes não portáteis, ou hacks como GNU sed s///e , ou um programa mais geral awk ou perl , para converter o hex a binário para entrada codificar%. E, quando necessário, hacks semelhantes para converter a saída binária em hexadecimal, mas openssl pode produzir em hexadecimal, contanto que você remova o dgst -mac hmac da frente.

Mais substantivamente, executar a primeira saída HMAC de volta por si só fornece os blocos 'A', que você executa em outra camada de HMACs para obter a saída real 'P_hash'. Veja o link que é efetivamente a mesma pergunta usando um vetor de teste publicado no link exceto que eu atendi em Java. Aqui está o equivalente da linha de comando do OpenSSL:

$ echo $key; echo $lbsd # start from hex
9bbe436ba940f017b17652849a71db35
74657374206c6162656c a0ba9f936cda311827a6f796ffd5198c
$ echo $lbsd | xxd -r -p >a0
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a0 -binary >a1
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a1 -binary >a2
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a2 -binary >a3
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a3 -binary >a4
$ cat a1 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k1
$ cat a2 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k2
$ cat a3 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k3
$ cat a4 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k4
$ cat k1 k2 k3 k4 | head -c100 | xxd
0000000: e3f2 29ba 727b e17b 8d12 2620 557c d453  ..).r{.{..& U|.S
0000010: c2aa b21d 07c3 d495 329b 52d4 e61e db5a  ........2.R....Z
0000020: 6b30 1791 e90d 35c9 c9a4 6b4e 14ba f9af  k0....5...kN....
0000030: 0fa0 22f7 077d ef17 abfd 3797 c056 4bab  .."..}....7..VK.
0000040: 4fbc 9166 6e9d ef9b 97fc e34f 7967 89ba  O..fn......Oyg..
0000050: a480 82d1 22ee 42c5 a72e 5a51 10ff f701  ....".B...ZQ....
0000060: 8734 7b66                                .4{f

Se você conseguir que seu código replique isso, ele também deve funcionar para o handshake TLS1.2 real, ajustado para os tamanhos corretos: 48 para o segredo mestre e dependendo do ciphersuite para as teclas de trabalho.

    
por 26.07.2018 / 07:00