Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
NativeDump — Esegui il dump di lsass utilizzando solo funzioni NTAPI, creando manualmente file Minidump (senza MiniDumpWriteDump!!!) | Kitploit
Strumenti/GitHubGitHub/ricardojoserf/nativedump
Memory ForensicsPost-ExploitRed Teaming
GitHubricardojoserf/nativedump

NativeDump

Esegui il dump di lsass utilizzando solo funzioni NTAPI, creando manualmente file Minidump (senza MiniDumpWriteDump!!!)

Vedi RepositorySito web
7451043 giorni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

NativeDump

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

esquema

  • NTOpenProcessToken e NtAdjustPrivilegeToken per ottenere il privilegio "SeDebugPrivilege"
  • RtlGetVersion per ottenere i dettagli della versione del sistema operativo (versione principale, versione secondaria e numero di build). Questo è necessario per lo stream SystemInfo
  • NtQueryInformationProcess e NtReadVirtualMemory per ottenere l'indirizzo di lsasrv.dll. Questo è l'unico modulo necessario per lo stream ModuleList
  • NtOpenProcess per ottenere un handle per il processo lsass
  • NtQueryVirtualMemory e NtReadVirtualMemory per iterare attraverso le regioni di memoria e dumpare tutte quelle possibili. Contemporaneamente popola lo stream Memory64List

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

root@kitploit:~
NativeDump.exe [DUMP_FILE]

poc

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:

  • Non utilizza la famosa funzione dbghelp!MinidumpWriteDump
  • Utilizza solo funzioni da Ntdll.dll, quindi è possibile bypassare l'API hooking rimappando la libreria
  • Il file Minidump non deve essere scritto su disco, puoi trasferire i suoi byte (codificati o crittografati) su una macchina remota

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



Tecnica in dettaglio: Creazione di un file Minidump minimale

Dopo aver letto le strutture non documentate del Minidump, la sua struttura può essere riassunta in:

  • Intestazione: Informazioni come la Firma ("MDMP"), la posizione della Directory degli Stream e il numero di stream
  • Directory degli Stream: Un elemento per ogni stream, contenente il tipo, la dimensione totale e la posizione nel file di ciascuno
  • Stream: Ogni stream contiene diverse informazioni relative al processo e ha il proprio formato
  • Regioni: I byte effettivi del processo provenienti da ogni regione di memoria che può essere letta

estructure

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.


A. Intestazione

L'intestazione è una struttura di 32 byte che può essere definita in C# come:

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;
}

I valori richiesti sono:

  • Signature: Valore fisso 0x504d44d (stringa "MDMP")
  • Version: Valore fisso 0xa793 (costante Microsoft MINIDUMP_VERSION)
  • NumberOfStreams: Valore fisso 3, i tre Stream richiesti per il file
  • StreamDirectoryRVA: Valore fisso 0x20 o 32 byte, la dimensione dell'intestazione

B. Directory degli Stream

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 è:

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


C. Stream SystemInformation

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# è:

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;
}

I valori richiesti sono:

  • ProcessorArchitecture: 9 per sistemi Windows a 64 bit e 0 per quelli a 32 bit
  • Major version, Minor version e BuildNumber: Hardcoded o ottenuti tramite kernel32!GetVersionEx o ntdll!RtlGetVersion (useremo quest'ultimo)

D. Stream ModuleList

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:

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

Poiché ce n'è solo uno, si semplifica in:

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;
}

I valori richiesti sono:

  • NumberOfStreams: Valore fisso 1
  • BaseAddress: Usando psapi!GetModuleBaseName o una combinazione di ntdll!NtQueryInformationProcess e ntdll!NtReadVirtualMemory (useremo quest'ultimo)
  • Size: Ottenuta sommando tutte le dimensioni delle regioni di memoria a partire da BaseAddress fino a una con dimensione 4096 byte (0x1000), la sezione .text di un'altra libreria
  • PointerToName: Struttura di stringa Unicode per la stringa "C:\Windows\System32\lsasrv.dll", situata dopo lo stream stesso all'offset 236 (0xEC)

E. Stream Memory64List

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.

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

Ogni elemento del modulo è una struttura di 16 byte:

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

I valori richiesti sono:

  • NumberOfEntries: Numero di regioni di memoria, ottenuto dopo aver iterato le regioni di memoria
  • MemoryRegionsBaseAddress: Posizione di inizio dei byte delle regioni di memoria, calcolata sommando la dimensione di tutti gli elementi di memoria da 16 byte
  • Address e Size: Ottenuti per ogni regione valida durante l'iterazione

F. Iterazione delle regioni di memoria

Ci sono prerequisiti per iterare le regioni di memoria del processo lsass.exe che possono essere risolti utilizzando solo NTAPI:

  1. Ottenere il permesso "SeDebugPrivilege". Invece del tipico Advapi!OpenProcessToken, Advapi!LookupPrivilegeValue e Advapi!AdjustTokenPrivilege, useremo ntdll!NtOpenProcessToken, ntdll!NtAdjustPrivilegesToken e il valore hardcoded 20 per il Luid (che è costante in tutte le ultime versioni di Windows)
  2. Ottenere l'ID del processo. Ad esempio, iterare tutti i processi usando ntdll!NtGetNextProcess, ottenere l'indirizzo PEB con ntdll!NtQueryInformationProcess e usare ntdll!NtReadVirtualMemory per leggere il campo ImagePathName all'interno di ProcessParameters. Per non complicare eccessivamente il PoC, useremo .NET's Process.GetProcessesByName(<NOME_PROCESSO>)
  3. Aprire un handle del processo. Usare ntdll!OpenProcess con i permessi PROCESS_QUERY_INFORMATION (0x0400) per recuperare le informazioni del processo e PROCESS_VM_READ (0x0010) per leggere i byte della memoria

Con questo è possibile attraversare la memoria del processo chiamando:

  • ntdll!NtQueryVirtualMemory: Restituisce una struttura MEMORY_BASIC_INFORMATION con il tipo di protezione, stato, indirizzo base e dimensione di ogni regione di memoria
    • Se la protezione della memoria non è PAGE_NOACCESS (0x01) e lo stato della memoria è MEM_COMMIT (0x1000), significa che è accessibile e impegnata, quindi l'indirizzo base e la dimensione popolano un elemento dello stream Memory64List e i byte possono essere aggiunti al file
    • Se l'indirizzo base è uguale all'indirizzo base di lsasrv.dll, viene utilizzato per calcolare la dimensione di lsasrv.dll in memoria
  • ntdll!NtReadVirtualMemory: Aggiunge i byte di quella regione al file Minidump dopo lo stream Memory64List

G. Creazione del file Minidump

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.



TrickDump

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.

Scarica lo strumento
IDTipo di Stream
0x00UnusedStream
0x01ReservedStream0
0x02ReservedStream1
0x03ThreadListStream
0x04ModuleListStream
0x05MemoryListStream
0x06ExceptionStream
0x07SystemInfoStream
0x08ThreadExListStream
0x09Memory64ListStream
0x0ACommentStreamA
0x0BCommentStreamW
0x0CHandleDataStream
0x0DFunctionTableStream
0x0EUnloadedModuleListStream
0x0FMiscInfoStream
0x10MemoryInfoListStream
0x11ThreadInfoListStream
0x12HandleOperationListStream
0x13TokenStream
0x16HandleOperationListStream