
Volcar lsass usando solo funciones NTAPI creando manualmente archivos Minidump (¡sin MiniDumpWriteDump!!!)
NativeDump permite volcar el proceso lsass usando solo NTAPIs generando un archivo Minidump con solo los streams necesarios para ser analizados por herramientas como Mimikatz o Pypykatz (SystemInfo, ModuleList y Memory64List Streams).

El programa tiene un argumento opcional para el archivo de salida, el nombre de archivo por defecto es "proc_<PID>.dmp":
NativeDump.exe [DUMP_FILE]

La herramienta ha sido probada en las últimas versiones de Windows con las soluciones de seguridad más comunes (Microsoft Defender for Endpoints, CrowdStrike...) y funciona bien, pero el sigilo dependerá de la "versión" que elijas: ¡usa lenguajes poco comunes y personaliza los binarios para obtener los mejores resultados! Sin embargo, no funciona si PPL está habilitado o la estructura PEB no es legible. Actualización: Ahora es posible ejecutar los programas sin leer el PEB, consulta la rama peb-unreadable :)
Algunos beneficios de esta técnica son:
Puedes encontrar el proyecto en diferentes "versiones" (o lenguajes):
main - Implementación básica en .NET (esta rama)
python-flavour - Implementación en Python con 3 métodos de sobrescritura de ntdll.dll + Exfiltración a máquina remota
golang-flavour - Implementación en Golang con 3 métodos de sobrescritura de ntdll.dll + Exfiltración a máquina remota
c-flavour - Implementación en C/C++ con 3 métodos de sobrescritura de ntdll.dll
bof-flavour - Archivo BOF con 3 métodos de sobrescritura de ntdll.dll
rust-flavour - Implementación en Rust por @safedv
crystal-flavour - Implementación en Crystal con capacidades de sobrescritura de ntdll.dll
nim-flavour - Implementación en Nim con capacidades de sobrescritura de ntdll.dll
Otras ramas interesantes usando .NET:
remote - Exfiltración a máquina remota + 3 métodos de sobrescritura de ntdll.dll + Resolución dinámica de funciones + Cifrado AES de cadenas + Codificación XOR del contenido del Minidump
all-modules - Obtener la información de todos los módulos (no solo lsasrv.dll)
peb-unreadable - Implementación sin leer la estructura PEB de lsass + 3 métodos de sobrescritura de ntdll.dll
Después de leer las estructuras no documentadas de Minidump, su estructura se puede resumir en:

Creé una herramienta de análisis que puede ser útil: MinidumpParser. Nos centraremos en crear un archivo válido con solo los valores necesarios para el encabezado, el directorio de streams y los únicos 3 streams necesarios para que un archivo Minidump sea analizado por Mimikatz/Pypykatz: SystemInfo, ModuleList y Memory64List Streams.
El encabezado es una estructura de 32 bytes que se puede definir en C# como:
public struct MinidumpHeader
{
public uint Signature;
public ushort Version;
public ushort ImplementationVersion;
public ushort NumberOfStreams;
public uint StreamDirectoryRva;
public uint CheckSum;
public IntPtr TimeDateStamp;
}
Los valores requeridos son:
Cada entrada en el Directorio de Streams es una estructura de 12 bytes, por lo que al tener 3 entradas el tamaño es de 36 bytes. La definición de struct en C# para una entrada es:
public struct MinidumpStreamDirectoryEntry
{
public uint StreamType;
public uint Size;
public uint Location;
}
El campo "StreamType" representa el tipo de stream como un entero o ID, algunos de los más relevantes son:
| ID | Tipo de 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 |
El primer stream es un Stream SystemInformation, con ID 7. El tamaño es de 56 bytes y se ubicará en el offset 68 (0x44), después del Directorio de Streams. Su definición en C# es: