
केवल NTAPI फ़ंक्शनों का उपयोग करके lsass को डंप करें, मिनीडंप फ़ाइलों को हाथ से तैयार करके (MiniDumpWriteDump के बिना!!!)
NativeDump केवल NTAPIs का उपयोग करके lsass प्रक्रिया को डंप करने की अनुमति देता है, जो केवल उन स्ट्रीम्स के साथ एक Minidump फ़ाइल उत्पन्न करता है जिन्हें Mimikatz या Pypykatz जैसे उपकरणों द्वारा पार्स करने की आवश्यकता होती है (SystemInfo, ModuleList और Memory64List स्ट्रीम्स)।

प्रोग्राम में आउटपुट फ़ाइल के लिए एक वैकल्पिक तर्क है, डिफ़ॉल्ट फ़ाइल नाम 'proc_<PID>.dmp' है:
NativeDump.exe [DUMP_FILE]

यह उपकरण नवीनतम Windows संस्करणों के विरुद्ध सबसे सामान्य सुरक्षा समाधानों (Microsoft Defender for Endpoints, CrowdStrike...) के साथ परीक्षण किया गया है और ठीक काम करता है, लेकिन चुपके आपके द्वारा चुने गए 'स्वाद' पर निर्भर करेगा: सर्वोत्तम परिणामों के लिए असामान्य भाषाओं का उपयोग करें और बाइनरी को अनुकूलित करें! हालाँकि, यह काम नहीं करता है यदि PPL सक्षम है या PEB संरचना पढ़ने योग्य नहीं है। अद्यतन: अब PEB को पढ़े बिना प्रोग्राम को निष्पादित करना संभव है, peb-unreadable शाखा देखें :)
इस तकनीक के कुछ लाभ हैं:
आप प्रोजेक्ट को विभिन्न 'स्वादों' (या भाषाओं) में पा सकते हैं:
main - .NET मूल कार्यान्वयन (यह शाखा)
python-flavour - Python कार्यान्वयन जिसमें 3 ntdll.dll ओवरराइट विधियाँ + रिमोट मशीन पर एक्सफ़िल्ट्रेट करना
golang-flavour - Golang कार्यान्वयन जिसमें 3 ntdll.dll ओवरराइट विधियाँ + रिमोट मशीन पर एक्सफ़िल्ट्रेट करना
c-flavour - C/C++ कार्यान्वयन जिसमें 3 ntdll.dll ओवरराइट विधियाँ
bof-flavour - BOF फ़ाइल जिसमें 3 ntdll.dll ओवरराइट विधियाँ
rust-flavour - Rust कार्यान्वयन @safedv द्वारा
crystal-flavour - Crystal कार्यान्वयन जिसमें ntdll.dll ओवरराइट क्षमताएँ
nim-flavour - Nim कार्यान्वयन जिसमें ntdll.dll ओवरराइट क्षमताएँ
.NET का उपयोग करने वाली अन्य दिलचस्प शाखाएँ:
remote - रिमोट मशीन पर एक्सफ़िल्ट्रेट करना + 3 ntdll.dll ओवरराइट विधियाँ + डायनामिक फ़ंक्शन रिज़ॉल्यूशन + स्ट्रिंग AES एन्क्रिप्शन + XOR-एन्कोडिंग Minidump सामग्री
all-modules - सभी मॉड्यूल के लिए जानकारी प्राप्त करें (केवल lsasrv.dll नहीं)
peb-unreadable - lsass की PEB संरचना को पढ़े बिना कार्यान्वयन + 3 ntdll.dll ओवरराइट विधियाँ
Minidump के अप्रलेखित संरचनाओं को पढ़ने के बाद, इसकी संरचना को इस प्रकार संक्षेपित किया जा सकता है:

मैंने एक पार्सिंग टूल बनाया है जो सहायक हो सकता है: MinidumpParser। हम एक वैध फ़ाइल बनाने पर ध्यान केंद्रित करेंगे जिसमें हेडर, स्ट्रीम निर्देशिका और Minidump फ़ाइल के लिए आवश्यक केवल 3 स्ट्रीम (SystemInfo, ModuleList और Memory64List स्ट्रीम्स) के आवश्यक मान हों, ताकि Mimikatz/Pypykatz द्वारा पार्स किया जा सके।
हेडर एक 32-बाइट्स संरचना है जिसे C# में इस प्रकार परिभाषित किया जा सकता है:
public struct MinidumpHeader
{
public uint Signature;
public ushort Version;
public ushort ImplementationVersion;
public ushort NumberOfStreams;
public uint StreamDirectoryRva;
public uint CheckSum;
public IntPtr TimeDateStamp;
}
आवश्यक मान हैं:
स्ट्रीम निर्देशिका में प्रत्येक प्रविष्टि एक 12-बाइट्स संरचना है, इसलिए 3 प्रविष्टियाँ होने पर आकार 36 बाइट्स है। एक प्रविष्टि के लिए C# स्ट्रक्ट परिभाषा है:
public struct MinidumpStreamDirectoryEntry
{
public uint StreamType;
public uint Size;
public uint Location;
}
क्षेत्र 'StreamType' स्ट्रीम के प्रकार को एक पूर्णांक या आईडी के रूप में दर्शाता है, कुछ सबसे प्रासंगिक हैं:
| आईडी | स्ट्रीम प्रकार |
|---|---|
| 0x00 | UnusedStream |
| 0x01 | ReservedStream0 |
| 0x02 | ReservedStream1 |
| 0x03 | ThreadListStream |
| 0x04 | ModuleListStream |
| 0x05 | MemoryListStream |
| 0x06 | ExceptionStream |
| 0x07 | SystemInfoStream |
| 0x08 | ThreadExListStream |
| 0x09 | Memory64ListStream |
| 0x0A | CommentStreamA |
| 0x0B | CommentStreamW |
| 0x0C | HandleDataStream |
| 0x0D | FunctionTableStream |
| 0x0E | UnloadedModuleListStream |
| 0x0F | MiscInfoStream |
| 0x10 | MemoryInfoListStream |
| 0x11 | ThreadInfoListStream |
| 0x12 | HandleOperationListStream |
| 0x13 | TokenStream |
| 0x16 | HandleOperationListStream |
पहली स्ट्रीम SystemInformation स्ट्रीम है, जिसका आईडी 7 है। इसका आकार 56 बाइट्स है और यह स्ट्रीम निर्देशिका के बाद ऑफ़सेट 68 (0x44) पर स्थित होगी। इसकी C# परिभाषा है:
public struct SystemInformationStream
{
public ushort ProcessorArchitecture;
public ushort ProcessorLevel;
public ushort ProcessorRevision;
public byte NumberOfProcessors;
public byte ProductType;
public uint MajorVersion;
public uint MinorVersion;
public uint BuildNumber;
public uint PlatformId;
public uint UnknownField1;
public uint UnknownField2;
public IntPtr ProcessorFeatures;
public IntPtr ProcessorFeatures2;
public uint UnknownField3;
public ushort UnknownField14;
public byte UnknownField15;
}