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

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

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

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

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

Категории

Все категории
Loading categories
memdumper — Злоупотребляет энтайтлментами отладчика macOS и переменной DYLD_INSERT_LIBRARIES для снятия дампа памяти запущенного процесса или поиска по ней, перекладывая атрибуцию EDR на подписанный вспомогательный бинарный файл. | Kitploit
Инструменты/GitHubGitHub/cenobyte-vincit/memdumper
Криминалистика памятиОбход IDS/IPSСбор информацииПост-эксплуатацияЦифровая криминалистикаТестирование на ПроникновениеRed Teaming
GitHubcenobyte-vincit/memdumper

memdumper

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

Репозиторий
1401 месяц назадЕщё не проверено

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
# 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`)

## Сборка

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

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

```bash
sudo ./attach.sh [options] -p <pid> <entitled-binary> [args...]
```

| Опция | Значение |
|--------|---------|
| `-p`, `--pid PID` | ID целевого процесса (обязательно) |
| `-s`, `--search STRING` | Искать STRING в читаемых областях |
| `-n`, `--max-regions N` | Максимум читаемых областей для hex-дампа (по умолчанию 100). Только для пути дампа |
| `-f`, `--force` | Продолжить, если `codesign` сообщает о Hardened Runtime |
| `-h`, `--help` | Показать справку (код выхода 1) |

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

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

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

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

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

```bash
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` не выполняется:

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

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

```bash
nano foo
```

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

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

Попадание выглядит так. Затем процесс завершается с кодом 0:

```text
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` задаёт их из флагов.

| Переменная | Задаётся через | Значение |
|----------|--------|---------|
| `MEMDUMPER_TARGET_PID` | `-p` | PID цели. Если не задана или не является положительным целым числом, конструктор печатает диагностику и возвращается |
| `MEMDUMPER_SEARCH` | `-s` | Если не пустая, выполняется поиск вместо дампа |
| `MEMDUMPER_MAX_REGIONS` | `-n` | Число читаемых областей для hex-дампа (по умолчанию 100). Игнорируется на пути поиска |

Любой загрузчик, который устанавливает `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`, когда хотите, чтобы эти вставки выполнились.

```bash
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` ищет `memdumper.dylib` в текущем рабочем каталоге, а не рядом со скриптом. Для полной «боевой» реализации реализуйте этот загрузчик на этапе 1 или этапе 2, а не поставляйте `attach.sh`.
- Поиск читает не более 10 МиБ каждой читаемой области и обходит не более 1000 областей. Обход дампа останавливается после 10000 областей и печатает только первые 256 байт каждой отображаемой области (`-n` / `MEMDUMPER_MAX_REGIONS`, по умолчанию 100).
- `ptrace` — только присоединение и отсоединение. Он не дампит память. `[RESULT] 3/3` означает, что все три вызова успешны, а не то, что выполнились три пути дампа.
- CrowdStrike Falcon для macOS логирует переменные окружения процесса, включая `DYLD_INSERT_LIBRARIES`. Охотники за угрозами используют это поле, чтобы заметить такую вставку.
- Один целевой PID за один вызов.

## См. также

- ARCHITECTURE.md: наследование entitlement, taskgated и `system.privilege.taskport`, три метода, что записывает EDR
- AGENTS.md: хост сборки против целевого
Скачать инструмент