
lsass mit ausschließlich NTAPI-Funktionen dumpen, indem Minidump-Dateien handgefertigt werden (ohne MiniDumpWriteDump!!!)
NativeDump ermöglicht das Dumpen des lsass-Prozesses unter ausschließlicher Verwendung von NTAPIs, wobei eine Minidump-Datei erstellt wird, die nur die Streams enthält, die für die Analyse durch Tools wie Mimikatz oder Pypykatz erforderlich sind (SystemInfo-, ModuleList- und Memory64List-Streams).

Das Programm hat ein optionales Argument für die Ausgabedatei, der Standard-Dateiname ist „proc_<PID>.dmp“:
NativeDump.exe [DUMP_FILE]

Das Tool wurde mit den neuesten Windows-Versionen und den gängigsten Sicherheitslösungen (Microsoft Defender for Endpoints, CrowdStrike...) getestet und funktioniert einwandfrei, aber die Tarnung hängt von der gewählten „Flavour“ ab: Verwenden Sie ungewöhnliche Sprachen und passen Sie die Binärdateien an, um die besten Ergebnisse zu erzielen! Es funktioniert jedoch nicht, wenn PPL aktiviert ist oder die PEB-Struktur nicht lesbar ist. Update: Jetzt ist es möglich, die Programme auszuführen, ohne das PEB zu lesen, siehe den peb-unreadable branch :)
Einige Vorteile dieser Technik sind:
Sie finden das Projekt in verschiedenen Varianten (oder Sprachen):
main - .NET grundlegende Implementierung (dieser Branch)
python-flavour - Python Implementierung mit 3 ntdll.dll-Überschreibungsmethoden + Exfiltrieren zu einem entfernten Rechner
golang-flavour - Golang Implementierung mit 3 ntdll.dll-Überschreibungsmethoden + Exfiltrieren zu einem entfernten Rechner
c-flavour - C/C++ Implementierung mit 3 ntdll.dll-Überschreibungsmethoden
bof-flavour - BOF-Datei mit 3 ntdll.dll-Überschreibungsmethoden
rust-flavour - Rust Implementierung von @safedv
crystal-flavour - Crystal Implementierung mit ntdll.dll-Überschreibungsfähigkeiten
nim-flavour - Nim Implementierung mit ntdll.dll-Überschreibungsfähigkeiten
Weitere interessante Branches mit .NET:
remote - Exfiltrieren zu einem entfernten Rechner + 3 ntdll.dll-Überschreibungsmethoden + dynamische Funktionsauflösung + String-AES-Verschlüsselung + XOR-Kodierung des Minidump-Inhalts
all-modules - Informationen für alle Module abrufen (nicht nur lsasrv.dll)
peb-unreadable - Implementierung ohne Lesen der PEB-Struktur von lsass + 3 ntdll.dll-Überschreibungsmethoden
Nachdem die undokumentierten Minidump-Strukturen gelesen wurden, kann die Struktur wie folgt zusammengefasst werden:

Ich habe ein Analysewerkzeug erstellt, das hilfreich sein kann: MinidumpParser. Wir konzentrieren uns auf die Erstellung einer gültigen Datei mit nur den notwendigen Werten für den Header, das Stream-Verzeichnis und die einzigen 3 Streams, die für die Analyse einer Minidump-Datei durch Mimikatz/Pypykatz benötigt werden: SystemInfo-, ModuleList- und Memory64List-Streams.
Der Header ist eine 32-Byte-Struktur, die in C# wie folgt definiert werden kann:
public struct MinidumpHeader
{
public uint Signature;
public ushort Version;
public ushort ImplementationVersion;
public ushort NumberOfStreams;
public uint StreamDirectoryRva;
public uint CheckSum;
public IntPtr TimeDateStamp;
}
Die erforderlichen Werte sind:
Jeder Eintrag im Stream-Verzeichnis ist eine 12-Byte-Struktur, sodass bei 3 Einträgen die Größe 36 Bytes beträgt. Die C#-Struktdefinition für einen Eintrag ist:
public struct MinidumpStreamDirectoryEntry
{
public uint StreamType;
public uint Size;
public uint Location;
}
Das Feld „StreamType“ repräsentiert den Typ des Streams als Ganzzahl oder ID. Einige der relevantesten sind:
| ID | Stream Type |
|---|---|
| 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 |
Der erste Stream ist ein SystemInformation-Stream mit der ID 7. Die Größe beträgt 56 Bytes und er befindet sich bei Offset 68 (0x44), nach dem Stream-Verzeichnis. Seine C#-Definition ist: