此仓库旨在作为 Heartbleed CVE 的有效概念验证,并包含在没有预建 Dockerfile 的情况下设置自己的 Heartbleed 挑战的说明。
cd service/heartbleed 或 cd src 导航到源代码/服务目录sudo docker build -t heartbleed .sudo docker run -dp 443:443 --name heartbleed heartbleed在 solution/ 文件夹中已经为您准备了一个预构建的利用脚本。该利用脚本基于 Sensepost 的 Heartbleed 利用脚本 (https://github.com/sensepost/heartbleed-poc),并针对此特定挑战进行了修改。在此版本的利用脚本中,已修改了 Client Hello 载荷中的 TLS 版本字段的值。
根据 CTF 参与者的反馈,针对 Heartbleed 的 Metasploit 模块也能起作用。遗憾的是,我尚未对此进行尝试。
在我对 Heartbleed CVE 的原始测试中,基础的 OpenSSL 二进制文件在转储内存内容方面不一致,并且需要过多的时间和资源来正确暴力破解服务器的内存以获取密钥,这将导致 CTF 基础设施无意中被 DDoS 攻击。因此,在原始漏洞所在的 t1_lib.c 脚本中进行了修改。
在第 2586 行,原始的 memcpy 代码已被注释掉,取而代之的是一个条件循环,该循环会有 10% 的概率将服务器密钥插入响应体中。这旨在模拟 Heartbleed CVE 原始的非确定性特性,同时确保参与者仍然能够可靠地获取密钥。
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);
}
}