
Esegui il dump di lsass utilizzando solo funzioni NTAPI, creando manualmente file Minidump (senza MiniDumpWriteDump!!!)
NativeDump consente di dumpare il processo lsass utilizzando solo NTAPI, generando un file Minidump con solo gli stream necessari per essere analizzati da strumenti come Mimikatz o Pypykatz (Stream SystemInfo, ModuleList e Memory64List).

Il programma ha un argomento opzionale per il file di output, il nome predefinito è "proc_<PID>.dmp":
NativeDump.exe [DUMP_FILE]

Lo strumento è stato testato sulle ultime versioni di Windows con le soluzioni di sicurezza più comuni (Microsoft Defender for Endpoints, CrowdStrike...) e funziona bene, ma la furtività dipenderà dalla "versione" scelta: usa linguaggi poco comuni e personalizza i binari per ottenere i migliori risultati! Tuttavia, non funziona se PPL è abilitato o la struttura PEB non è leggibile. Aggiornamento: Ora è possibile eseguire i programmi senza leggere il PEB, controlla il branch peb-unreadable :)
Alcuni vantaggi di questa tecnica sono:
Puoi trovare il progetto in diverse "versioni" (o linguaggi):
main - Implementazione base .NET (questo branch)
python-flavour - Implementazione Python con 3 metodi di sovrascrittura di ntdll.dll + Esfiltrazione su macchina remota
golang-flavour - Implementazione Golang con 3 metodi di sovrascrittura di ntdll.dll + Esfiltrazione su macchina remota
c-flavour - Implementazione C/C++ con 3 metodi di sovrascrittura di ntdll.dll
bof-flavour - File BOF con 3 metodi di sovrascrittura di ntdll.dll
rust-flavour - Implementazione Rust di @safedv
crystal-flavour - Implementazione Crystal con capacità di sovrascrittura di ntdll.dll
nim-flavour - Implementazione Nim con capacità di sovrascrittura di ntdll.dll
Altri branch interessanti che usano .NET:
remote - Esfiltrazione su macchina remota + 3 metodi di sovrascrittura di ntdll.dll + Risoluzione dinamica delle funzioni + Crittografia AES delle stringhe + Codifica XOR del contenuto del Minidump
all-modules - Ottiene le informazioni per tutti i moduli (non solo lsasrv.dll)
peb-unreadable - Implementazione senza leggere la struttura PEB di lsass + 3 metodi di sovrascrittura di ntdll.dll
Dopo aver letto le strutture non documentate del Minidump, la sua struttura può essere riassunta in:

Ho creato uno strumento di parsing che può essere utile: MinidumpParser. Ci concentreremo sulla creazione di un file valido con solo i valori necessari per l'intestazione, la directory degli stream e i soli 3 stream necessari affinché un file Minidump possa essere analizzato da Mimikatz/Pypykatz: Stream SystemInfo, ModuleList e Memory64List.
L'intestazione è una struttura di 32 byte che può essere definita in C# come:
public struct MinidumpHeader
{
public uint Signature;
public ushort Version;
public ushort ImplementationVersion;
public ushort NumberOfStreams;
public uint StreamDirectoryRva;
public uint CheckSum;
public IntPtr TimeDateStamp;
}
I valori richiesti sono:
Ogni elemento nella Directory degli Stream è una struttura di 12 byte, quindi con 3 elementi la dimensione è di 36 byte. La definizione della struct in C# per un elemento è:
public struct MinidumpStreamDirectoryEntry
{
public uint StreamType;
public uint Size;
public uint Location;
}
Il campo "StreamType" rappresenta il tipo di stream come intero o ID, alcuni dei più rilevanti sono:
Il primo stream è uno stream SystemInformation, con ID 7. La dimensione è di 56 byte e si trova all'offset 68 (0x44), dopo la Directory degli Stream. La sua definizione in 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;
}
I valori richiesti sono:
Il secondo stream è uno stream ModuleList, con ID 4. Si trova all'offset 124 (0x7C) dopo lo stream SystemInformation e avrà anch'esso una dimensione fissa di 112 byte, poiché conterrà l'elemento di un singolo modulo, l'unico necessario per una corretta analisi: "lsasrv.dll".
La struttura tipica per questo stream è un valore a 4 byte contenente il numero di elementi seguito da elementi di 108 byte per ogni modulo:
public struct ModuleListStream
{
public uint NumberOfModules;
public ModuleInfo[] Modules;
}
Poiché ce n'è solo uno, si semplifica in:
public struct ModuleListStream
{
public uint NumberOfModules;
public IntPtr BaseAddress;
public uint Size;
public uint UnknownField1;
public uint Timestamp;
public uint PointerName;
public IntPtr UnknownField2;
public IntPtr UnknownField3;
public IntPtr UnknownField4;
public IntPtr UnknownField5;
public IntPtr UnknownField6;
public IntPtr UnknownField7;
public IntPtr UnknownField8;
public IntPtr UnknownField9;
public IntPtr UnknownField10;
public IntPtr UnknownField11;
}
I valori richiesti sono:
Il terzo stream è uno stream Memory64List, con ID 9. Si trova all'offset 298 (0x12A), dopo lo stream ModuleList e la stringa Unicode, e la sua dimensione dipende dal numero di moduli.
public struct Memory64ListStream
{
public ulong NumberOfEntries;
public uint MemoryRegionsBaseAddress;
public Memory64Info[] MemoryInfoEntries;
}
Ogni elemento del modulo è una struttura di 16 byte:
public struct Memory64Info
{
public IntPtr Address;
public IntPtr Size;
}
I valori richiesti sono:
Ci sono prerequisiti per iterare le regioni di memoria del processo lsass.exe che possono essere risolti utilizzando solo NTAPI:
Con questo è possibile attraversare la memoria del processo chiamando:
Dopo i passaggi precedenti, abbiamo tutto ciò che è necessario per creare il file Minidump. Possiamo creare un file localmente o inviare i byte a una macchina remota, con la possibilità di codificare o crittografare i byte prima. Alcune di queste possibilità sono codificate nel branch delegates, dove il file creato localmente può essere codificato con XOR, e nel branch remote, dove il file può essere codificato con XOR prima di essere inviato a una macchina remota.
Per un approccio alternativo che evita la creazione di un file Minidump, dai un'occhiata a TrickDump: genera tre file JSON e un archivio ZIP, e il Minidump viene ricostruito sulla macchina dell'attaccante. Questo può aiutare a eludere le soluzioni di sicurezza che monitorano la creazione o l'esfiltrazione di Minidump.
| ID | Tipo di Stream |
|---|
| 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 |