
💪 إثبات المفهوم لهجوم BEAST ضد SSL/TLS CVE-2011-3389 💪
يركز إثبات المفهوم هذا على التشفير الكامن وراء هجوم BEAST (استغلال المتصفح ضد SSL/TLS) الذي قدمه Thai Duong و Juliano Rizzo في 23 سبتمبر 2011. هذا هجوم نص صريح مختار ويتيح لك استرجاع معلومات حساسة إذا كان أمان طبقة النقل المستخدم هو TLS1.0 أو SSLv3. يمكن العثور على إثبات المفهوم الأصلي هنا: Here come the Ninjas
ملاحظة: هذا أيضًا تنفيذ للثغرة التي اكتشفها في الأصل Phillip Rogaway. اُكتشفت في عام 2002، ولم يُطرح أي استغلال حتى BEAST في عام 2011. لقد عرف OpenSSL بالفعل المشكلة ولهذا قاموا بتحديث TLS1.0 إلى TLS1.1 في أبريل 2006.
2 إن IV الخاص بـ CBC لكل سجل باستثناء السجل الأول هو آخر كتلة نص مشفر من السجل السابق. وبالتالي فإن التشفير ليس آمنًا ضد المهاجمين الذين يمكنهم اختيار النصوص الصريحة بشكل تكيفي;
SSLv3/TLS1.0 هما بروتوكولان لتشفير/فك تشفير بياناتك وتأمينها. في حالتنا، يستخدم كلاهما تسلسل وضع تشفير الكتل CBC. يتم تقسيم النص الصريح إلى كتل وفقًا لخوارزمية التشفير (AES, DES, 3DES) ويكون الطول من مضاعفات 8 أو 16. إذا لم يملأ النص الصريح الطول، تُضاف حشوة في النهاية لاستكمال المساحة المفقودة. أنصحك بشدة بفتح هاتين الصورتين للتشفير ولفك التشفير لقراءة هذا الملف.
في الأساس هذه مجرد عملية XOR بسيطة، ويمكنك أيضًا مشاهدة هذا الفيديو (ليس من إعدادي) https://www.youtube.com/watch?v=0D7OwYp6ZEc.
سأقدم IV في النقطة التالية. تذكر أن كل هذه الخصائص ستساعدنا في تنفيذ هجومنا.
عندما نستخدم CBC نحتاج إلى متجه تهيئة يُسمى IV. هذا IV عشوائي (أو ثابت) لكن في أي حال يجب ألا يكون قابلاً للتنبؤ من قبل أي شخص. في TLS1.0 وSSLv3 يكون أول IV في الطلب عشوائيًا، حسنًا. لكن لكسب بعض الوقت وعدم توليد IV عشوائي جديد في كل مرة، استخدم تنفيذ TLS1.0 وSSLv3 آخر كتلة من النص المشفر السابق كـ IV. بعبارة أخرى، أصبح IV قابلاً للتخمين الآن. سنفترض أن طول كل كتلة سيكون 8 (DES) وأن المهاجم يملك MiTM لاسترجاع كل النص المشفر.
مثال:
C0 | C... | Ci-1 | Ci | Ci+1 |Cn
الآن الجزء المثير للاهتمام، هذه هي الخطوات التشفيرية المختلفة للهجوم لاسترجاع بايت واحد:
bbbbbbbTHIS_IS_A_SECRET_COOKIE عبر الضحية.يمكنك ملاحظة سبعة b قبل الكوكيز السرية. إذا كان طول الكتلة 8، نحتاج إلى دفع 7 بايتات معروفة. هذه المعلومة مهمة جدًا، فالمهاجم يعرف أول 7 بايتات من الكتلة الأولى.
ولكن لماذا؟ هذا يتيح لنا فقط 256 احتمالًا للعثور على بايت واحد وليس 256^8 للعثور على 8 بايتات!
الآن يرسل الضحية الطلب وسيُشفَّر على النحو التالي:
C0 | C1 | C2 | C3 | C4
حيث C0 = Ek(IV ⊕ bbbbbbbT) = Ek(C²n ⊕ bbbbbbbT)
P'0 = C²n ⊕ C4 ⊕ bbbbbbbX
العنصر الوحيد غير المعروف هو X، وهناك 256 احتمالًا لذا سيجرّب 256 حرفًا كحد أقصى.
يُرسَل الطلب ويُشفَّر على النحو التالي:
C'0 = Ek(P'0 ⊕ IV')
C'0 = Ek(C²n ⊕ C4 ⊕ bbbbbbbX ⊕ IV') أو C4 ⊕ IV' = 0
C'0 = Ek(C²n ⊕ bbbbbbbX)
C'0 = Ek(IV ⊕ bbbbbbbX)
الآن يقارن: C'0 مع C0، إذا كانا متساويين، فقد وجد للتو البايت X في الموضع 8. إذا لم يتطابق، يعيد المحاولة بحرف آخر ويقارن مجددًا، وهكذا.
الآن لدينا بايت واحد، ويمكننا الحصول على بايت آخر عبر إزاحة الطلب السابق بمقدار واحد إلى اليسار: bbbbbbTHIS_IS_A_SECRET_COOKIE. لديه الآن ستة b ونعرف أيضًا T، إذن لدينا حرف واحد غير معروف. نبني P'0 جديدًا = C0 ⊕ C4 ⊕ bbbbbbTX، وهكذا...
ملاحظة: طريقة أخرى باستخدام طلبين فقط هي تعيين أول كتلة من النص الصريح واستخدام هذه المعلومات في عمليات XOR الثلاث. لم نعد بحاجة إلى آخر كتلة من C². C1 = Ek(C0 ⊕ bbbbbbbT) ثم P'0 = C0 ⊕ C4 ⊕ bbbbbbbX. كما يحتاج إلى مقارنة C'0 مع C1. هذه طريقة أخرى للقيام بذلك، يمكنك ملاحظة أنني في PoC قمت بترميز الاحتمالين :)
يمكننا الآن استرجاع كل الأحرف!
python BEAST-poc.py
لا يمكن للمهاجم استخدام بروتوكول HTTP لأن الكتلة الأولى ستُملأ بـ GET / HTTP/1.1\r\n.
... لا يمكنه التحكم في البايتات الأولى من كل طلب لأنها دائمًا ما تكون سلسلة ثابتة مثل GET / أو POST /، وما إلى ذلك. وبدلاً من ذلك يمكنه استخدام socket.
كما يحتاج إلى حقن بعض جافاسكربت في صفحة خبيثة. يجب أن يكون الضحية متصلاً بهذه الصفحة وأن يبقى فيها حتى اكتمال الهجوم. هذا هجوم نص صريح مختار، لذا يمكن للمهاجم إرسال عبر كود الجافاسكربت أي نص صريح يريده واعتراض النتيجة عبر رجل في المنتصف (Man in The Middle). هذا مخطط الهجوم:

يتطلب هذا الهجوم شروطًا مهمة ليكون ناجحًا (TLS1.0 أو ما هو أدنى، وضع تشفير CBC، MiTM، جافاسكربت خبيث). لكن Thai Duong و Juliano Rizzo أثبتا أنه ممكن وعرّضا استغلالهما بسرقة كوكيز من موقع Paypal.
كل شيء أصبح مُصلَحًا الآن، واحتمال تنفيذ هذا الهجوم ضئيل.
| التشفير | فك التشفير |
|---|
| Ci = Ek(Pi ⊕ Ci-1), and C0 = IV | Pi = Dk(Ci) ⊕ Ci-1, and C0 = IV |