
Dimostrazione della vulnerabilità Heartbleed (CVE-2014-0160), incluse istruzioni per la configurazione del laboratorio e codice sorgente per costruire il proprio laboratorio Heartbleed a scopo didattico
Questo repository ha lo scopo di fungere da proof-of-concept valido per la CVE Heartbleed, oltre a contenere istruzioni per configurare la propria sfida Heartbleed senza utilizzare un Dockerfile pre-costruito.
cd service/heartbleed o cd srcsudo docker build -t heartbleed .sudo docker run -dp 443:443 --name heartbleed heartbleedUno script di exploit pre-costruito è già stato preparato per te nella cartella solution/. Lo script di exploit è basato sullo script di exploit Heartbleed di Sensepost (), modificato per funzionare per questa specifica sfida. I valori del campo versione TLS nel payload Client Hello sono stati modificati per questa versione dell'exploit.
Secondo il feedback dei partecipanti al CTF, i moduli Metasploit per Heartbleed funzioneranno anche loro. Purtroppo non li ho provati.
Nei miei test originali della CVE Heartbleed, il binario base di OpenSSL non era coerente nel dump del contenuto della memoria e avrebbe richiesto troppo tempo e risorse per forzare correttamente la memoria del server per ottenere le chiavi segrete, il che avrebbe portato a un DDoS involontario dell'infrastruttura CTF. Pertanto, è stata apportata una modifica nello script t1_lib.c, dove si trovava la vulnerabilità originale.
Alla riga 2586, il codice memcpy originale è stato commentato e sostituito con un ciclo condizionale che inserirà la chiave del server nel corpo della risposta il 10% delle volte. Questo ha lo scopo di simulare la natura non deterministica originale della CVE Heartbleed, assicurando al contempo che i partecipanti possano comunque ottenere la chiave in modo affidabile.
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);
}
}