
Lab autonome Heartbleed (CVE-2014-0160) : compile OpenSSL 1.0.1f vulnérable dans Docker et inclut un PoC Python de fuite mémoire pour des tests autorisés.
Un petit laboratoire autonome pour CVE-2014-0160 (Heartbleed) — la surlecture du heartbeat TLS dans OpenSSL 1.0.1–1.0.1f. Il compile l'OpenSSL réellement vulnérable à partir des sources amont épinglées dans un conteneur jetable, le sert, et inclut un client proof-of-concept qui fuit la mémoire vive du processus.
Usage en laboratoire autorisé uniquement. Tout ici cible
localhost/ un conteneur que vous exécutez vous-même. Ne pointez pas le PoC vers un hôte que vous ne possédez pas et pour lequel vous n'avez pas l'autorisation explicite de tester — l'utilisation non autorisée de Heartbleed contre des systèmes en production est un délit dans la plupart des juridictions. Heartbleed a été corrigé dans OpenSSL 1.0.1g (avril 2014) ; ce laboratoire existe pour comprendre le bug, pas pour attaquer qui que ce soit.
| Chemin | Description |
|---|---|
Dockerfile | Compile OpenSSL 1.0.1f à partir des sources amont épinglées par somme de contrôle avec les heartbeats activés, génère un certificat jetable et exécute openssl s_server — le véritable serveur vulnérable. |
exploit/heartbleed.py | PoC en Python 3. Envoie un heartbeat malformé et affiche en hexadécimal la mémoire que le serveur renvoie. Sort avec le code 0 si la cible est vulnérable, 1 si elle est corrigée. |
demo/server.py | Une simulation naïve en Python pur — aucun OpenSSL impliqué. Il renvoie aveuglément 64 Ko et ne fuit rien de réel ; conservé uniquement pour montrer la forme d'une réponse en surlecture. |
demo/gen-cert.sh | Régénère le certificat localhost jetable pour la démo. |
Aucune clé privée n'est versionnée — les certificats sont générés localement (voir .gitignore).
# 1. Build and start the vulnerable server (needs Docker)
docker build -t heartbleed-lab .
docker run --rm -p 8443:8443 heartbleed-lab
# 2. In another terminal, bleed it
python3 exploit/heartbleed.py 127.0.0.1 -p 8443
Un serveur vulnérable affiche un hexdump de la mémoire fuitée. Relancez le PoC plusieurs fois — chaque requête renvoie une tranche différente du tas, ce qui explique précisément pourquoi Heartbleed était si dangereux : les cookies de session, les données de formulaire et le matériel de clé privée y résident tous.
cd demo
./gen-cert.sh
python3 server.py
Ce n'est pas la CVE — c'est un stub pédagogique qui répond toujours avec 64 Ko de A.
La requête heartbeat TLS transporte une charge utile plus un champ de longueur. OpenSSL vulnérable fait confiance à la longueur fournie par l'attaquant et memcpy autant d'octets depuis le tampon de la requête vers la réponse — mais la requête n'a jamais contenu autant de données, donc la copie lit au-delà dans la mémoire adjacente du processus. Le correctif dans 1.0.1g est une vérification de bornes : if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; — abandonner silencieusement tout heartbeat qui prétend plus que ce qui a été réellement envoyé.
-DOPENSSL_NO_HEARTBEATS.