Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/cenobyte-vincit/memdumper
Криминалистика памятиОбход IDS/IPSСбор информацииПост-эксплуатацияЦифровая криминалистикаТестирование на ПроникновениеRed Teaming
GitHubcenobyte-vincit/memdumper

memdumper

Злоупотребляет энтайтлментами отладчика macOS и переменной DYLD_INSERT_LIBRARIES для снятия дампа памяти запущенного процесса или поиска по ней, перекладывая атрибуцию EDR на подписанный вспомогательный бинарный файл.

Репозиторий
12122 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

memdumper

memdumper читает память запущенного процесса macOS, используя entitlement отладчика другого подписанного бинарника. Цель — чтобы task_for_pid и ptrace выполнялись от имени этого бинарника с entitlement, и EDR записал именно его, а не memdumper.

от cenobyte [email protected] 2026

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

Краткое описание

memdumper запускает бинарник с entitlement, который несёт com.apple.security.cs.debugger плюс два entitlement, разрешающих вставку через DYLD_INSERT_LIBRARIES. Используйте его, чтобы искать и дампить память другого процесса от root. OpenJDK jspawnhelper — часто встречающийся бинарник, особенно на машинах разработчиков.

Передайте attach.sh PID цели и бинарник с entitlement. Конструктор dylib выполняется до main этого бинарника, читает цель, затем вызывает _exit. Бинарник с entitlement так и не доходит до main, поэтому такой хелпер, как jspawnhelper, не печатает свой баннер использования. Дополнительные аргументы после бинарника с entitlement остаются в командной строке, которую записывает EDR. Без -s dylib делает hex-дамп начала каждой читаемой области. С -s он ищет строку в этих областях. Адресное пространство цели не изменяется. Присоединение через ptrace может ненадолго остановить цель.

Статус дампа — строка [RESULT] в объединённом выводе. Успешная вставка завершается с кодом 0 после завершения конструктора.

Требования

Хост выполнения

  • macOS (Darwin)
  • root
  • Бинарник с entitlement, имеющий все три: com.apple.security.cs.debugger, com.apple.security.cs.allow-dyld-environment-variables и com.apple.security.cs.disable-library-validation (например, jspawnhelper из OpenJDK)

Хост сборки

  • macOS (Darwin) с Xcode Command Line Tools или Xcode
  • clang
  • make
  • shellcheck для attach.sh и тестовых скриптов (brew install shellcheck)
  • cppcheck (brew install cppcheck)

Сборка

На хосте сборки:

root@kitploit:~
make

В результате получится memdumper.dylib. Скопируйте attach.sh и memdumper.dylib на целевой хост, если машины разные.

Использование

Запускайте attach.sh от root из каталога, в котором лежит memdumper.dylib. Вызов не от root отклоняется до запуска бинарника с entitlement (root required). Это позволяет избежать диалога пароля Developer Tool Access (taskgated / Authorization Services). Этот диалог не является частью Transparency, Consent, and Control (TCC).

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

Убедитесь, что кандидат в бинарники с entitlement имеет все три entitlement. Префикс Cellar и версия OpenJDK различаются; attach.sh использует такую раскладку в собственной справке:

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

Дамп читаемых областей PID 4543:

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

Поиск HELLO в этом процессе:

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

Ограничить дамп 50 читаемых областей, используя java как бинарник с entitlement. TestSpawn остаётся в командной строке; main у java не выполняется:

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

Редактор без Hardened Runtime — рабочая цель для быстрой проверки. Запустите его от пользователя, которому принадлежит буфер, затем присоединитесь от root. В одном терминале:

root@kitploit:~
nano foo

Поместите HELLO в буфер, чтобы строка оказалась в процессе (сохраните файл или оставьте несохранённым). В другом терминале, из каталога, где лежит memdumper.dylib:

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

Попадание выглядит так. Затем процесс завершается с кодом 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 не проверяет entitlement бинарника с entitlement. Если в бинарнике не хватает любого из трёх, вставка или task_for_pid завершатся ошибкой.

Коды выхода

КодЗначение
0Конструктор завершился после успешной вставки
1Ошибка использования, не root, отсутствует memdumper.dylib в текущем каталоге, отсутствует -p, PID цели не найден, Hardened Runtime без --force, или вставка не произошла (тогда бинарник с entitlement запустился и завершился с ненулевым кодом)

Смотрите [RESULT] для оценки результата дампа. Код выхода 0 означает только то, что конструктор выполнился и вызвал _exit.

Конфигурация

Dylib читает три переменные окружения. attach.sh задаёт их из флагов.

Любой загрузчик, который устанавливает DYLD_INSERT_LIBRARIES в memdumper.dylib и эти переменные, может внедрить dylib. attach.sh — штатный загрузчик из репозитория.

Проверка

На хосте сборки make собирает dylib и запускает cppcheck и shellcheck. make test запускает модульные тесты и функциональный набор. Эти проверки не являются доказательством чистоты среды выполнения.

Живые тесты поиска и дампа требуют Homebrew OpenJDK и uid 0. Они ищут jspawnhelper через find в /opt/homebrew/Cellar и /usr/local/Cellar (без привязки к версии). Они не вызывают sudo сами. Если Homebrew OpenJDK нет или набор уже не запущен от uid 0, эти два случая пропускаются (код 77), поэтому make test не от root не показывает диалог Developer Tool Access. Используйте sudo make test, когда хотите, чтобы эти вставки выполнились.

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

Ограничения

  • Hardened Runtime блокирует task_for_pid, ptrace и чтение памяти (1Password, Chrome). --force всё равно пытается, но почти всегда безуспешно.
  • Хост выполнения требует root. Подключение не от root к процессу того же пользователя вызывает диалог пароля Developer Tool Access: taskgated проверяет право Authorization Services system.privilege.taskport. Этот диалог не является TCC. Режим разработчика (DevToolsSecurity -enable) вместе с членством в admin или _developer не подавляет его для Homebrew jspawnhelper (adhoc, публичный entitlement отладчика). Он пропускает пароль только для подписанных Apple инструментов, таких как lldb. System Integrity Protection (SIP) оставляет защищённые системные процессы недосягаемыми даже для root.
  • Некоторые процессы (включая bash) отказываются от подключения из-за других проверок.
  • attach.sh ищет в текущем рабочем каталоге, а не рядом со скриптом. Для полной «боевой» реализации реализуйте этот загрузчик на этапе 1 или этапе 2, а не поставляйте .

См. также

  • ARCHITECTURE.md: наследование entitlement, taskgated и system.privilege.taskport, три метода, что записывает EDR
  • AGENTS.md: хост сборки против целевого
Скачать инструмент
ОпцияЗначение
-p, --pid PIDID целевого процесса (обязательно)
-s, --search STRINGИскать STRING в читаемых областях
-n, --max-regions NМаксимум читаемых областей для hex-дампа (по умолчанию 100). Только для пути дампа
-f, --forceПродолжить, если codesign сообщает о Hardened Runtime
-h, --helpПоказать справку (код выхода 1)
ПеременнаяЗадаётся черезЗначение
MEMDUMPER_TARGET_PID-pPID цели. Если не задана или не является положительным целым числом, конструктор печатает диагностику и возвращается
MEMDUMPER_SEARCH-sЕсли не пустая, выполняется поиск вместо дампа
MEMDUMPER_MAX_REGIONS-nЧисло читаемых областей для hex-дампа (по умолчанию 100). Игнорируется на пути поиска
memdumper.dylib
attach.sh
  • Поиск читает не более 10 МиБ каждой читаемой области и обходит не более 1000 областей. Обход дампа останавливается после 10000 областей и печатает только первые 256 байт каждой отображаемой области (-n / MEMDUMPER_MAX_REGIONS, по умолчанию 100).
  • ptrace — только присоединение и отсоединение. Он не дампит память. [RESULT] 3/3 означает, что все три вызова успешны, а не то, что выполнились три пути дампа.
  • CrowdStrike Falcon для macOS логирует переменные окружения процесса, включая DYLD_INSERT_LIBRARIES. Охотники за угрозами используют это поле, чтобы заметить такую вставку.
  • Один целевой PID за один вызов.