macOS Auto Start
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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ń.
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.
/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.
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ń.
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
): Ma StartInterval
wynoszący 30 minut
crond (com.apple.systemstats.daily.plist
): Ma StartCalendarInterval
, aby uruchomić o 00:15
Demony sieciowe takie jak:
org.cups.cups-lpd
: Nasłuchuje w TCP (SockType: stream
) z SockServiceName: printer
SockServiceName musi być portem lub usługą z /etc/services
com.apple.xscertd.plist
: Nasłuchuje na TCP na porcie 1640
Demony ś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 wpisie MachServices
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 kluczu XPCEventModuleInitializer
lub, w przypadku starszych wtyczek, w słowniku CFPluginFactories
pod kluczem FB86416D-6164-2070-726F-70735C216EC0
w swoim Info.plist
.
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
~/.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
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.
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/
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Wyzwalacz: Ponowne uruchomienie otwierających się aplikacji
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ć:
Przydatne do obejścia piaskownicy: ✅
Obejście TCC: ✅
Terminal używa uprawnień FDA użytkownika, który go używa
~/Library/Preferences/com.apple.Terminal.plist
Wyzwalacz: Otwórz Terminal
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ą:
Przydatne do obejścia piaskownicy: ✅
Obejście TCC: ✅
Użycie terminala do uzyskania uprawnień FDA użytkownika
Gdziekolwiek
Wyzwalacz: Otwórz Terminal
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).
Writeup: https://theevilbit.github.io/beyond/beyond_0013/ Writeup: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
/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
Zgodnie z wcześniejszymi opisami możliwe jest kompilowanie niektórych wtyczek audio i załadowanie ich.
Writeup: https://theevilbit.github.io/beyond/beyond_0028/
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
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ć.
To nie zadziałało dla mnie, ani z LoginHook użytkownika, ani z LogoutHook roota
Writeup: https://theevilbit.github.io/beyond/beyond_0022/
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
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.
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: 🔴
/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
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ć:
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
~/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
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ń.
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
~/Library/Application\ Support/xbar/plugins/
Wyzwalacz: Po uruchomieniu xbar
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:
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
~/.hammerspoon/init.lua
Trigger: Po uruchomieniu hammerspoon
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.
Przydatne do obejścia sandbox: ✅
Ale BetterTouchTool musi być zainstalowane
Obejście TCC: ✅
Wymaga uprawnień do Automatyzacji-Skrótów i Dostępności
~/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).
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
???
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).
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
~/.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:
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.
Artykuł: https://theevilbit.github.io/beyond/beyond_0003/
~/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
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
(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.
Opis: https://theevilbit.github.io/beyond/beyond_0014/
Musisz wykonać at
i musi być włączone
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 kolejka
0001a
- numer zadania w hex, 0x1a = 26
019bdcd2
- czas w hex. Reprezentuje minuty, które upłynęły od epoki. 0x019bdcd2
to 26991826
w systemie dziesiętnym. Jeśli pomnożymy to przez 60, otrzymujemy 1619509560
, co odpowiada GMT: 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
.
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ę z System Events
, aby skonfigurować Folder Actions
TCC bypass: 🟠
Ma podstawowe uprawnienia TCC, takie jak Pulpit, Dokumenty i Pobrane
/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
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:(
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: 🔴
~/Library/Preferences/com.apple.dock.plist
Wyzwalacz: Gdy użytkownik kliknie na aplikację w docku
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:
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: 🔴
/Library/ColorPickers
Wymagane uprawnienia roota
Wyzwalacz: Użyj wybieracza kolorów
~/Library/ColorPickers
Wyzwalacz: Użyj wybieracza kolorów
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
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: ???
Konkretna aplikacja
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:
Writeup: https://theevilbit.github.io/beyond/beyond_0016/ Writeup: https://posts.specterops.io/saving-your-access-d562bf5bf90b
/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
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:
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
~/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
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.
Nie wygląda na to, że to już działa.
Opis: https://theevilbit.github.io/beyond/beyond_0009/
/System/Library/PreferencePanes
/Library/PreferencePanes
~/Library/PreferencePanes
Nie wygląda na to, że to już działa.
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.
Opis: https://theevilbit.github.io/beyond/beyond_0019/
/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
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ń).
Writeup: Linux Hacktricks PAM Writeup: https://theevilbit.github.io/beyond/beyond_0005/
Root zawsze wymagany
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):
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: ???
/Library/Security/SecurityAgentPlugins/
Wymagany root
Konieczne jest również skonfigurowanie bazy danych autoryzacji, aby używała wtyczki
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ć).
Writeup: https://theevilbit.github.io/beyond/beyond_0030/
/private/etc/man.conf
Wymagany root
/private/etc/man.conf
: Kiedy man jest używany
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:
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ń
/etc/apache2/httpd.conf
Wymagany root
Wyzwalacz: Gdy Apache2 jest uruchamiany
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:
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: 🔴
/etc/security/audit_warn
Wymagany root
Wyzwalacz: Gdy auditd wykryje ostrzeżenie
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
.
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ć.
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:
Writeup: https://theevilbit.github.io/beyond/beyond_0018/
/opt/X11/etc/X11/xinit/privileged_startx.d
Wymagane uprawnienia roota
Wyzwalacz: Z XQuartz
XQuartz nie jest już zainstalowany w macOS, więc jeśli chcesz więcej informacji, sprawdź opis.
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)
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.
Writeup: https://theevilbit.github.io/beyond/beyond_0029/
/usr/local/bin/amstoold
Wymagane uprawnienia roota
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.
Writeup: https://theevilbit.github.io/beyond/beyond_0015/
/Library/Preferences/Xsan/.xsanrc
Wymagane uprawnienia roota
Trigger: Gdy usługa jest uruchamiana (rzadko)
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.
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:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)