Desenvolvimento

3 set, 2014

Descriptografia de Web Sites HTTPS – Parte 2: Envio do Código Secreto

Publicidade

Nesta série de artigos, vamos descrever como funciona os passos do procolo utilizado pelos sites que utilizam HTTPS e como é descriptografado essa informação pelo navegador.

Leia o primeiro artigo da série, no qual falamos sobre Negociação de Conexão.

Nesta segunda parte, falaremos sobre o envio do código secreto, você vai entender como é feita essa troca de informação, porque o protocolo é seguro, e porque mesmo quando essas informações são interceptadas elas não podem ser decifradas.

Os pacotes trocados entre cliente e servidor serão descriptografados se o receptor ter o código secreto, esse código é uma chave calculada e é chamada de Master Secret. Ela não é enviada em nenhum momento pelo cliente e nem pelo servidor. Para obter o seu valor, é necessário um cálculo que ocorre em ambos os lados a partir de algumas informações obtidas inicialmente.

O algoritmo para obter o Master Secret pode variar entre a versão dos protocolos utilizados (TLS 1.0, TLS 1.1, TLS 1.2). Neste artigo iremos tratar da versão mais atual na data desta publicação, ou seja, TLS 1.2.

Para o cálculo da Master Secret é necessário os valores de Client Random, Server Random e Pre Master Secret. Os dois primeiros foram obtidos nos pacotes do artigo anterior. O Pre Master Secret é enviado na mensagem ClientKeyExchange.

Segundo a RFC 5246, devemos utilizar o algoritmo PRF (Pseudorandom Function) para calcular a Master Secret.

A mensagem ClientKeyExchange que contém o Pre Master Secret é criptografada com a Public Key que foi enviada pelo servidor na mensagem Certificate.

O servidor mantém em segredo um código conhecido como Chave Privada (Private Key), criada uma única vez no momento em que foi gerado o certificado para o servidor, para segurança do protocolo, esse valor deve estar em absoluto sigilo.

Também contém uma chave pública. Esta o servidor disponibiliza e pode ser acessada por qualquer usuário que solicitar a visualização do certificado do servidor.
A Public Key e a Private Key são consideradas Chaves Assimétricas, ou seja, não são iguais mas são relacionadas matemáticamente. Uma informação criptografada com a Public Key, só poderá ser descriptografada pela Private Key.

O Pre Master Secret da mensagem ClientKeyExchange criptografada pelo cliente com a Public Key só poderá ser descriptografada com a Private Key, que está em segredo do servidor, esse é o motivo que garante a segurança do protocolo mesmo que essa mensagem seja interceptada.

Mensagem do Código Secreto

7_conexao_clientkeyexchange

Captura

A captura feita pelo Wireshark da mensagem ClientKeyExchange contém o Encrypted PreMaster, esse valor é criptografado com a Public Key do servidor, só pode ser descriptografado com a Private Key do servidor.

8_wireshark_premaster

Para efeito de estudos, o Google Chrome possibilita a captura da chave antes da criptografia. Para isso, você deve antes de tudo configurar uma variável de ambiente. Acesse o Menu Iniciar – Computador – Propriedades – Configurações Avançadas do Sistema – Variáveis de Ambiente.

Em Variáveis do Sistema, clique em Novo, insira o nome SSLKEYLOGFILE e no valor insira o endereço do arquivo que irá armazenar o conteúdo. Algo como C:\SSL\ssl_log.txt.

Agora indique no Wireshark o caminho deste arquivo. Acesse Edit – Preferences. Ao lado esquerdo clique em Protocols e procure SSL.

9_wireshark_config

No campo SSL debug file indique um arquivo para logar as operações SSL que o Wireshark irá realizar. No campo (Pre) – Master Secret log filename, indique o local que foi indicado na Variável de Ambiente.

Abra o arquivo que contém o seu log SSL declarado na Variável de Ambiente.

Localize no arquivo o valor do campo Client Random enviado na primeira mensagem, no caso desse artigo, como foi visto na parte 1, o conteúdo é: “be6fb836c97510ff31fa44a03f4411564a705837460c135feabc6005eb031438”.

10_keyssllog

A palavra CLIENT_RANDOM antecede o valor, separado por espaço há o valor da Master Secret, na linha acima há por último separado por espaço o conteúdo da Pre Master Secret. Esse padrão pode variar de acordo com o algoritmo de troca de chaves, o padrão que deste artigo é o RSA.

Apesar de já termos por esse método a Master Secret, iremos ignorar esse valor, pegar a PreMasterSecret e calcular o valor da Master Secret, a fim de compreendermos o funcionamento do protocolo TLS 1.2.

Portanto, agora o valor do PreMasterSecret é “0303e84a917979591e5ae4b1d0ba2117a26eba6ee1ec229ddcc650a8dbe51652771c2e539b0e55a29bdc80520e3e92fa”.

Implementação

Podemos então utilizar o método setPreMasterSecret. Considerando a instância $TLS da classe SessionTLS implementada na primeira parte do artigo, temos agora:

$TLS->setPreMasterSecret(hex2bin("0303e84a917979591e5ae4b1d0ba2117a26eba6ee1ec229ddcc650a8dbe51652771c2e539b0e55a29bdc80520e3e92fa"));

Próximo Artigo

Com os valores Client Random, Server Random e PreMasterSecret é possível calcular o valor da Master Secret implementando o Algoritmo PRF (Pseudo Random Function) e os valores utilizados para conferir a integridade dos dados enviados.

No próximo artigo, falaremos sobre Cálculo de Chaves. Até lá.