
एक स्टैंडअलोन DLL जो KeePass प्रक्रिया में इंजेक्ट किए जाने पर डेटाबेस को क्लियरटेक्स्ट में निर्यात करता है।
एक स्टैंडअलोन DLL जो KeePass प्रक्रिया में इंजेक्ट होने के बाद डेटाबेस को cleartext में निर्यात करता है।
महान KeeFarce, KeeThief और KeePassHax प्रोजेक्ट्स से काफी प्रेरित।
कुछ साल पहले, @denandz ने KeeFarce जारी किया, जो KeePass डेटाबेस को cleartext में निकालने के लिए डिज़ाइन किया गया पहला offensive टूल था। यह चल रही प्रक्रिया में एक DLL इंजेक्ट करके काम करता है, फिर आवश्यक ऑब्जेक्ट्स खोजने के लिए ClrMD का उपयोग करके heap को स्कैन करता है और reflection के माध्यम से KeePass की अंतर्निहित export विधि को लागू करता है। उस समय इसकी एकमात्र कमी यह थी कि लक्ष्य पर कई फाइलें ड्रॉप करनी पड़ती थीं (extraction DLL + ClrMD DLL + injector + एक bootstrap DLL)।
एक साल बाद, @tifkin_ और @harmj0y ने KeePass को लक्षित करने वाली offensive तकनीकों की एक गहन समीक्षा जारी की (हालांकि यह अब harmj0y के ब्लॉग पर उपलब्ध नहीं है, लेख Wayback Machine पर पाए जा सकते हैं: part 1, part 2)। इसके परिणामस्वरूप KeeThief जारी हुआ, जो KeePass की masterkey को डिक्रिप्ट करने में सक्षम एक टूल है (तब भी जब वैकल्पिक प्रमाणीकरण विधियों का उपयोग किया जाता है)। यह इतनी अच्छी तरह से काम किया कि KeePass डेवलपर्स ने इस तकनीक को कम करने के लिए एक पैरामीटर जोड़ा (इसे KeePass कॉन्फ़िगरेशन फ़ाइल को संपादित करके अक्षम किया जा सकता है यदि उपयोगकर्ता के पास पर्याप्त अधिकार हों, जो काफी सामान्य है)।
ये टूल पेनेट्रेशन टेस्टिंग के दौरान जल्दी ही मेरे पसंदीदा बन गए, लेकिन वे जल्द ही अप्रचलित हो गए क्योंकि उनकी injection तकनीकें (अर्थात्, प्रसिद्ध Win32 APIs का समूह — VirtualAllocEx, WriteProcessMemory, CreateRemoteThread, WriteProcessMemory, आदि) अब तुरंत डिटेक्शन ट्रिगर करती हैं। @snovvcrash ने KeeThief को fork करके इस समस्या को संबोधित किया (अब एक private repo में, लेकिन फिर भी यहाँ सुलभ), D/Invoke के साथ injection तंत्र को बेहतर बनाने के लिए, और इस प्रक्रिया का विवरण देते हुए एक शानदार लेख लिखा। हालाँकि इसने KeeThief को बनाए रखने की व्यवहार्यता प्रदर्शित की, मुझे नियमित रूप से नई injection तकनीकों को लागू करना कठिन लगता है, क्योंकि KeeThief का कोड इसके injector से कसकर जुड़ा हुआ है।
@holly-cracker ने KeePassHax भी जारी किया, जो एक एकल DLL के रूप में आता है और KeePass की masterkey को डिक्रिप्ट करने के लिए केवल reflection का उपयोग करता है। इस काम से प्रेरित होकर, मैंने KeeFarce के साथ भी ऐसा ही करने और अपना खुद का KeePass निष्कर्षण टूल लिखने का फैसला किया, जिसमें निम्नलिखित विशेषताएँ हों:
KeeFarce Reborn एक KeePass plugin DLL भी प्रदान करता है ताकि KeePass बिना injectors की परेशानी के खुद को इंजेक्ट कर सके!
चूँकि कोड पूरी तरह से बिना किसी बाहरी निर्भरता के .NET Framework पर निर्भर करता है, इसे Visual Studio 2015 और उच्चतर पर आसानी से संकलित किया जा सकता है।
KeeFarce Reborn में KeePass प्रक्रिया में DLL लोड करने के लिए कोई injector शामिल नहीं है। यह जानबूझकर किया गया है, क्योंकि injectors हर कुछ महीनों में अप्रचलित हो जाते हैं, आपको अपना खुद का उपयोग करना होगा। निम्नलिखित भाग injection करने के दो सामान्य तरीकों को प्रदर्शित करते हैं।
पूर्व-आवश्यकता: KeePass plugin निर्देशिका में लिखने की पहुँच।
KeePass में उपयोगकर्ताओं को अतिरिक्त कार्यक्षमताएँ प्रदान करने के लिए एक plugin framework है। यह KeePass प्रक्रिया में एक DLL लोड करके काम करता है, जिससे plugin डेवलपर्स KeePass के application domain के भीतर क्रियाएँ कर सकते हैं।
परिणामस्वरूप, हम बिना किसी बाहरी injector का उपयोग किए भी KeeFarce Reborn को plugin के रूप में लोड करने के लिए इस कार्यक्षमता का दुरुपयोग कर सकते हैं! आपको बस KeeFarceRebornPlugin प्रोजेक्ट को संकलित करना होगा और DLL को plugins निर्देशिका में कॉपी करना होगा (ग्लोबल इंस्टॉल के लिए KeePass रूट पर स्थित, अर्थात "C:\Program Files\KeePass Password Safe 2\Plugins")।
प्रोजेक्ट को सही ढंग से बनाने के लिए, आपको लक्षित KeePass.exe असेंबली संस्करण को KeeFarceRebornPlugin निर्देशिका में कॉपी करना होगा, या यदि आप चाहते हैं कि परिणामी plugin किसी भी KeePass संस्करण के साथ संगत हो तो PLGX का उपयोग करें।
अगली बार जब KeePass शुरू होगा और एक डेटाबेस अनलॉक होगा, DLL लोड हो जाएगा और injection निष्पादित हो जाएगा। यदि KeePass पहले से चल रहा है, तो injection होने के लिए आपको इसके अगले पुनरारंभ की प्रतीक्षा करनी होगी (या स्वयं पुनरारंभ के लिए बाध्य करें)।
⚠️ एक बार plugin लोड हो जाने पर, DLL फ़ाइल तब तक write-protected रहेगी जब तक KeePass बंद नहीं हो जाता। इसे ध्यान में रखें ताकि आप आकलनों के दौरान पीछे दुर्भावनापूर्ण plugins न छोड़ें।
यदि आपके पास KeePass plugin निर्देशिका में लिखने की पहुँच नहीं है, तो आप Quarkslab के लेख पर एक नज़र डाल सकते हैं, जो दर्शाता है कि plugin cache के माध्यम से कम विशेषाधिकारों के साथ plugins कैसे लोड किए जाएँ।
पूर्व-आवश्यकता: KeePass चल रहा है + उपयोगकर्ता द्वारा एक डेटाबेस अनलॉक किया गया है + आपके पास KeePass प्रक्रिया में इंजेक्ट करने के लिए पर्याप्त अधिकार हैं।
क्योंकि मैं व्यक्तिगत रूप से एक दूरस्थ प्रक्रिया में DLL की तुलना में shellcode को चुपचाप इंजेक्ट करना आसान पाता हूँ, मैं आमतौर पर सबसे पहले अपने DLL से position-independent shellcode उत्पन्न करना शुरू करता हूँ। ऐसा प्रतीत होता है कि @odzhan और @TheWover का donut प्रोजेक्ट हमारी आवश्यकताओं के लिए पूरी तरह उपयुक्त है!
हम dev branch के एक commit से donut संकलित करते हैं, क्योंकि यह application domain management में एक issue को ठीक करता है जो हमें डिफ़ॉल्ट domain में reflection करने से रोकता।
git clone https://github.com/TheWover/donut/
cd donut
git checkout 9d781d8da571eb1499122fc0e2d6e89e5a43603c
हम Visual Studio के x64 Native Tools Command Prompt से nmake उपयोगिता के साथ आसानी से निर्माण कर सकते हैं:
nmake -f Makefile.msvc
Shellcode उत्पन्न करना उतना ही सरल है:
.\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"
ध्यान दें कि entropy अक्षम करने के लिए
-e 1आवश्यक है, अन्यथा इंजेक्ट की गई प्रक्रिया डिफ़ॉल्ट application domain में नहीं होगी।
आइए injector के कोड में आसान एकीकरण के लिए इसे PowerShell का उपयोग करके संपीड़ित करें: