
Demonstração do Heartbleed CVE (CVE-2014-0160), incluindo instruções de configuração de laboratório e código fonte para construir seu próprio laboratório Heartbleed para fins educacionais.
Este repositório visa servir como uma prova de conceito válida para a CVE Heartbleed, bem como conter instruções para configurar seu próprio desafio Heartbleed sem usar um Dockerfile pré-construído.
cd service/heartbleed ou cd srcsudo docker build -t heartbleed .sudo docker run -dp 443:443 --name heartbleed heartbleedUm script de exploit pré-construído já foi preparado para você na pasta solution/. O script de exploit é baseado no script de exploit Heartbleed da Sensepost (https://github.com/sensepost/heartbleed-poc), modificado para funcionar neste desafio específico. Os valores do campo de versão TLS no payload Client Hello foram modificados para esta versão do exploit.
De acordo com o feedback dos participantes do CTF, os módulos do Metasploit para Heartbleed também funcionarão. Infelizmente, ainda não testei isso.
Nos meus testes originais da CVE Heartbleed, o binário base do OpenSSL não era consistente ao despejar o conteúdo da memória, e levaria muito tempo e recursos para forçar corretamente a memória do servidor para obter as chaves secretas, o que teria levado a infraestrutura do CTF a ser involuntariamente atacada por DDoS. Sendo assim, uma modificação foi feita no script t1_lib.c, onde a vulnerabilidade original estava localizada.
Na linha 2586, o código original memcpy foi comentado e, em vez disso, substituído por um loop condicional que inserirá a chave do servidor no corpo da resposta 10% das vezes. Isso visa simular a natureza não determinística original da CVE Heartbleed, ao mesmo tempo que garante que os participantes ainda possam obter a chave de forma confiável.
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);
}
}