macOS Auto Start
Ta sekcja jest w dużej mierze oparta na serii blogów Beyond the good ol' LaunchAgents, celem jest dodanie więcej lokalizacji autostartu (jeśli to możliwe), wskazanie które techniki nadal działają w dzisiejszych czasach z najnowszą wersją macOS (13.4) oraz określenie wymaganych uprawnień.
Sandbox Bypass
Tutaj możesz znaleźć lokalizacje startowe przydatne do sandbox bypass, które pozwalają na proste wykonanie czegoś poprzez zapisanie go do pliku i czekanie na bardzo powszechną akcję, określoną ilość czasu lub akcję, którą zazwyczaj można wykonać z wnętrza sandboxu bez potrzeby posiadania uprawnień roota.
Launchd
Lokalizacje
/Library/LaunchAgents
Wyzwalacz: Restart
Wymagany root
/Library/LaunchDaemons
Wyzwalacz: Restart
Wymagany root
/System/Library/LaunchAgents
Wyzwalacz: Restart
Wymagany root
/System/Library/LaunchDaemons
Wyzwalacz: Restart
Wymagany root
~/Library/LaunchAgents
Wyzwalacz: Ponowne logowanie
~/Library/LaunchDemons
Wyzwalacz: Ponowne logowanie
Jako ciekawostka, launchd
ma wbudowaną listę właściwości w sekcji Mach-o __Text.__config
, która zawiera inne znane usługi, które launchd musi uruchomić. Ponadto, te usługi mogą zawierać RequireSuccess
, RequireRun
i RebootOnSuccess
, co oznacza, że muszą być uruchomione i zakończone pomyślnie.
Oczywiście, nie można ich modyfikować z powodu podpisywania kodu.
Opis i wykorzystanie
launchd
jest pierwszym procesem uruchamianym przez jądro OX S podczas uruchamiania i ostatnim, który kończy działanie podczas zamykania. Zawsze powinien mieć PID 1. Ten proces odczyta i wykona konfiguracje wskazane w ASEP plistach w:
/Library/LaunchAgents
: Agenci dla użytkownika zainstalowani przez administratora/Library/LaunchDaemons
: Demony systemowe zainstalowane przez administratora/System/Library/LaunchAgents
: Agenci dla użytkownika dostarczani przez Apple./System/Library/LaunchDaemons
: Demony systemowe dostarczane przez Apple.
Gdy użytkownik się loguje, plisty znajdujące się w /Users/$USER/Library/LaunchAgents
i /Users/$USER/Library/LaunchDemons
są uruchamiane z uprawnieniami zalogowanego użytkownika.
Główna różnica między agentami a demonami polega na tym, że agenci są ładowani, gdy użytkownik się loguje, a demony są ładowane podczas uruchamiania systemu (ponieważ są usługi takie jak ssh, które muszą być uruchamiane przed tym, jak jakikolwiek użytkownik uzyska dostęp do systemu). Ponadto agenci mogą korzystać z GUI, podczas gdy demony muszą działać w tle.
Są przypadki, w których agent musi być uruchomiony przed zalogowaniem się użytkownika, nazywane są PreLoginAgents. Na przykład, jest to przydatne do zapewnienia technologii wspomagającej podczas logowania. Można je również znaleźć w /Library/LaunchAgents
(zobacz tutaj przykład).
Nowe pliki konfiguracyjne Daemonów lub Agentów będą ładowane po następnym uruchomieniu lub przy użyciu launchctl load <target.plist>
Można również załadować pliki .plist bez tego rozszerzenia za pomocą launchctl -F <file>
(jednak te pliki plist nie będą automatycznie ładowane po uruchomieniu).
Można również odłączyć za pomocą launchctl unload <target.plist>
(proces wskazany przez niego zostanie zakończony),
Aby upewnić się, że nie ma niczego (jak nadpisanie) zapobiegającego uruchomieniu Agenta lub Daemona, uruchom: sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist
Wylistuj wszystkie agenty i demony załadowane przez bieżącego użytkownika:
Jeśli plist jest własnością użytkownika, nawet jeśli znajduje się w systemowych folderach demona, zadanie zostanie wykonane jako użytkownik a nie jako root. Może to zapobiec niektórym atakom eskalacji uprawnień.
Więcej informacji o launchd
launchd
jest pierwszym procesem w trybie użytkownika, który jest uruchamiany z jądra. Uruchomienie procesu musi być udane i nie może zakończyć się błędem ani awarią. Jest nawet chronione przed niektórymi sygnałami zabicia.
Jedną z pierwszych rzeczy, które launchd
zrobi, jest uruchomienie wszystkich demonów, takich jak:
Demony czasowe oparte na czasie do wykonania:
atd (
com.apple.atrun.plist
): MaStartInterval
wynoszący 30 minutcrond (
com.apple.systemstats.daily.plist
): MaStartCalendarInterval
, aby uruchomić o 00:15Demony sieciowe takie jak:
org.cups.cups-lpd
: Nasłuchuje w TCP (SockType: stream
) zSockServiceName: printer
SockServiceName musi być portem lub usługą z
/etc/services
com.apple.xscertd.plist
: Nasłuchuje na TCP na porcie 1640Demony ścieżkowe, które są uruchamiane, gdy zmienia się określona ścieżka:
com.apple.postfix.master
: Sprawdza ścieżkę/etc/postfix/aliases
Demony powiadomień IOKit:
com.apple.xartstorageremoted
:"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...
Port Mach:
com.apple.xscertd-helper.plist
: Wskazuje w wpisieMachServices
nazwęcom.apple.xscertd.helper
UserEventAgent:
To różni się od poprzedniego. Sprawia, że launchd uruchamia aplikacje w odpowiedzi na określone zdarzenie. Jednak w tym przypadku główny binarny plik zaangażowany to nie
launchd
, ale/usr/libexec/UserEventAgent
. Ładuje wtyczki z folderu ograniczonego przez SIP /System/Library/UserEventPlugins/, gdzie każda wtyczka wskazuje swój inicjalizator w kluczuXPCEventModuleInitializer
lub, w przypadku starszych wtyczek, w słownikuCFPluginFactories
pod kluczemFB86416D-6164-2070-726F-70735C216EC0
w swoimInfo.plist
.
pliki startowe powłoki
Writeup: https://theevilbit.github.io/beyond/beyond_0001/ Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/
Przydatne do obejścia piaskownicy: ✅
Obejście TCC: ✅
Ale musisz znaleźć aplikację z obejściem TCC, która uruchamia powłokę ładującą te pliki
Lokalizacje
~/.zshrc
,~/.zlogin
,~/.zshenv.zwc
,~/.zshenv
,~/.zprofile
Wyzwalacz: Otwórz terminal z zsh
/etc/zshenv
,/etc/zprofile
,/etc/zshrc
,/etc/zlogin
Wyzwalacz: Otwórz terminal z zsh
Wymagany root
~/.zlogout
Wyzwalacz: Wyjdź z terminala z zsh
/etc/zlogout
Wyzwalacz: Wyjdź z terminala z zsh
Wymagany root
Potencjalnie więcej w:
man zsh
~/.bashrc
Wyzwalacz: Otwórz terminal z bash
/etc/profile
(nie działa)~/.profile
(nie działa)~/.xinitrc
,~/.xserverrc
,/opt/X11/etc/X11/xinit/xinitrc.d/
Wyzwalacz: Oczekiwano, że wyzwoli się z xterm, ale nie jest zainstalowany i nawet po zainstalowaniu pojawia się ten błąd: xterm:
DISPLAY is not set
Opis i wykorzystanie
Podczas inicjowania środowiska powłoki, takiego jak zsh
lub bash
, uruchamiane są określone pliki startowe. macOS obecnie używa /bin/zsh
jako domyślnej powłoki. Ta powłoka jest automatycznie dostępna, gdy aplikacja Terminal jest uruchamiana lub gdy urządzenie jest dostępne przez SSH. Chociaż bash
i sh
są również obecne w macOS, muszą być wyraźnie wywołane, aby mogły być używane.
Strona podręczna zsh, którą możemy przeczytać za pomocą man zsh
, ma długi opis plików startowych.
Ponownie otwarte aplikacje
Konfigurowanie wskazanej eksploatacji oraz wylogowanie się i zalogowanie lub nawet ponowne uruchomienie nie zadziałało dla mnie, aby uruchomić aplikację. (Aplikacja nie była uruchamiana, może musi być uruchomiona, gdy te działania są wykonywane)
Opis: https://theevilbit.github.io/beyond/beyond_0021/
Lokalizacja
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Wyzwalacz: Ponowne uruchomienie otwierających się aplikacji
Opis i eksploatacja
Wszystkie aplikacje do ponownego otwarcia znajdują się w pliku plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Aby sprawić, by ponownie otwierane aplikacje uruchamiały twoją, wystarczy dodać swoją aplikację do listy.
UUID można znaleźć, wylistowując ten katalog lub używając ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
Aby sprawdzić aplikacje, które będą ponownie otwierane, możesz to zrobić:
Aby dodać aplikację do tej listy możesz użyć:
Preferencje Terminala
Przydatne do obejścia piaskownicy: ✅
Obejście TCC: ✅
Terminal używa uprawnień FDA użytkownika, który go używa
Lokalizacja
~/Library/Preferences/com.apple.Terminal.plist
Wyzwalacz: 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 przy uruchomieniu:
Ta konfiguracja jest odzwierciedlona w pliku ~/Library/Preferences/com.apple.Terminal.plist
w ten sposób:
Więc, jeśli plist preferencji terminala w systemie mógłby być nadpisany, to funkcjonalność open
może być użyta do otwarcia terminala i wykonania tego polecenia.
Możesz to dodać z poziomu cli za pomocą:
Skrypty terminala / Inne rozszerzenia plików
Przydatne do obejścia piaskownicy: ✅
Obejście TCC: ✅
Użycie terminala do uzyskania uprawnień FDA użytkownika
Lokalizacja
Gdziekolwiek
Wyzwalacz: Otwórz Terminal
Opis i wykorzystanie
Jeśli stworzysz .terminal
skrypt i go otworzysz, aplikacja Terminal zostanie automatycznie wywołana do wykonania wskazanych tam poleceń. Jeśli aplikacja Terminal ma jakieś specjalne uprawnienia (takie jak TCC), twoje polecenie zostanie wykonane z tymi specjalnymi uprawnieniami.
Spróbuj z:
Możesz również użyć rozszerzeń .command
, .tool
, z zawartością zwykłych skryptów powłoki, a będą one również otwierane przez Terminal.
Jeśli terminal ma Pełny dostęp do dysku, będzie w stanie wykonać tę akcję (zauważ, że wykonana komenda będzie widoczna w oknie terminala).
Wtyczki audio
Writeup: https://theevilbit.github.io/beyond/beyond_0013/ Writeup: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
Lokalizacja
/Library/Audio/Plug-Ins/HAL
Wymagane uprawnienia roota
Wyzwalacz: Uruchom ponownie coreaudiod lub komputer
/Library/Audio/Plug-ins/Components
Wymagane uprawnienia roota
Wyzwalacz: Uruchom ponownie coreaudiod lub komputer
~/Library/Audio/Plug-ins/Components
Wyzwalacz: Uruchom ponownie coreaudiod lub komputer
/System/Library/Components
Wymagane uprawnienia roota
Wyzwalacz: Uruchom ponownie coreaudiod lub komputer
Opis
Zgodnie z wcześniejszymi opisami możliwe jest kompilowanie niektórych wtyczek audio i załadowanie ich.
Wtyczki QuickLook
Writeup: https://theevilbit.github.io/beyond/beyond_0028/
Lokalizacja
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
Opis i wykorzystanie
Wtyczki QuickLook mogą być wykonywane, gdy wyzwolisz podgląd pliku (naciśnij spację z wybranym plikiem w Finderze) i zainstalowana jest wtyczka obsługująca ten typ pliku.
Możliwe jest skompilowanie własnej wtyczki QuickLook, umieszczenie jej w jednej z wcześniejszych lokalizacji, aby ją załadować, a następnie przejście do obsługiwanego pliku i naciśnięcie spacji, aby ją wyzwolić.
Hooki logowania/wylogowania
To nie zadziałało dla mnie, ani z LoginHook użytkownika, ani z LogoutHook roota
Writeup: https://theevilbit.github.io/beyond/beyond_0022/
Lokalizacja
Musisz być w stanie wykonać coś takiego jak
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
Lo
kowane w~/Library/Preferences/com.apple.loginwindow.plist
Są przestarzałe, ale mogą być używane do wykonywania poleceń, gdy użytkownik się loguje.
To ustawienie jest przechowywane w /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
Aby to usunąć:
Użytkownik root jest przechowywany w /private/var/root/Library/Preferences/com.apple.loginwindow.plist
Warunkowe Ominięcie Sandboxa
Tutaj możesz znaleźć lokalizacje startowe przydatne do ominięcia sandboxa, które pozwalają na proste wykonanie czegoś poprzez zapisanie tego do pliku i oczekiwanie na niezbyt powszechne warunki, takie jak konkretne zainstalowane programy, "niezwykłe" działania użytkownika lub środowiska.
Cron
Opis: https://theevilbit.github.io/beyond/beyond_0004/
Przydatne do ominięcia sandboxa: ✅
Jednak musisz mieć możliwość wykonania binarnego pliku
crontab
Lub być rootem
Ominięcie TCC: 🔴
Lokalizacja
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
Wymagany root do bezpośredniego dostępu do zapisu. Nie jest wymagany root, jeśli możesz wykonać
crontab <file>
Wyzwalacz: Zależy od zadania cron
Opis i Wykorzystanie
Wylistuj zadania cron bieżącego użytkownika za pomocą:
Możesz również zobaczyć wszystkie zadania cron użytkowników w /usr/lib/cron/tabs/
i /var/at/tabs/
(wymaga uprawnień roota).
W MacOS można znaleźć kilka folderów wykonujących skrypty z określoną częstotliwością w:
Można tam znaleźć regularne cron zadania, at zadania (niezbyt używane) oraz okresowe zadania (głównie używane do czyszczenia plików tymczasowych). Codzienne okresowe zadania można wykonać na przykład za pomocą: periodic daily
.
Aby dodać zadanie cron użytkownika programowo, można użyć:
iTerm2
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
Locations
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
Trigger: Otwórz iTerm
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
Trigger: Otwórz iTerm
~/Library/Preferences/com.googlecode.iterm2.plist
Trigger: Otwórz iTerm
Description & Exploitation
Skrypty przechowywane w ~/Library/Application Support/iTerm2/Scripts/AutoLaunch
będą wykonywane. Na przykład:
lub:
Skrypt ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
również zostanie wykonany:
Preferencje iTerm2 znajdujące się w ~/Library/Preferences/com.googlecode.iterm2.plist
mogą wskazywać polecenie do wykonania po otwarciu terminala iTerm2.
To ustawienie można skonfigurować w ustawieniach iTerm2:
A polecenie jest odzwierciedlone w preferencjach:
Możesz ustawić polecenie do wykonania za pomocą:
Wysoce prawdopodobne, że istnieją inne sposoby nadużycia preferencji iTerm2 do wykonywania dowolnych poleceń.
xbar
Writeup: https://theevilbit.github.io/beyond/beyond_0007/
Przydatne do obejścia sandbox: ✅
Ale xbar musi być zainstalowany
Obejście TCC: ✅
Wymaga uprawnień dostępu do funkcji ułatwień dostępu
Lokalizacja
~/Library/Application\ Support/xbar/plugins/
Wyzwalacz: Po uruchomieniu xbar
Opis
Jeśli popularny program xbar jest zainstalowany, możliwe jest napisanie skryptu powłoki w ~/Library/Application\ Support/xbar/plugins/
, który zostanie wykonany po uruchomieniu xbar:
Hammerspoon
Writeup: https://theevilbit.github.io/beyond/beyond_0008/
Przydatne do obejścia sandbox: ✅
Ale Hammerspoon musi być zainstalowany
Obejście TCC: ✅
Wymaga uprawnień dostępu
Location
~/.hammerspoon/init.lua
Trigger: Po uruchomieniu hammerspoon
Description
Hammerspoon służy jako platforma automatyzacji dla macOS, wykorzystując język skryptowy LUA do swoich operacji. Co ważne, wspiera integrację pełnego kodu AppleScript oraz wykonywanie skryptów powłoki, znacznie zwiększając swoje możliwości skryptowe.
Aplikacja szuka pojedynczego pliku, ~/.hammerspoon/init.lua
, a po uruchomieniu skrypt zostanie wykonany.
BetterTouchTool
Przydatne do obejścia sandbox: ✅
Ale BetterTouchTool musi być zainstalowane
Obejś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, gdy naciśnięte zostaną niektóre skróty. Atakujący może skonfigurować własny skrót i akcję do wykonania w bazie danych, aby uruchomić dowolny kod (skrót może polegać po prostu na naciśnięciu klawisza).
Alfred
Przydatne do obejścia sandbox: ✅
Ale Alfred musi być zainstalowany
Obejście TCC: ✅
Wymaga uprawnień do Automatyzacji, Dostępności, a nawet Pełnego Dostępu do Dysku
Lokalizacja
???
Pozwala tworzyć przepływy pracy, które mogą wykonywać kod, gdy spełnione są określone warunki. Potencjalnie atakujący może stworzyć plik przepływu pracy i sprawić, by Alfred go załadował (konieczne jest opłacenie wersji premium, aby korzystać z przepływów pracy).
SSHRC
Writeup: https://theevilbit.github.io/beyond/beyond_0006/
Przydatne do obejścia sandbox: ✅
Ale ssh musi być włączone i używane
Obejście TCC: ✅
SSH używał dostępu FDA
Lokalizacja
~/.ssh/rc
Wyzwalacz: Logowanie przez ssh
/etc/ssh/sshrc
Wymagany root
Wyzwalacz: Logowanie przez ssh
Aby włączyć ssh, wymagany jest Pełny Dostęp do Dysku:
Opis i 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
będą wykonywane.
Elementy logowania
Artykuł: https://theevilbit.github.io/beyond/beyond_0003/
Lokalizacje
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
Wyzwalacz: Logowanie
Payload exploita przechowywany wywołując
osascript
/var/db/com.apple.xpc.launchd/loginitems.501.plist
Wyzwalacz: Logowanie
Wymagane uprawnienia roota
Opis
W Preferencjach systemowych -> Użytkownicy i grupy -> Elementy logowania możesz znaleźć elementy do wykonania, gdy użytkownik się loguje. Możliwe jest ich wylistowanie, dodawanie i usuwanie z linii poleceń:
Te elementy są przechowywane w pliku ~/Library/Application Support/com.apple.backgroundtaskmanagementagent
Elementy logowania mogą również być wskazane przy użyciu API SMLoginItemSetEnabled, które przechowa konfigurację w /var/db/com.apple.xpc.launchd/loginitems.501.plist
ZIP jako Element Logowania
(Sprawdź poprzednią sekcję o Elementach Logowania, to jest 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 domyślnie tworzony) i plist zostanie dodany, więc następnym razem, gdy użytkownik się zaloguje, tylne drzwi wskazane w plist zostaną uruchomione.
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 by działała.
At
Opis: https://theevilbit.github.io/beyond/beyond_0014/
Lokalizacja
Musisz wykonać
at
i musi być włączone
Opis
Zadania at
są zaprojektowane do planowania jednorazowych zadań do wykonania w określonych czasach. W przeciwieństwie do zadań cron, zadania at
są automatycznie usuwane po wykonaniu. Ważne jest, aby zauważyć, że te zadania są trwałe po ponownym uruchomieniu systemu, co czyni je potencjalnymi zagrożeniami dla bezpieczeństwa w określonych warunkach.
Domyślnie są wyłączone, ale użytkownik root może je włączyć za pomocą:
To stworzy plik za 1 godzinę:
Sprawdź kolejkę zadań za pomocą atq:
Powyżej widzimy dwa zaplanowane zadania. Możemy wydrukować szczegóły zadania używając at -c JOBNUMBER
Jeśli zadania AT nie są włączone, utworzone zadania nie będą wykonywane.
Pliki zadania można znaleźć w /private/var/at/jobs/
The filename contains the queue, the job number, and the time it’s scheduled to run. For example let’s take a loot at a0001a019bdcd2
.
a
- to jest kolejka0001a
- numer zadania w hex,0x1a = 26
019bdcd2
- czas w hex. Reprezentuje minuty, które upłynęły od epoki.0x019bdcd2
to26991826
w systemie dziesiętnym. Jeśli pomnożymy to przez 60, otrzymujemy1619509560
, co odpowiadaGMT: 2021. April 27., Tuesday 7:46:00
.
If we print the job file, we find that it contains the same information we got using at -c
.
Folder Actions
Writeup: https://theevilbit.github.io/beyond/beyond_0024/ Writeup: https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d
Useful to bypass sandbox: ✅
Ale musisz być w stanie wywołać
osascript
z argumentami, aby skontaktować się zSystem Events
, aby skonfigurować Folder ActionsTCC bypass: 🟠
Ma podstawowe uprawnienia TCC, takie jak Pulpit, Dokumenty i Pobrane
Location
/Library/Scripts/Folder Action Scripts
Wymagane uprawnienia roota
Trigger: Dostęp do określonego folderu
~/Library/Scripts/Folder Action Scripts
Trigger: Dostęp do określonego folderu
Description & Exploitation
Folder Actions to skrypty automatycznie wyzwalane przez zmiany w folderze, takie jak dodawanie, usuwanie elementów lub inne działania, takie jak otwieranie lub zmiana rozmiaru okna folderu. Te działania mogą być wykorzystywane do różnych zadań i mogą być wyzwalane na różne sposoby, takie jak użycie interfejsu Finder lub poleceń terminala.
Aby skonfigurować Folder Actions, masz opcje takie jak:
Tworzenie przepływu pracy Folder Action za pomocą Automator i zainstalowanie go jako usługi.
Ręczne dołączenie skryptu za pomocą ustawień Folder Actions w menu kontekstowym folderu.
Wykorzystanie OSAScript do wysyłania wiadomości Apple Event do
System Events.app
w celu programowego skonfigurowania Folder Action.
Ta metoda jest szczególnie przydatna do osadzenia akcji w systemie, oferując poziom trwałości.
The following script is an example of what can be executed by a Folder Action:
Aby uczynić powyższy skrypt użytecznym dla Akcji Folderów, skompiluj go używając:
Po skompilowaniu skryptu, skonfiguruj akcje folderów, wykonując poniższy skrypt. Ten skrypt włączy akcje folderów globalnie i szczególnie przypnie wcześniej skompilowany skrypt do folderu Pulpit.
Uruchom skrypt konfiguracyjny za pomocą:
To jest sposób na wdrożenie tej trwałości za pomocą GUI:
To jest skrypt, który zostanie wykonany:
Skopiuj to za pomocą: osacompile -l JavaScript -o folder.scpt source.js
Przenieś to do:
Następnie otwórz aplikację Folder Actions Setup
, wybierz folder, który chcesz obserwować i wybierz w swoim przypadku folder.scpt
(w moim przypadku nazwałem to output2.scp):
Teraz, jeśli otworzysz ten folder w Finder, twój skrypt zostanie wykonany.
Ta konfiguracja została zapisana w plist znajdującym się w ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
w formacie base64.
Teraz spróbujmy przygotować tę persistencję bez dostępu do GUI:
Skopiuj
~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
do/tmp
, aby go zbackupować:
cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp
Usuń Folder Actions, które właśnie ustawiłeś:
Teraz, gdy mamy puste środowisko
Skopiuj plik zapasowy:
cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/
Otwórz Folder Actions Setup.app, aby wykorzystać tę konfigurację:
open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"
I to nie zadziałało dla mnie, ale to są instrukcje z opisu:(
Skróty Dock
Opis: https://theevilbit.github.io/beyond/beyond_0027/
Przydatne do obejścia sandbox: ✅
Ale musisz mieć zainstalowaną złośliwą aplikację w systemie
Obejście TCC: 🔴
Lokalizacja
~/Library/Preferences/com.apple.dock.plist
Wyzwalacz: Gdy użytkownik kliknie na aplikację w docku
Opis i Eksploatacja
Wszystkie aplikacje, które pojawiają się w Docku, są określone w plist: ~/Library/Preferences/com.apple.dock.plist
Możliwe jest dodanie aplikacji tylko za pomocą:
Używając pewnych techniki inżynierii społecznej, możesz udawać na przykład Google Chrome w docku i faktycznie wykonać swój własny skrypt:
Wybieracze kolorów
Writeup: https://theevilbit.github.io/beyond/beyond_0017
Przydatne do obejścia piaskownicy: 🟠
Musi się zdarzyć bardzo specyficzna akcja
Zakończysz w innej piaskownicy
Obejście TCC: 🔴
Lokalizacja
/Library/ColorPickers
Wymagane uprawnienia roota
Wyzwalacz: Użyj wybieracza kolorów
~/Library/ColorPickers
Wyzwalacz: Użyj wybieracza kolorów
Opis i Eksploatacja
Skompiluj pakiet wybieracza kolorów z własnym kodem (możesz użyć tego na przykład) i dodaj konstruktor (jak w sekcji Wygaszacz ekranu) i skopiuj pakiet do ~/Library/ColorPickers
.
Następnie, gdy wybieracz kolorów zostanie wyzwolony, twój kod również powinien się uruchomić.
Zauważ, że binarny plik ładujący twoją bibliotekę ma bardzo restrykcyjną piaskownicę: /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64
Wtyczki synchronizacji Findera
Opis: https://theevilbit.github.io/beyond/beyond_0026/ Opis: https://objective-see.org/blog/blog_0x11.html
Przydatne do obejścia piaskownicy: Nie, ponieważ musisz uruchomić swoją własną aplikację
Obejście TCC: ???
Lokalizacja
Konkretna aplikacja
Opis i Eksploatacja
Przykład aplikacji z rozszerzeniem synchronizacji Findera można znaleźć tutaj.
Aplikacje mogą mieć Rozszerzenia synchronizacji Findera
. To rozszerzenie wejdzie do aplikacji, która będzie uruchamiana. Co więcej, aby rozszerzenie mogło wykonać swój kod, musi być podpisane ważnym certyfikatem dewelopera Apple, musi być piaskowniczone (chociaż mogą być dodane luźne wyjątki) i musi być zarejestrowane w czymś takim jak:
Wygaszacz ekranu
Writeup: https://theevilbit.github.io/beyond/beyond_0016/ Writeup: https://posts.specterops.io/saving-your-access-d562bf5bf90b
Lokalizacja
/System/Library/Screen Savers
Wymagane uprawnienia roota
Wyzwalacz: Wybierz wygaszacz ekranu
/Library/Screen Savers
Wymagane uprawnienia roota
Wyzwalacz: Wybierz wygaszacz ekranu
~/Library/Screen Savers
Wyzwalacz: Wybierz wygaszacz ekranu
Opis i Eksploatacja
Utwórz nowy projekt w Xcode i wybierz szablon do generowania nowego Wygaszacza ekranu. Następnie dodaj swój kod, na przykład poniższy kod do generowania logów.
Zbuduj go i skopiuj pakiet .saver
do ~/Library/Screen Savers
. Następnie otwórz GUI wygaszacza ekranu i po prostu na niego kliknij, powinno to wygenerować wiele logów:
Zauważ, że ponieważ wewnątrz uprawnień binarnego pliku, który ładuje ten kod (/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver
), możesz znaleźć com.apple.security.app-sandbox
, będziesz wewnątrz wspólnego piaskownicy aplikacji.
Kod oszczędzacza:
Spotlight Plugins
writeup: https://theevilbit.github.io/beyond/beyond_0011/
Przydatne do obejścia piaskownicy: 🟠
Ale skończysz w piaskownicy aplikacji
Obejście TCC: 🔴
Piaskownica wydaje się bardzo ograniczona
Location
~/Library/Spotlight/
Trigger: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
/Library/Spotlight/
Trigger: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
Wymagane uprawnienia roota
/System/Library/Spotlight/
Trigger: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
Wymagane uprawnienia roota
Some.app/Contents/Library/Spotlight/
Trigger: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
Wymagana nowa aplikacja
Description & Exploitation
Spotlight to wbudowana funkcja wyszukiwania w macOS, zaprojektowana w celu zapewnienia użytkownikom szybkiego i kompleksowego dostępu do danych na ich komputerach. Aby ułatwić tę szybką zdolność wyszukiwania, Spotlight utrzymuje własną bazę danych i tworzy indeks poprzez analizowanie większości plików, co umożliwia szybkie wyszukiwanie zarówno po nazwach plików, jak i ich zawartości.
Podstawowy mechanizm Spotlight obejmuje centralny proces nazwany 'mds', co oznacza 'serwer metadanych'. Proces ten koordynuje całą usługę Spotlight. Uzupełniają go liczne demony 'mdworker', które wykonują różnorodne zadania konserwacyjne, takie jak indeksowanie różnych typów plików (ps -ef | grep mdworker
). Te zadania są możliwe dzięki wtyczkom importera Spotlight, czyli ".mdimporter bundles", które umożliwiają Spotlight zrozumienie i indeksowanie zawartości w różnych formatach plików.
Wtyczki lub .mdimporter
bundles znajdują się w wcześniej wymienionych miejscach, a jeśli pojawi się nowy bundle, jest ładowany w ciągu minuty (nie ma potrzeby ponownego uruchamiania żadnej usługi). Te bundle muszą wskazywać, które typy plików i rozszerzenia mogą obsługiwać, w ten sposób Spotlight będzie ich używać, gdy zostanie utworzony nowy plik z wskazanym rozszerzeniem.
Możliwe jest znalezienie wszystkich mdimporters
załadowanych w trakcie działania:
A na przykład /Library/Spotlight/iBooksAuthor.mdimporter jest używane do analizowania tego typu plików (rozszerzenia .iba
i .book
oraz innych):
Jeśli sprawdzisz Plist innych mdimporter
, możesz nie znaleźć wpisu UTTypeConformsTo
. To dlatego, że jest to wbudowany Uniform Type Identifiers (UTI) i nie trzeba określać rozszerzeń.
Ponadto, domyślne wtyczki systemowe zawsze mają pierwszeństwo, więc atakujący może uzyskać dostęp tylko do plików, które nie są w inny sposób indeksowane przez własne mdimporters
Apple'a.
Aby stworzyć własny importer, możesz zacząć od tego projektu: https://github.com/megrimm/pd-spotlight-importer i następnie zmienić nazwę, CFBundleDocumentTypes
oraz dodać UTImportedTypeDeclarations
, aby obsługiwał rozszerzenie, które chcesz wspierać i odzwierciedlić je w schema.xml
.
Następnie zmień kod funkcji GetMetadataForFile
, aby wykonać swój ładunek, gdy plik z przetwarzanym rozszerzeniem zostanie utworzony.
Na koniec zbuduj i skopiuj swój nowy .mdimporter
do jednej z wcześniejszych lokalizacji i możesz sprawdzić, czy jest załadowany monitorując logi lub sprawdzając mdimport -L.
Panele preferencji
Nie wygląda na to, że to już działa.
Opis: https://theevilbit.github.io/beyond/beyond_0009/
Lokalizacja
/System/Library/PreferencePanes
/Library/PreferencePanes
~/Library/PreferencePanes
Opis
Nie wygląda na to, że to już działa.
Obejście piaskownicy Root
Tutaj możesz znaleźć lokalizacje startowe przydatne do obejścia piaskownicy, które pozwala na proste wykonanie czegoś przez zapisanie go do pliku będąc rootem i/lub wymagając inne dziwne warunki.
Okresowe
Opis: https://theevilbit.github.io/beyond/beyond_0019/
Lokalizacja
/etc/periodic/daily
,/etc/periodic/weekly
,/etc/periodic/monthly
,/usr/local/etc/periodic
Wymagany root
Wyzwalacz: Gdy nadejdzie czas
/etc/daily.local
,/etc/weekly.local
lub/etc/monthly.local
Wymagany root
Wyzwalacz: Gdy nadejdzie czas
Opis i wykorzystanie
Skrypty okresowe (/etc/periodic
) są wykonywane z powodu demonów uruchamiających skonfigurowanych w /System/Library/LaunchDaemons/com.apple.periodic*
. Zauważ, że skrypty przechowywane w /etc/periodic/
są wykonywane jako właściciel pliku, więc to nie zadziała w przypadku potencjalnego eskalacji uprawnień.
Istnieją inne skrypty okresowe, które będą wykonywane, wskazane w /etc/defaults/periodic.conf
:
Jeśli uda ci się napisać którykolwiek z plików /etc/daily.local
, /etc/weekly.local
lub /etc/monthly.local
, zostanie on wykonany prędzej czy później.
Zauważ, że skrypt okresowy będzie wykonywany jako właściciel skryptu. Więc jeśli zwykły użytkownik jest właścicielem skryptu, zostanie on wykonany jako ten użytkownik (może to zapobiec atakom eskalacji uprawnień).
PAM
Writeup: Linux Hacktricks PAM Writeup: https://theevilbit.github.io/beyond/beyond_0005/
Lokalizacja
Root zawsze wymagany
Opis i Eksploatacja
Ponieważ PAM jest bardziej skoncentrowany na utrzymywaniu i złośliwym oprogramowaniu niż na łatwym wykonywaniu w macOS, ten blog nie poda szczegółowego wyjaśnienia, przeczytaj writeupy, aby lepiej zrozumieć tę technikę.
Sprawdź moduły PAM za pomocą:
Technika utrzymywania/podnoszenia uprawnień wykorzystująca PAM jest tak prosta, jak modyfikacja modułu /etc/pam.d/sudo, dodając na początku linię:
Więc będzie to wyglądać mniej więcej tak:
I dlatego każda próba użycia sudo
zadziała.
Zauważ, że ten katalog jest chroniony przez TCC, więc jest bardzo prawdopodobne, że użytkownik otrzyma monit o dostęp.
Inny ładny przykład to su, gdzie możesz zobaczyć, że również możliwe jest przekazywanie parametrów do modułów PAM (i możesz również wprowadzić backdoora do tego pliku):
Authorization Plugins
Writeup: https://theevilbit.github.io/beyond/beyond_0028/ Writeup: https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65
Przydatne do obejścia sandbox: 🟠
Ale musisz być rootem i wykonać dodatkowe konfiguracje
Obejście TCC: ???
Location
/Library/Security/SecurityAgentPlugins/
Wymagany root
Konieczne jest również skonfigurowanie bazy danych autoryzacji, aby używała wtyczki
Description & Exploitation
Możesz stworzyć wtyczkę autoryzacyjną, która będzie wykonywana, gdy użytkownik się loguje, aby utrzymać persistencję. Aby uzyskać więcej informacji na temat tego, jak stworzyć jedną z tych wtyczek, sprawdź wcześniejsze opisy (i bądź ostrożny, źle napisana może zablokować dostęp i będziesz musiał oczyścić swojego maca z trybu odzyskiwania).
Przenieś pakiet do lokalizacji, która ma być załadowana:
Na koniec dodaj regułę do załadowania tego Pluginu:
evaluate-mechanisms
powie ramce autoryzacji, że będzie musiała wywołać zewnętrzny mechanizm do autoryzacji. Ponadto, privileged
sprawi, że zostanie wykonane przez root.
Wywołaj to za pomocą:
A następnie grupa staff powinna mieć dostęp sudo (przeczytaj /etc/sudoers
, aby potwierdzić).
Man.conf
Writeup: https://theevilbit.github.io/beyond/beyond_0030/
Lokalizacja
/private/etc/man.conf
Wymagany root
/private/etc/man.conf
: Kiedy man jest używany
Opis i Eksploatacja
Plik konfiguracyjny /private/etc/man.conf
wskazuje binarny/skrypt do użycia podczas otwierania plików dokumentacji man. Ścieżka do wykonywalnego pliku może być zmodyfikowana, więc za każdym razem, gdy użytkownik używa man do czytania dokumentów, wykonywana jest tylna furtka.
Na przykład ustawione w /private/etc/man.conf
:
A następnie utwórz /tmp/view
jako:
Apache2
Writeup: https://theevilbit.github.io/beyond/beyond_0023/
Przydatne do obejścia piaskownicy: 🟠
Ale musisz być rootem, a apache musi być uruchomiony
Obejście TCC: 🔴
Httpd nie ma uprawnień
Location
/etc/apache2/httpd.conf
Wymagany root
Wyzwalacz: Gdy Apache2 jest uruchamiany
Description & Exploit
Możesz wskazać w /etc/apache2/httpd.conf
, aby załadować moduł, dodając linię taką jak:
W ten sposób twoje skompilowane moduły będą ładowane przez Apache. Jedyną rzeczą jest to, że musisz podpisać to ważnym certyfikatem Apple, lub musisz dodać nowy zaufany certyfikat w systemie i podpisać to nim.
Następnie, jeśli to konieczne, aby upewnić się, że serwer zostanie uruchomiony, możesz wykonać:
Przykład kodu dla Dylb:
BSM audit framework
Writeup: https://theevilbit.github.io/beyond/beyond_0031/
Przydatne do obejścia sandbox: 🟠
Ale musisz być root, auditd musi działać i spowodować ostrzeżenie
Obejście TCC: 🔴
Location
/etc/security/audit_warn
Wymagany root
Wyzwalacz: Gdy auditd wykryje ostrzeżenie
Description & Exploit
Kiedy auditd wykryje ostrzeżenie, skrypt /etc/security/audit_warn
jest wykonywany. Możesz więc dodać swój ładunek do niego.
Możesz wymusić ostrzeżenie za pomocą sudo audit -n
.
Elementy uruchamiania
To jest przestarzałe, więc nic nie powinno być znalezione w tych katalogach.
StartupItem to katalog, który powinien znajdować się w /Library/StartupItems/
lub /System/Library/StartupItems/
. Po utworzeniu tego katalogu, musi on zawierać dwa konkretne pliki:
skrypt rc: Skrypt powłoki wykonywany podczas uruchamiania.
plik plist, nazwany
StartupParameters.plist
, który zawiera różne ustawienia konfiguracyjne.
Upewnij się, że zarówno skrypt rc, jak i plik StartupParameters.plist
są poprawnie umieszczone w katalogu StartupItem, aby proces uruchamiania mógł je rozpoznać i wykorzystać.
emond
Nie mogę znaleźć tego komponentu w moim macOS, więc po więcej informacji sprawdź opis
Opis: https://theevilbit.github.io/beyond/beyond_0023/
Wprowadzony przez Apple, emond to mechanizm logowania, który wydaje się być niedorozwinięty lub być może porzucony, jednak pozostaje dostępny. Chociaż nie jest szczególnie korzystny dla administratora Maca, ta niejasna usługa może służyć jako subtelna metoda utrzymywania się dla aktorów zagrożeń, prawdopodobnie niezauważona przez większość administratorów macOS.
Dla tych, którzy są świadomi jej istnienia, identyfikacja jakiegokolwiek złośliwego użycia emond jest prosta. LaunchDaemon systemu dla tej usługi poszukuje skryptów do wykonania w jednym katalogu. Aby to sprawdzić, można użyć następującego polecenia:
XQuartz
Writeup: https://theevilbit.github.io/beyond/beyond_0018/
Location
/opt/X11/etc/X11/xinit/privileged_startx.d
Wymagane uprawnienia roota
Wyzwalacz: Z XQuartz
Description & Exploit
XQuartz nie jest już zainstalowany w macOS, więc jeśli chcesz więcej informacji, sprawdź opis.
kext
Instalacja kext, nawet jako root, jest tak skomplikowana, że nie będę tego rozważać jako sposobu na ucieczkę z piaskownic ani nawet dla trwałości (chyba że masz exploit)
Location
Aby zainstalować KEXT jako element startowy, musi być zainstalowany w jednej z następujących lokalizacji:
/System/Library/Extensions
Pliki KEXT wbudowane w system operacyjny OS X.
/Library/Extensions
Pliki KEXT zainstalowane przez oprogramowanie firm trzecich
Możesz wylistować aktualnie załadowane pliki kext za pomocą:
For more information about kernel extensions check this section.
amstoold
Writeup: https://theevilbit.github.io/beyond/beyond_0029/
Location
/usr/local/bin/amstoold
Wymagane uprawnienia roota
Description & Exploitation
Najwyraźniej plist
z /System/Library/LaunchAgents/com.apple.amstoold.plist
używał tego binarnego pliku, jednocześnie eksponując usługę XPC... problem polega na tym, że binarny plik nie istniał, więc mogłeś tam umieścić coś, a gdy usługa XPC zostanie wywołana, twój binarny plik zostanie wywołany.
Nie mogę już tego znaleźć w moim macOS.
xsanctl
Writeup: https://theevilbit.github.io/beyond/beyond_0015/
Location
/Library/Preferences/Xsan/.xsanrc
Wymagane uprawnienia roota
Trigger: Gdy usługa jest uruchamiana (rzadko)
Description & exploit
Najwyraźniej nie jest zbyt powszechne uruchamianie tego skryptu i nie mogłem go nawet znaleźć w moim macOS, więc jeśli chcesz więcej informacji, sprawdź opis.
/etc/rc.common
To nie działa w nowoczesnych wersjach MacOS
Możliwe jest również umieszczenie tutaj komend, które będą wykonywane przy starcie. Przykład zwykłego skryptu rc.common:
Techniki i narzędzia utrzymywania
Last updated