Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
NativeDump — Volcar lsass usando solo funciones NTAPI creando manualmente archivos Minidump (¡sin MiniDumpWriteDump!!!) | Kitploit
Herramientas/GitHubGitHub/ricardojoserf/nativedump
Forensia de MemoriaPost-ExplotaciónRed Teaming
GitHubricardojoserf/nativedump

NativeDump

Volcar lsass usando solo funciones NTAPI creando manualmente archivos Minidump (¡sin MiniDumpWriteDump!!!)

Ver RepositorioSitio web
745104hace 4 díasRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

NativeDump

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).

esquema

  • NTOpenProcessToken y NtAdjustPrivilegeToken para obtener el privilegio "SeDebugPrivilege"
  • RtlGetVersion para obtener los detalles de la versión del sistema operativo (versión mayor, versión menor y número de compilación). Esto es necesario para el Stream SystemInfo
  • NtQueryInformationProcess y NtReadVirtualMemory para obtener la dirección de lsasrv.dll. Este es el único módulo necesario para el Stream ModuleList
  • NtOpenProcess para obtener un manejador del proceso lsass
  • NtQueryVirtualMemory y NtReadVirtualMemory para recorrer las regiones de memoria y volcar todas las posibles. Al mismo tiempo, popula el Stream Memory64List

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

root@kitploit:~
NativeDump.exe [DUMP_FILE]

poc

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:

  • No utiliza la conocida función dbghelp!MinidumpWriteDump
  • Solo utiliza funciones de Ntdll.dll, por lo que es posible saltarse el API hooking reasignando la biblioteca
  • El archivo Minidump no tiene que escribirse en disco, puedes transferir sus bytes (codificados o cifrados) a una máquina remota

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



Técnica en detalle: Creando un archivo Minidump mínimo

Después de leer las estructuras no documentadas de Minidump, su estructura se puede resumir en:

  • Encabezado: Información como la Firma ("MDMP"), la ubicación del Directorio de Streams y el número de streams
  • Directorio de Streams: Una entrada para cada stream, conteniendo el tipo, tamaño total y ubicación en el archivo de cada uno
  • Streams: Cada stream contiene información diferente relacionada con el proceso y tiene su propio formato
  • Regiones: Los bytes reales del proceso de cada región de memoria que se pueden leer

estructure

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.


A. Encabezado

El encabezado es una estructura de 32 bytes que se puede definir en C# como:

root@kitploit:~
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:

  • Signature: Valor fijo 0x504d44d (cadena "MDMP")
  • Version: Valor fijo 0xa793 (constante Microsoft MINIDUMP_VERSION)
  • NumberOfStreams: Valor fijo 3, los tres Streams requeridos para el archivo
  • StreamDirectoryRVA: Valor fijo 0x20 o 32 bytes, el tamaño del encabezado

B. Directorio de Streams

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:

root@kitploit:~
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:


C. Stream SystemInformation

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:

root@kitploit:~
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;
}

Los valores requeridos son:

  • ProcessorArchitecture: 9 para sistemas Windows de 64 bits y 0 para los de 32 bits
  • Major version, Minor version y BuildNumber: Hardcodeados u obtenidos a través de kernel32!GetVersionEx o ntdll!RtlGetVersion (usaremos este último)

D. Stream ModuleList

El segundo stream es un Stream ModuleList, con ID 4. Se ubica en el offset 124 (0x7C) después del stream SystemInformation y también tendrá un tamaño fijo de 112 bytes, ya que contendrá la entrada de un solo módulo, el único necesario para que el análisis sea correcto: "lsasrv.dll".

La estructura típica para este stream es un valor de 4 bytes que contiene el número de entradas seguido de entradas de 108 bytes para cada módulo:

root@kitploit:~
public struct ModuleListStream
{
    public uint NumberOfModules;
    public ModuleInfo[] Modules;
}

Como solo hay una, se simplifica a:

root@kitploit:~
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;
}

Los valores requeridos son:

  • NumberOfStreams: Valor fijo 1
  • BaseAddress: Usando psapi!GetModuleBaseName o una combinación de ntdll!NtQueryInformationProcess y ntdll!NtReadVirtualMemory (usaremos este último)
  • Size: Obtenido sumando todos los tamaños de regiones de memoria desde BaseAddress hasta una con un tamaño de 4096 bytes (0x1000), la sección .text de otra biblioteca
  • PointerToName: Estructura de cadena Unicode para la cadena "C:\Windows\System32\lsasrv.dll", ubicada después del propio stream en el offset 236 (0xEC)

E. Stream Memory64List

El tercer stream es un Stream Memory64List, con ID 9. Se ubica en el offset 298 (0x12A), después del stream ModuleList y la cadena Unicode, y su tamaño depende del número de módulos.

root@kitploit:~
public struct Memory64ListStream
{
    public ulong NumberOfEntries; 
    public uint MemoryRegionsBaseAddress;
    public Memory64Info[] MemoryInfoEntries;
}

Cada entrada de módulo es una estructura de 16 bytes:

root@kitploit:~
public struct Memory64Info
{
    public IntPtr Address;
    public IntPtr Size;
}

Los valores requeridos son:

  • NumberOfEntries: Número de regiones de memoria, obtenido después de recorrer las regiones de memoria
  • MemoryRegionsBaseAddress: Ubicación del inicio de los bytes de las regiones de memoria, calculado después de sumar el tamaño de todas las entradas de memoria de 16 bytes
  • Address y Size: Obtenidos para cada región válida mientras se recorren

F. Recorrido de regiones de memoria

Hay requisitos previos para recorrer las regiones de memoria del proceso lsass.exe que se pueden resolver usando solo NTAPIs:

  1. Obtener el permiso "SeDebugPrivilege". En lugar de los típicos Advapi!OpenProcessToken, Advapi!LookupPrivilegeValue y Advapi!AdjustTokenPrivilege, usaremos ntdll!NtOpenProcessToken, ntdll!NtAdjustPrivilegesToken y el valor hardcodeado de 20 para el Luid (que es constante en todas las últimas versiones de Windows).
  2. Obtener el ID del proceso. Por ejemplo, recorrer todos los procesos usando ntdll!NtGetNextProcess, obtener la dirección del PEB con ntdll!NtQueryInformationProcess y usar ntdll!NtReadVirtualMemory para leer el campo ImagePathName dentro de ProcessParameters. Para no complicar demasiado el PoC, usaremos Process.GetProcessesByName(<PROCESS_NAME>) de .NET.
  3. Abrir un manejador del proceso. Usar ntdll!OpenProcess con permisos PROCESS_QUERY_INFORMATION (0x0400) para recuperar información del proceso y PROCESS_VM_READ (0x0010) para leer los bytes de memoria.

Con esto es posible recorrer la memoria del proceso llamando a:

  • ntdll!NtQueryVirtualMemory: Devuelve una estructura MEMORY_BASIC_INFORMATION con el tipo de protección, estado, dirección base y tamaño de cada región de memoria
    • Si la protección de memoria no es PAGE_NOACCESS (0x01) y el estado de memoria es MEM_COMMIT (0x1000), lo que significa que es accesible y está confirmada, la dirección base y el tamaño poblan una entrada del stream Memory64List y se pueden agregar bytes al archivo
    • Si la dirección base es igual a la dirección base de lsasrv.dll, se usa para calcular el tamaño de lsasrv.dll en memoria
  • ntdll!NtReadVirtualMemory: Agrega los bytes de esa región al archivo Minidump después del Stream Memory64List

G. Creación del archivo Minidump

Después de los pasos anteriores tenemos todo lo necesario para crear el archivo Minidump. Podemos crear un archivo localmente o enviar los bytes a una máquina remota, con la posibilidad de codificar o cifrar los bytes antes. Algunas de estas posibilidades están codificadas en la rama delegates, donde el archivo creado localmente se puede codificar con XOR, y en la rama remote, donde el archivo se puede codificar con XOR antes de enviarlo a una máquina remota.



TrickDump

Para un enfoque alternativo que evita crear un archivo Minidump, consulta TrickDump: genera tres archivos JSON y un archivo ZIP, y el Minidump se reconstruye en la máquina del atacante. Esto puede ayudar a evadir soluciones de seguridad que monitorean la creación o exfiltración de Minidump.

Descargar herramienta
IDTipo de Stream
0x00UnusedStream
0x01ReservedStream0
0x02ReservedStream1
0x03ThreadListStream
0x04ModuleListStream
0x05MemoryListStream
0x06ExceptionStream
0x07SystemInfoStream
0x08ThreadExListStream
0x09Memory64ListStream
0x0ACommentStreamA
0x0BCommentStreamW
0x0CHandleDataStream
0x0DFunctionTableStream
0x0EUnloadedModuleListStream
0x0FMiscInfoStream
0x10MemoryInfoListStream
0x11ThreadInfoListStream
0x12HandleOperationListStream
0x13TokenStream
0x16HandleOperationListStream