
عرض توضيحي لثغرة Heartbleed (CVE-2014-0160)، بما في ذلك تعليمات إعداد المختبر والكود المصدري لبناء مختبر Heartbleed الخاص بك لأغراض تعليمية
يهدف هذا المستودع إلى العمل كدليل إثبات مفهوم صالح لثغرة Heartbleed CVE، بالإضافة إلى احتوائه على إرشادات لإعداد تحدّي Heartbleed الخاص بك دون استخدام Dockerfile مُعدّ مسبقًا.
cd service/heartbleed أو cd srcsudo docker build -t heartbleed .sudo docker run -dp 443:443 --name heartbleed heartbleedتم إعداد سكربت استغلال مسبق البناء لك في مجلد solution/. يعتمد سكربت الاستغلال على سكربت استغلال Heartbleed من Sensepost (https://github.com/sensepost/heartbleed-poc)، مع تعديلات ليعمل مع هذا التحدي المحدد. تم تعديل قيم حقل إصدار TLS في حمولة Client Hello لهذا الإصدار من سكربت الاستغلال.
وفقًا لتعليقات المشاركين في مسابقات CTF، فإن وحدات Metasploit الخاصة بـ Heartbleed ستعمل أيضًا. للأسف، لم أجرب ذلك بنفسي.
في اختباري الأصلي لثغرة 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);
}
}