Статья Пентест macOS в 2026: kill chain от fingerprinting до persistence на Apple Silicon

Микросхема Apple M3 в антистатических пинцетах над тёмным матом. Циановый свет выявляет разводку кристалла, на корпусе лазерная гравировка кода эксплойта.


На последнем внутреннем пентесте финтех-компании 14 из 18 рабочих станций оказались на macOS Sequoia с чипами M3. Cobalt Strike beacon, SharpHound, Rubeus - весь привычный арсенал оказался бесполезен в первые два дня. Просто не запускается. Пришлось перестраивать весь kill chain под платформу, которую большинство пентестеров по-прежнему обходят стороной - мол, "маков в scope не бывает". Бывает. И всё чаще. Эта статья - результат того проекта: полная цепочка атаки на macOS, от fingerprinting хоста до закрепления в системе, с конкретными командами и честным указанием, где техника работает, а где уже нет.

Fingerprinting macOS-хоста: recon до первого payload'а​

[Применимо: внутренний пентест, grey/black box]

Прежде чем отправлять payload, нужно понять, с чем имеешь дело. На macOS fingerprinting решает три задачи: определить архитектуру процессора (arm64 vs x86_64), точную версию macOS и наличие Rosetta 2. От этих трёх параметров зависит выбор payload'а, C2-агента и вектора persistence. Ошибёшься в архитектуре - потеряешь время на бинарники, которые даже не стартанут.
Bash:
# Минимальный fingerprinting macOS после получения shell
uname -m                              # arm64 (Apple Silicon) или x86_64 (Intel)
sw_vers                               # ProductName, ProductVersion, BuildVersion
system_profiler SPHardwareDataType     # модель чипа, RAM; серийный номер требует admin-привилегий на Ventura+
csrutil status                        # статус SIP
# oahd запускается lazily; pgrep даст false negative если нет активных x86_64 процессов
# Надёжнее: arch -x86_64 /usr/bin/true 2>/dev/null || pkgutil --pkgs | grep -qi rosetta
pgrep -x oahd && echo "Rosetta 2 active" || arch -x86_64 /usr/bin/true 2>/dev/null && echo "Rosetta 2 installed" || echo "No Rosetta 2"
С Rosetta 2 есть нюанс: процесс oahd запускается lazily (только при выполнении x86_64-кода), поэтому pgrep может дать false negative. Надёжнее - arch -x86_64 /usr/bin/true 2>/dev/null или pkgutil --pkgs | grep -i Rosetta. Без Rosetta 2 ни один x86_64 C2-агент не запустится. Точка.

Из сети, без shell, fingerprinting сложнее. macOS отвечает на ICMP по умолчанию, но при включённом Stealth Mode (настройки Firewall) - молчит; на корпоративных машинах с управляемым firewall-профилем ICMP часто заблокирован. Зато Bonjour/mDNS может раскрыть имя хоста и сервисы - dns-sd -B _services._dns-sd._udp local. с другой macOS-машины или nmap с --script=dns-service-discovery. Ограничение: mDNS работает только в одном L2-сегменте. В сегментированных сетях (а финтех обычно сегментирован неплохо) придётся работать через ARP-scan.

Место в kill chain: fingerprinting - предшественник initial access. Без знания архитектуры и версии macOS вы потратите время на payload'ы, которые не запустятся.

Initial access: payload'ы, Gatekeeper и Apple Silicon​

1781430542157.webp

[Применимо: внутренний пентест, social engineering вектор]

Initial access на macOS приходит через: вредоносные документы, скрипты (osascript, Python, shell), бинарные payload'ы или installer-пакеты (.pkg). Каждый из этих векторов натыкается на Gatekeeper - первый рубеж обороны macOS.

Обход Gatekeeper (T1553.001, Defense Evasion)

Gatekeeper проверяет атрибут com.apple.quarantine у скачанных файлов и блокирует неподписанный или ненотаризованный код. Тут интересно: атрибут ставится автоматически при загрузке через браузер. А вот при доставке через curl, scp или rsync - не ставится, и Gatekeeper молчит. AirDrop, как и браузеры, ставит quarantine-атрибут через LaunchServices API; но при распаковке архива сторонними утилитами атрибут может не пропагироваться на содержимое (и это уже интересный вектор).

Проверка наличия флага: xattr -l <файл>. Удаление: xattr -d com.apple.quarantine <файл> - но для этого нужен доступ к терминалу. На внутреннем пентесте, где файл доставляется через корпоративный файловый сервер или MDM-профиль, quarantine-атрибут часто отсутствует изначально. Считай - подарок.

Когда техника НЕ работает: начиная с macOS Ventura, notarization-проверка стала строже для приложений из .dmg/.zip с quarantine - unsigned app bundle будет заблокирован при запуске через Finder. Без quarantine unsigned CLI-бинарь запускается нормально. Запуск через Terminal (chmod +x && ./binary) обходит Gatekeeper-проверку, но требует взаимодействия с пользователем или уже имеющегося shell.

Apple Silicon и совместимость payload'ов​

Большинство C2-фреймворков по-прежнему генерируют x86_64-бинарники. На Apple Silicon (M1–M4) без установленной Rosetta 2 такой payload просто не запустится - и это ломает стандартный подход "сгенерировал msfvenom -> доставил -> получил shell".

По данным исследования Schellman, при пентесте macOS на M1 payload poseidon из Mythic C2, скомпилированный для x86_64, отказался запускаться без Rosetta 2. Рабочее решение - apfell-агент, который работает через osascript (AppleScript, T1059.002, Execution) и не зависит от архитектуры процессора. Callback через osascript проходит на arm64 без проблем - это нативный интерпретатор macOS, он есть на каждом маке.

Если Rosetta 2 установлена, можно форсировать архитектуру: arch -x86_64 ./poseidon. А при доставке через installer-пакет (.pkg) в postinstall-скрипте можно тихо поставить Rosetta 2 одной строкой: /usr/sbin/softwareupdate --install-rosetta --agree-to-license. Пользователь ничего не увидит.

Ещё один нюанс .pkg-пакетов: файл Distribution содержит поле hostArchitectures. Многие пакеты указывают только x86_64 - на Apple Silicon installer откажется запускать такой .pkg. Добавление arm64 в это поле решает проблему. По данным Schellman, это единственная модификация, необходимая для совместимости.

Место в kill chain: initial access -> первичный callback на C2 -> enumeration и privilege escalation.

TCC и SIP: два барьера, которых нет на Windows​

[Применимо: внутренний пентест, Apple Silicon и Intel]

Если вы привыкли к Windows, где UAC - единственный popup между вами и SYSTEM, на macOS сюрпризов больше. Два механизма радикально меняют подход к macOS post-exploitation: TCC и SIP. На Windows-пентесте я бы уже давно был в домене, а тут - сидишь и разбираешься с правами доступа к микрофону.

TCC Manipulation (T1548.006, Privilege Escalation / Defense Evasion)​

TCC (Transparency, Consent, and Control) контролирует доступ приложений к чувствительным ресурсам: камера, микрофон, контакты, Full Disk Access, автоматизация через AppleScript. И вот что важно: root-процесс не получает автоматически TCC-разрешений (FDA, камера и т.д.) через API - для доступа к защищённым ресурсам нужна явная запись в TCC.db. При этом системная TCC.db защищена SIP и недоступна для модификации даже root'у. Замкнутый круг.

Пользовательская база: ~/Library/Application Support/com.apple.TCC/TCC.db. Чтение: sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db "SELECT service, client FROM access". Системная база защищена SIP и требует FDA для чтения - с этим сталкивается каждый пентестер при первой попытке работы с TCC.

Манипуляция TCC в 2026 - одна из самых горячих тем в macOS offensive security. Прямая модификация TCC.db невозможна при включённом SIP. Актуальные подходы эксплуатируют приложения, у которых уже есть TCC-разрешения (например, Terminal с FDA), и используют их как прокси для доступа к защищённым ресурсам. Каждое обновление macOS закрывает по несколько таких путей - на Sequoia большинство известных обходов устаревших версий уже не работают.

System Integrity Protection и AMFI

SIP защищает системные директории (/System, /usr за исключением /usr/local, /bin, /sbin) и критические процессы от модификации даже root'ом. Статус: csrutil status. На корпоративных машинах SIP почти всегда включён.

Для пентестера SIP означает: нельзя подменять системные бинарники, нельзя загружать неподписанные kexts, нельзя модифицировать системную TCC.db. Работать приходится в пользовательском пространстве - и к этому надо привыкнуть.

AMFI (Apple Mobile File Integrity) - связанный механизм, который проверяет подписи кода при загрузке. На Apple Silicon AMFI работает агрессивнее, чем на Intel: unsigned код, загруженный в память, блокируется на уровне ядра. Это напрямую бьёт по dylib injection и runtime hooking - техникам, которые на Intel-маках работали без подписи.

macOS post-exploitation: enumeration и credential access​

1.webp

[Применимо: внутренний пентест, после получения foothold]

После callback на C2 - первым делом: перечислить пользователей, проверить принадлежность к AD-домену и собрать credentials.

dscl . ls /Users перечисляет всех пользователей, включая системных - их может быть более 140 на чистой macOS (не пугайтесь, это нормально). Детальная информация по пользователю: dscl . cat /Users/<username> - выводит атрибуты OpenDirectory, включая UniqueID (UID) и GeneratedUID, а для AD-сопряжённых хостов - SMBSID, полезные при работе с Active Directory.

Если macOS введена в AD-домен (проверка: dsconfigad -show), через dscl перечисляются доменные объекты: dscl "/Active Directory/<DOMAIN>/All Domains" ls /Users - пользователи, ls /Groups - группы, ls /Computers - машины в домене. Из вывода можно установить парольные политики и структуру домена.

OPSEC-warning: на больших доменах (10k+ объектов) эти команды генерируют заметный трафик к DC, могут приводить к таймаутам и триггерить алерты AD-мониторинга. Лучше - таргетированные запросы по конкретным OU или атрибутам (dscl ... read /Users/<username>).

osquery - хороший инструмент для host-based разведки, часто уже установленный как часть fleet-management (Kolide, FleetDM). Запрос SELECT [I] FROM user_ssh_keys покажет SSH-ключи, SELECT [/I] FROM disk_encryption - статус FileVault, SELECT * FROM browser_plugins - расширения браузера. Низкий профиль: osquery не создаёт новых процессов и не модифицирует файловую систему.

Keychain: доступ к сохранённым учётным данным ([URL='https://attack.mitre.org/techniques/T1555/001/']T1555.001, Credential Access)[/URL]​

macOS Keychain - централизованное хранилище паролей, сертификатов и токенов. Из контекста текущего пользователя security find-generic-password -wa "<service_name>" извлечёт пароль для конкретного сервиса, если у вызывающего процесса есть ACL-разрешение в Keychain. Массовый дамп через security dump-keychain -d потребует подтверждения через GUI-диалог для каждого элемента - тоскливо, но иначе никак. В SSH/headless-сессии без активной GUI-сессии пользователя prompt не появится - команда зависнет или вернёт errSecAuthFailed. Нужна активная пользовательская сессия с разблокированным Keychain.

Когда техника НЕ работает: начиная с macOS Sonoma, Apple усилила интерактивную верификацию при доступе к Keychain. Автоматизированное извлечение без взаимодействия с пользователем стало значительно сложнее. На практике - точечная атака на конкретные записи через имя сервиса, а не попытка массового дампа. Полноценного Mimikatz для Keychain не существует - есть точечные утилиты, но не единый комплексный инструмент.

Plist-файлы конфигурации (T1647, Plist File Modification, Defense Evasion) - ещё один источник данных. defaults read <domain> считывает параметры приложений, а plutil -convert xml1 <file.plist> конвертирует бинарные plist в читаемый XML. Корпоративные VPN-конфигурации, настройки почтовых клиентов и MDM-профили хранятся в plist и могут содержать чувствительные данные.

Persistence на macOS: LaunchAgents, LaunchDaemons и Dylib Hijacking​

[Применимо: внутренний пентест, после foothold и privilege escalation]

Три основных механизма persistence на macOS, каждый с разным уровнем привилегий и заметности.

LaunchAgent (T1543.001, Persistence / Privilege Escalation) запускается в контексте текущего пользователя при логине. Plist-файлы размещаются в ~/Library/LaunchAgents/ (пользовательский) или /Library/LaunchAgents/ (для всех пользователей). Не требует root для пользовательской директории - и это его главное преимущество.

LaunchDaemon (T1543.004, Persistence / Privilege Escalation) запускается от root при загрузке системы. Plist-файлы - в /Library/LaunchDaemons/. Требует root для размещения, но даёт максимальные привилегии.
XML:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>Label</key><string>com.apple.softwareupdateagent</string>
    <key>ProgramArguments</key>
    <array><string>/usr/local/bin/agent</string></array>
    <key>RunAtLoad</key><true/>
    <key>KeepAlive</key><true/>
</dict>
</plist>
По данным Schellman, installer-пакеты (.pkg) позволяют одновременно создать LaunchDaemon (root) и LaunchAgent (пользователь), скопировать payload в целевую директорию и настроить sleep-параметры хоста - всё через postinstall-скрипт. Это делает .pkg самым универсальным вектором для initial access + persistence на macOS в одном флаконе.

Ограничение против EDR: LaunchAgents/LaunchDaemons мониторятся всеми серьёзными endpoint-решениями. CrowdStrike Falcon через Endpoint Security Framework получает нотификации о создании plist-файлов в этих директориях. SentinelOne отслеживает поведенческие аномалии: новый LaunchDaemon с unsigned binary вызовет алерт. Нейминг под легитимные Apple-сервисы (com.apple.*) привлечёт меньше внимания при ручном анализе, но автоматическая корреляция с whitelist реальных сервисов Apple может выдать подделку.

Dylib Hijacking (T1574.004, Persistence / Privilege Escalation / Defense Evasion)​

macOS-приложения загружают динамические библиотеки (.dylib) из путей, указанных в Mach-O заголовке. Если приложение ищет dylib по пути, где файл отсутствует или директория доступна на запись, - вот вам и вектор для hijacking.

Поиск уязвимых приложений: otool -L /path/to/binary покажет все загружаемые dylib. Несуществующий путь или директория с доступом на запись - потенциальная точка внедрения.

Когда техника НЕ работает: приложения из App Store используют Hardened Runtime, который блокирует загрузку dylib из нестандартных путей. Системные приложения защищены SIP. На Apple Silicon AMFI блокирует unsigned dylib - требуется минимум ad-hoc подпись (codesign -s - <dylib>). Техника актуальна для third-party приложений, установленных вне App Store, - их в корпоративной среде обычно хватает.

Lateral movement и evasion: macOS как точка входа в домен​

[Применимо: внутренний пентест, post-exploitation, AD-сопряжённые среды]

Lateral movement из macOS-хоста чаще всего идёт через: SSH (встроенный клиент, ключи в ~/.ssh/), SMB для Windows-хостов (smbclient или impacket), VNC для других маков. Kerberos-тикеты, если macOS в AD-домене, доступны через klist.

Для перемещения в Windows-домен - impacket работает на macOS нативно через Python. Через proxychains можно маршрутизировать трафик через C2-канал Mythic для доступа к внутренним сегментам.

Endpoint Security Framework и обход защиты macOS​

Apple Endpoint Security Framework (ESF) - user-space API, через который EDR получают доступ к событиям файловой системы, процессов, сети и аутентификации. Замена устаревших kext-based механизмов, и главная причина, по которой evasion на macOS стал сложнее за последние пару лет.

ПродуктЧто детектируетСлабые стороны
CrowdStrike FalconProcess injection, persistence plist, unsigned code executionosascript-based execution через allowlist может проходить незамеченным
SentinelOneDylib injection, сетевые аномалии, behavioral analysisПодписанные .pkg с легитимным Developer ID сертификатом
Jamf ProtectTCC-изменения, configuration profiles, macOS-нативные данныеМеньше покрытие сетевого lateral movement

OPSEC-рекомендации при работе с macOS-таргетами:
  • osascript-based payload'ы (apfell в Mythic) оставляют меньше артефактов на файловой системе, чем compiled binary
  • LaunchAgent (пользовательский контекст) реже триггерит алерты, чем LaunchDaemon, но оба мониторятся ESF-based EDR
  • Паттерн curl | bash - антипаттерн: ESF логирует связку network-запрос + exec как единую цепочку. Не надо так
  • Избегайте mass-enumeration через dscl в цикле - пачка однотипных запросов к Directory Services генерирует шум, который видно невооружённым глазом

Инструменты пентеста macOS: trade-off таблица​

Требования к окружению: атакующая машина - Kali Linux или macOS; целевая - macOS 13+ (Ventura/Sonoma/Sequoia) на Apple Silicon или Intel. Mythic C2 требует Docker и минимум 4 GB RAM на сервере. objection требует отключённого SIP на целевом хосте для анализа системных приложений (для third-party - не требует).

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме


Пентест macOS - не нишевая экзотика, а реальность, к которой индустрия не подготовилась. Вижу это на каждом проекте: заказчик уверен, что маки "более безопасны", red team уверен, что macOS "не попадётся" в scope, а в итоге маки стоят без EDR, потому что "они же безопасные". Парадокс: именно этот миф приводит к тому, что macOS-хосты в ряде корпоративных сред остаются без endpoint-защиты вообще.

Инструментарий для macOS offensive security заметно беднее Windows-стека. Полноценного аналога BloodHound для macOS AD-enrolled машин нет - dploot и Mythic-модули покрывают задачу частично. C2-фреймворки с полной поддержкой macOS на Apple Silicon пересчитываются по пальцам одной руки, и Mythic с apfell/poseidon агентами остаётся впереди - остальные либо заброшены, либо поддерживают macOS для галочки.

Прогноз на ближайший год: Apple последовательно ужесточает ESF, TCC и AMFI. Инструменты, которые работали на Monterey, ломаются на Sonoma, а на Sequoia - ещё сильнее. Наступающая сторона проигрывает эту гонку в скорости. Но в реальных корпоративных средах обновления ставятся с задержкой в месяцы - и именно этот зазор остаётся окном для пентестера. Если хочется отработать цепочку от osascript-callback до LaunchDaemon persistence на живом стенде - задачи категории pwn на HackerLab.pro (https://hackerlab.pro) строятся вокруг аналогичных примитивов, только без юридических последствий.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab