
أداة تفريغ KeePass 2.X (CVE-2023-32784)
هذا هو تطبيق PoC الخاص بي لـ CVE-2023-32784
نسختي هي نسخة Python من PoC لـ @vdohney مع بعض التغييرات والميزات الإضافية.
كان أحد التغييرات هو استخدام سلاسل نصية معروفة يمكن العثور عليها داخل ملف التفريغ من أجل القفز بشكل أكثر دقة إلى موقع أحرف المفتاح الرئيسي. يؤدي هذا إلى تقليل الأحرف الإيجابية الكاذبة ويقلل بشكل كبير من الوقت المستغرق لمسح الملف. في حالة عدم العثور على السلاسل النصية في ملف التفريغ، سيبدأ المسح من البداية. هذا الخيار مفعل افتراضيًا، ولكن إذا كنت تريد إجراء مسح كامل بدلاً من ذلك، يمكنك استخدام --full-scan. لهذه الحالات، أضفت أيضًا علامة --skip للمساعدة في تسريع المسح. يتم ذلك عن طريق إزاحة المؤشر للقفز فوق الـ 1000 بايت التالية لأنها تحتوي عادةً على نفس الحرف مكررًا عدة مرات. على سبيل المثال، إذا تم العثور على الحرف ●e في ملف التفريغ، فسيظهر على النحو التالي:
●e
●e
●e
●e
●e
●e
●e
●e
●e
●e
●●c
باستخدام العلامة --skip، من الممكن القفز فوق هذه البايتات المتكررة للمساعدة في تسريع المسح، على الرغم من أن هذا ليس ضروريًا عند استخدام نقاط القفز.
[*] 15567777 | Found: ●e
[*] 15568797 | Found: ●e
[*] 15570355 | Found: ●●c
[*] 15571375 | Found: ●●c
[*] 15572925 | Found: ●●●r
[*] 15573973 | Found: ●●●r

تتضمن هذه النسخة وظيفة استرداد تحاول العثور على أي أحرف غير معروفة متبقية للمفتاح. يتم ذلك من خلال محاولة تحديد التركيبات المختلفة الممكنة للأحرف الموجودة داخل التفريغ، إذا تم العثور على تطابق، يتم سحب الأحرف المتبقية من التفريغ حتى يتم العثور على الحرف التالي غير الأسكي.
يعمل هذا إذا كانت كلمة المرور الكاملة بنص واضح مخزنة داخل ملف التفريغ (يبدو أن هذا يحدث عندما يعرض المستخدم المفتاح الرئيسي عن طريق إلغاء الإخفاء باستخدام العلامات النجمية).
يمكنك تمكين هذا السلوك باستخدام العلامة --recover.

يمكنك أيضًا تحديد ملف إخراج باستخدام -o لتصدير التركيبات المختلفة التي تم العثور عليها. هنا يمكنك أن ترى، حتى في حالة العثور على أحرف لمفتاح رئيسي آخر، بالإضافة إلى عدم تخزين كلمة المرور النصية في التفريغ، في قائمة التركيبات ما زلنا قادرين على الحصول على 23/24 حرفًا للمفتاح في التركيبة النهائية الموجودة أدناه.

في هذه الحالة، يُظهر الإدخال الأول أيضًا فعليًا 4/5 أحرف للمفتاح الثاني، ducks، الذي كان موجودًا داخل التفريغ أيضًا، ومع ذلك تم إقرانه مع أحرف المفتاح الآخر مما أدى إلى ucks|tMasterPassword123!. يبدو أن هناك حل بديل محتمل لهذا، لكنه لا يزال قيد العمل.
أضفت أيضًا القدرة على البحث عن كلمات مرور محتملة داخل ملف التفريغ من خلال توفير قائمة كلمات باستخدام -w. ستقوم هذه العلامة بإنشاء سلاسل نصية تحتوي على أحرف من الكلمات الموجودة في القائمة للبحث عنها داخل ملف التفريغ. يمكنك أيضًا تحديد حشو للسلاسل النصية التي تم إنشاؤها باستخدام العلامات -p أو --padding.
مثال: --padding 2 => ●●a | --padding 3 => ●●●a

في المثال أعلاه، كانت كلمة المرور مخزنة بنص واضح داخل التفريغ. لذلك كان من الممكن مطابقة السلسلة النصية التي تم العثور عليها لسحب الأحرف الإضافية. ومع ذلك، في حالة عدم تخزين كلمة المرور النصية بنص واضح داخل التفريغ، لا يزال من الممكن استخراج الأحرف المتبقية:

في هذه الحالة، على الرغم من أنه لم يتمكن من العثور على تطابق نصي واضح في التفريغ، إلا أنه لا يزال قادرًا على استخراج جميع الأحرف الإضافية.
الشكر لـ @vdohney الذي اكتشف هذه الثغرة في الأصل. رابط لمشروعه هنا
تفاصيل CVE: CVE-2023-32784