Desenvolvimento

17 set, 2014

Descriptografia de Web Sites HTTPS – Parte 04: Descriptografia

Publicidade

Esta é a parte final dos quatro artigos relacionados à descriptografia de Web Sites HTTPS. Iremos agora, enfim, descriptografar as informações que chegam do servidor.

Durante essa série tratamos sobre como é feita a conexão do Cliente e Servidor para chegar a um estado seguro e como ambos possuem o Key Material idênticos calculados separadamente. Isto é importante, pois esse valor não foi passado em nenhum momento por um pacote e sim calculado em ambos os lados.

O Wireshark, configurado como foi demonstrado anteriormente, terá agora duas camadas SSL e HTTP. A SSL terá os dados que realmente foram enviados ou recebidos. Na camada HTTP você encontra o conteúdo da mensagem descriptografada – o conteúdo é o protocolo HTTP encapsulado na camada SSL.

Importante: No protocolo TLS pode haver variações na hora da descriptografia. Existe o tipo Stream ou Block. No tipo Stream, ele mantém o estado do vetor, portanto é necessário você descriptografar tudo que chega até a mensagem que deseja. No tipo block, você pode descriptografar um conteúdo mesmo que seja do meio de uma conexão.

Como estamos usando o algoritmo AES, podemos ir direto a mensagem GET do HTTP; essa é a mensagem de requisição ao site. Como mostra a figura abaixo:

12_wireshark_aplication_data

Acessando o conteúdo do campo Encrypted Application Data, o pacote HTTP, neste caso obtemos o valor:

ad6882f91c98434f9e537780f23239b6
f5a5f62d50f55982e251b59b8e08e522
b082eabf85faeaceea86f719cbb7f2db
477badcf05b4a80f53fab3b7da27494d
58c3c23970192fdcb460ab182c3f6499
76c2dc789472db0326884e000875c9af
fb591abe898b827778504ccdf192689a
76ed8f8d6746c958d11208e2ab012579
ac1b6da92faf41580003033abead2eb1
b7c455800ed2fef7baa8d3f554e2dc78
69b8773cb008b3c433e4a9214458e9ef
5954e4d3e93c8c3944f260058596a0d4
62a2120b7ef43b6d2967ad81b9308b2c
1a77b6dc3caa18ed9c1afb58f062e4a5
860c49c1cefa09be2631e8521d82edb9
1bff9de100e97af2f8304665853763da
b8ff1a52f57f176211103e71f0cb905a
0535a78175717f6ee8af6996359565c5
f50e54c18988dc9a270bac2a61746431
ec98225939c165bb7d3dea9b9b7c4006
971bda331d7aeca5c638f57f63fcda68
5272389c6446c6dd181e280900675c67
1e82d3e4644b9cca694bbf336594f9de
193d9cfb6f42e1a2794933e1cf6fbd3a
625bec7da01694a12feab61914d00f48
3482bf58da1b142872e2ea2d0f8bb883

Este valor ao ser descriptografado irá mostrar o protocolo HTTP que está encapsulado no SSL, como podemos ver na figura abaixo:

13_wireshark_decrypt_data

Neste caso, o conteúdo da mensagem HTTP encontrado foi:

GET /ssl/ HTTP/1.1
Host: 10.200.31.209
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4

Implementação

Iremos implementar os métodos decrypt e decryptOpenSSL da nossa classe SessionTLS, criada na primeira parte do artigo.

O método decrypt é utilizado para indicar qual o método usado para a descriptografia do algoritmo que estamos utilizando. Como se trata de um exemplo, iremos implementar uma única condição da cipher utilizada, que é o que estamos utilizando no exemplo.

public function decrypt($cipherText) 
{
	if($this->cipher == "AES_128_CBC")
	{		
		$planText = self::decryptOpenSSL("aes-128-cbc", $cipherText, $this->client_write_key, $this->client_write_IV); 

		return substr($planText, 16, strlen($planText));
	}
	throw new Exception("Cipher não encontrada");
}

O método decryptOpenSSL irá juntar tudo que foi calculado anteriormente para descriptografar a mensagem que chega do servidor.

Importante: Esse método utiliza um módulo do PHP disponível a partir da versão 5.3.0, porém não vem habilitado por padrão, portanto não esqueça de retirar o caracter “#”na frente da linha “extension=php_openssl.dll” que está no seu arquivo “php.ini” da pasta do PHP.

public function decryptOpenSSL($cipher, $cipherText, $key, $IV) 
{	
	return openssl_decrypt($cipherText, $cipher, $key, true, $IV);
}

Iremos passar como parâmetro os dados a serem descriptografados e imprimir na tela o resultado. Considerando a instância $TLS da classe SessionTLS implementada na primeira parte do artigo, teremos:

$cipherText = "ad6882f91c98434f9e537780f23239b6f5a5f62d50f55982e251b59b8e08e522b082eabf85faeaceea86f719cbb7f2db477badcf05b4a80f53fab3b7da27494d58c3c23970192fdcb460ab182c3f649976c2dc789472db0326884e000875c9affb591abe898b827778504ccdf192689a76ed8f8d6746c958d11208e2ab012579ac1b6da92faf41580003033abead2eb1b7c455800ed2fef7baa8d3f554e2dc7869b8773cb008b3c433e4a9214458e9ef5954e4d3e93c8c3944f260058596a0d462a2120b7ef43b6d2967ad81b9308b2c1a77b6dc3caa18ed9c1afb58f062e4a5860c49c1cefa09be2631e8521d82edb91bff9de100e97af2f8304665853763dab8ff1a52f57f176211103e71f0cb905a0535a78175717f6ee8af6996359565c5f50e54c18988dc9a270bac2a61746431ec98225939c165bb7d3dea9b9b7c4006971bda331d7aeca5c638f57f63fcda685272389c6446c6dd181e280900675c671e82d3e4644b9cca694bbf336594f9de193d9cfb6f42e1a2794933e1cf6fbd3a625bec7da01694a12feab61914d00f483482bf58da1b142872e2ea2d0f8bb883";

echo $TLS->decrypt(hex2bin($cipherText));

Por fim, temos o conteúdo descriptografado. Foi um grande prazer escrever para vocês o artigo sobre descriptografia de Web Sites HTTPS. Fico à disposição para dúvidas, correções ou esclarecimentos.

Veja o código fonte para download aqui: index