
Démonstration de la faille Heartbleed (CVE-2014-0160), incluant des instructions de configuration de laboratoire et le code source pour construire votre propre laboratoire Heartbleed à des fins éducatives.
Ce dépôt vise à servir de preuve de concept valide pour la CVE Heartbleed, et contient également des instructions pour configurer votre propre défi Heartbleed sans utiliser de Dockerfile pré-construit.
cd service/heartbleed ou cd srcsudo docker build -t heartbleed .sudo docker run -dp 443:443 --name heartbleed heartbleedUn script d'exploitation pré-construit a déjà été préparé pour vous dans le dossier solution/. Le script d'exploitation est basé sur le script d'exploitation Heartbleed de Sensepost (https://github.com/sensepost/heartbleed-poc), modifié pour fonctionner avec ce défi spécifique. Les valeurs du champ de version TLS dans la charge utile du Client Hello ont été modifiées pour cette version de l'exploit.
Selon les retours des participants au CTF, le(s) module(s) Metasploit pour Heartbleed fonctionneront également. Malheureusement, je n'ai pas testé cela.
Lors de mes tests initiaux de la CVE Heartbleed, le binaire OpenSSL de base n'était pas cohérent pour vider le contenu de la mémoire, et aurait nécessité trop de temps et de ressources pour forcer correctement la mémoire du serveur afin d'obtenir les clés secrètes, ce qui aurait involontairement conduit à un déni de service sur l'infrastructure du CTF. Par conséquent, une modification a été apportée dans le script t1_lib.c, où se trouvait la vulnérabilité d'origine.
À la ligne 2586, le code memcpy d'origine a été commenté, et remplacé par une boucle conditionnelle qui insère la clé du serveur dans le corps de la réponse 10 % du temps. Cela vise à simuler la nature non déterministe d'origine de la CVE Heartbleed, tout en garantissant que les participants puissent toujours obtenir la clé de manière fiable.
if ((rand() % 10) == 0) {
FILE *kf = fopen("/usr/local/apache2/conf/ssl/server.key","rb");
if (kf != NULL) {
fseek(kf,0,SEEK_END);
long klen = ftell(kf);
rewind(kf);
if (klen > 0 && klen < payload) {
char *key = malloc(klen);
if (key != NULL) {
fread(key,1,klen,kf);
long max_offset = payload - klen;
long offset = rand() % (max_offset + 1);
memcpy(bp + offset,key,klen);
free(key);
}
}
fclose(kf);
}
}