
स्व-निहित Heartbleed (CVE-2014-0160) लैब: Docker में कमजोर OpenSSL 1.0.1f बनाता है और अधिकृत परीक्षण के लिए एक Python मेमोरी-लीक PoC शामिल करता है।
CVE-2014-0160 (Heartbleed) के लिए एक छोटा, स्व-निहित लैब — OpenSSL 1.0.1–1.0.1f में TLS heartbeat over-read। यह एक थ्रोअवे कंटेनर में pinned upstream source से वास्तव में कमजोर OpenSSL को बनाता है, उसे सर्व करता है, और एक proof-of-concept क्लाइंट शामिल करता है जो उससे लाइव प्रोसेस मेमोरी लीक करता है।
केवल अधिकृत लैब उपयोग। यहाँ सब कुछ
localhost/ आपके द्वारा चलाए जाने वाले कंटेनर को लक्षित करता है। PoC को किसी ऐसे होस्ट पर न लक्षित करें जिसका आप स्वामी न हों और जिसका परीक्षण करने की स्पष्ट अनुमति आपके पास न हो — लाइव सिस्टम के विरुद्ध Heartbleed का अनधिकृत उपयोग अधिकांश क्षेत्राधिकारों में अपराध है। Heartbleed को OpenSSL 1.0.1g (अप्रैल 2014) में ठीक किया गया था; यह लैब बग को समझने के लिए है, किसी पर हमला करने के लिए नहीं।
| Path | What it is |
|---|---|
Dockerfile | checksum-pinned upstream source से OpenSSL 1.0.1f को heartbeats सक्षम के साथ बनाता है, एक थ्रोअवे cert जनरेट करता है, और openssl s_server चलाता है — वास्तविक कमजोर सर्वर। |
exploit/heartbleed.py | Python 3 PoC। एक विकृत heartbeat भेजता है और सर्वर जो मेमोरी वापस लीक करता है उसका hexdump करता है। यदि लक्ष्य कमजोर है तो 0 के साथ बाहर निकलता है, यदि patched है तो 1। |
demo/server.py | शुद्ध Python में एक naive simulation — इसमें कोई OpenSSL शामिल नहीं। यह बिना सोचे 64 KB echo करता है और कुछ भी वास्तविक लीक नहीं करता; केवल over-read reply का स्वरूप दिखाने के लिए रखा गया है। |
demo/gen-cert.sh | demo के लिए थ्रोअवे localhost cert को पुनः जनरेट करता है। |
कोई private keys commit नहीं किए गए हैं — certs स्थानीय रूप से जनरेट होते हैं (देखें .gitignore)।
# 1. Build and start the vulnerable server (needs Docker)
docker build -t heartbleed-lab .
docker run --rm -p 8443:8443 heartbleed-lab
# 2. In another terminal, bleed it
python3 exploit/heartbleed.py 127.0.0.1 -p 8443
एक कमजोर सर्वर लीक हुई मेमोरी का hexdump प्रिंट करता है। PoC को कुछ बार दोबारा चलाएँ — प्रत्येक अनुरोध heap का एक अलग स्लाइस लौटाता है, यही कारण है कि Heartbleed इतना खतरनाक था: session cookies, form data, और private key material सब वहीं रहते हैं।
cd demo
./gen-cert.sh
python3 server.py
यह CVE नहीं है — यह एक शिक्षण stub है जो हमेशा 64 KB As के साथ जवाब देता है।
TLS heartbeat अनुरोध में एक payload और एक length field होता है। कमजोर OpenSSL
हमलावर द्वारा दी गई length पर भरोसा करता है और अनुरोध बफर से उतने बाइट्स को प्रतिक्रिया में memcpy करता है — लेकिन अनुरोध में कभी उतना डेटा नहीं था, इसलिए
कॉपी उससे आगे उस आसन्न प्रोसेस मेमोरी में पढ़ती है जो वहाँ होती है। 1.0.1g में फिक्स एक
bounds check है: if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; — जो भी heartbeat वास्तव में भेजे गए से अधिक होने का दावा करता है उसे चुपचाप
छोड़ दें।
-DOPENSSL_NO_HEARTBEATS के साथ बनाएँ।