На последнем внутреннем пентесте финтех-компании 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"
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
[Применимо: внутренний пентест, 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
[Применимо: внутренний пентест, после получения 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>
Ограничение против 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 Falcon | Process injection, persistence plist, unsigned code execution | osascript-based execution через allowlist может проходить незамеченным |
| SentinelOne | Dylib injection, сетевые аномалии, behavioral analysis | Подписанные .pkg с легитимным Developer ID сертификатом |
| Jamf Protect | TCC-изменения, 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) строятся вокруг аналогичных примитивов, только без юридических последствий.
Последнее редактирование модератором: