macOS Auto Start
Esta seção é fortemente baseada na série de blogs Além dos bons e velhos LaunchAgents, o objetivo é adicionar mais Locais de Auto Inicialização (se possível), indicar quais técnicas ainda estão funcionando atualmente com a última versão do macOS (13.4) e especificar as permissões necessárias.
Bypass de Sandbox
Aqui você pode encontrar locais de inicialização úteis para burlar a sandbox que permite simplesmente executar algo escrevendo em um arquivo e aguardando por uma ação muito comum, um determinado período de tempo ou uma ação que você normalmente pode realizar de dentro de uma sandbox sem precisar de permissões de root.
Launchd
Locais
/Library/LaunchAgents
Gatilho: Reinicialização
Root necessário
/Library/LaunchDaemons
Gatilho: Reinicialização
Root necessário
/System/Library/LaunchAgents
Gatilho: Reinicialização
Root necessário
/System/Library/LaunchDaemons
Gatilho: Reinicialização
Root necessário
~/Library/LaunchAgents
Gatilho: Reentrada
~/Library/LaunchDemons
Gatilho: Reentrada
Como fato interessante, launchd
possui uma lista de propriedades incorporada na seção Mach-o __Text.__config
que contém outros serviços conhecidos que o launchd deve iniciar. Além disso, esses serviços podem conter o RequireSuccess
, RequireRun
e RebootOnSuccess
que significa que eles devem ser executados e concluídos com sucesso.
Obviamente, não pode ser modificado devido à assinatura de código.
Descrição e Exploração
launchd
é o primeiro processo executado pelo kernel do macOS na inicialização e o último a ser encerrado no desligamento. Ele sempre deve ter o PID 1. Esse processo irá ler e executar as configurações indicadas nos plists do ASEP em:
/Library/LaunchAgents
: Agentes por usuário instalados pelo administrador/Library/LaunchDaemons
: Daemons em todo o sistema instalados pelo administrador/System/Library/LaunchAgents
: Agentes por usuário fornecidos pela Apple./System/Library/LaunchDaemons
: Daemons em todo o sistema fornecidos pela Apple.
Quando um usuário faz login, os plists localizados em /Users/$USER/Library/LaunchAgents
e /Users/$USER/Library/LaunchDemons
são iniciados com as permissões dos usuários logados.
A principal diferença entre agentes e daemons é que os agentes são carregados quando o usuário faz login e os daemons são carregados na inicialização do sistema (pois existem serviços como ssh que precisam ser executados antes que qualquer usuário acesse o sistema). Além disso, os agentes podem usar a GUI enquanto os daemons precisam ser executados em segundo plano.
Existem casos em que um agente precisa ser executado antes do login do usuário, esses são chamados de PreLoginAgents. Por exemplo, isso é útil para fornecer tecnologia assistiva no login. Eles também podem ser encontrados em /Library/LaunchAgents
(veja aqui um exemplo).
Novos arquivos de configuração de Daemons ou Agents serão carregados após o próximo reinício ou usando launchctl load <target.plist>
Também é possível carregar arquivos .plist sem a extensão com launchctl -F <file>
(no entanto, esses arquivos plist não serão carregados automaticamente após o reinício).
Também é possível descarregar com launchctl unload <target.plist>
(o processo apontado por ele será encerrado).
Para garantir que não haja nada (como uma substituição) impedindo um Agente ou Daemon de ser executado, execute: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist
Liste todos os agentes e daemons carregados pelo usuário atual:
Se um plist pertence a um usuário, mesmo que esteja em pastas de sistema de daemon, a tarefa será executada como o usuário e não como root. Isso pode prevenir alguns ataques de escalonamento de privilégios.
Mais informações sobre launchd
launchd
é o primeiro processo do modo de usuário que é iniciado a partir do kernel. O início do processo deve ser bem-sucedido e ele não pode sair ou falhar. Ele é até protegido contra alguns sinais de interrupção.
Uma das primeiras coisas que o launchd
faria é iniciar todos os daemons como:
Daemons de temporizador baseados no tempo a serem executados:
atd (
com.apple.atrun.plist
): Tem umStartInterval
de 30 minutoscrond (
com.apple.systemstats.daily.plist
): TemStartCalendarInterval
para iniciar às 00:15
Daemons de rede como:
org.cups.cups-lpd
: Escuta em TCP (SockType: stream
) comSockServiceName: printer
SockServiceName deve ser uma porta ou um serviço de
/etc/services
com.apple.xscertd.plist
: Escuta em TCP na porta 1640
Daemons de caminho que são executados quando um caminho especificado muda:
com.apple.postfix.master
: Verificando o caminho/etc/postfix/aliases
Daemons de notificações IOKit:
com.apple.xartstorageremoted
:"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...
Porta Mach:
com.apple.xscertd-helper.plist
: Indica na entradaMachServices
o nomecom.apple.xscertd.helper
UserEventAgent:
Isso é diferente do anterior. Ele faz o launchd gerar aplicativos em resposta a eventos específicos. No entanto, neste caso, o binário principal envolvido não é
launchd
, mas/usr/libexec/UserEventAgent
. Ele carrega plugins da pasta restrita pelo SIP/System/Library/UserEventPlugins/
, onde cada plugin indica seu inicializador na chaveXPCEventModuleInitializer
ou, no caso de plugins mais antigos, no dicionárioCFPluginFactories
sob a chaveFB86416D-6164-2070-726F-70735C216EC0
de seuInfo.plist
.
Arquivos de inicialização do shell
Descrição: https://theevilbit.github.io/beyond/beyond_0001/ Descrição (xterm): https://theevilbit.github.io/beyond/beyond_0018/
Útil para contornar a sandbox: ✅
Contorno do TCC: ✅
Mas você precisa encontrar um aplicativo com um contorno do TCC que execute um shell que carregue esses arquivos
Localizações
~/.zshrc
,~/.zlogin
,~/.zshenv.zwc
,~/.zshenv
,~/.zprofile
Gatilho: Abrir um terminal com zsh
/etc/zshenv
,/etc/zprofile
,/etc/zshrc
,/etc/zlogin
Gatilho: Abrir um terminal com zsh
Requer privilégios de root
~/.zlogout
Gatilho: Sair de um terminal com zsh
/etc/zlogout
Gatilho: Sair de um terminal com zsh
Requer privilégios de root
Potencialmente mais em:
man zsh
~/.bashrc
Gatilho: Abrir um terminal com bash
/etc/profile
(não funcionou)~/.profile
(não funcionou)~/.xinitrc
,~/.xserverrc
,/opt/X11/etc/X11/xinit/xinitrc.d/
Gatilho: Esperado para ser acionado com xterm, mas não está instalado e mesmo após instalado esse erro é exibido: xterm:
DISPLAY is not set
Descrição & Exploração
Ao iniciar um ambiente de shell como zsh
ou bash
, certos arquivos de inicialização são executados. Atualmente, o macOS usa /bin/zsh
como o shell padrão. Esse shell é acessado automaticamente quando o aplicativo Terminal é iniciado ou quando um dispositivo é acessado via SSH. Embora bash
e sh
também estejam presentes no macOS, eles precisam ser explicitamente invocados para serem usados.
A página de manual do zsh, que podemos ler com man zsh
, tem uma descrição longa dos arquivos de inicialização.
Aplicações Reabertas
Configurar a exploração indicada e fazer logout e login ou até mesmo reiniciar não funcionou para mim para executar o aplicativo. (O aplicativo não estava sendo executado, talvez precise estar em execução quando essas ações são realizadas)
Writeup: https://theevilbit.github.io/beyond/beyond_0021/
Localização
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Gatilho: Reiniciar a abertura de aplicativos
Descrição e Exploração
Todas as aplicações a serem reabertas estão dentro do plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Portanto, para fazer com que as aplicações reabram seu próprio aplicativo, você só precisa adicionar seu aplicativo à lista.
O UUID pode ser encontrado listando esse diretório ou com ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
Para verificar as aplicações que serão reabertas, você pode fazer:
Para adicionar um aplicativo a esta lista, você pode usar:
Preferências do Terminal
Útil para contornar a sandbox: ✅
Bypass do TCC: ✅
O Terminal usa permissões do FDA se o usuário o utilizar
Localização
~/Library/Preferences/com.apple.Terminal.plist
Gatilho: Abrir o Terminal
Descrição e Exploração
Em ~/Library/Preferences
são armazenadas as preferências do usuário nas Aplicações. Algumas dessas preferências podem conter uma configuração para executar outras aplicações/scripts.
Por exemplo, o Terminal pode executar um comando na inicialização:
Essa configuração é refletida no arquivo ~/Library/Preferences/com.apple.Terminal.plist
assim:
Portanto, se o plist das preferências do terminal no sistema puder ser sobrescrito, então a funcionalidade open
pode ser usada para abrir o terminal e executar esse comando.
Você pode adicionar isso a partir da linha de comando com:
Scripts do Terminal / Outras extensões de arquivo
Útil para contornar a sandbox: ✅
Contorno do TCC: ✅
Terminal usado para ter permissões do FDA se o usuário o usar
Localização
Qualquer lugar
Gatilho: Abrir Terminal
Descrição e Exploração
Se você criar um script .terminal
e abri-lo, o aplicativo Terminal será automaticamente invocado para executar os comandos indicados nele. Se o aplicativo Terminal tiver alguns privilégios especiais (como TCC), seu comando será executado com esses privilégios especiais.
Experimente com:
Extensões de Áudio
Descrição: https://theevilbit.github.io/beyond/beyond_0013/ Descrição: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
Localização
/Library/Audio/Plug-Ins/HAL
Requer privilégios de root
Gatilho: Reiniciar o coreaudiod ou o computador
/Library/Audio/Plug-ins/Components
Requer privilégios de root
Gatilho: Reiniciar o coreaudiod ou o computador
~/Library/Audio/Plug-ins/Components
Gatilho: Reiniciar o coreaudiod ou o computador
/System/Library/Components
Requer privilégios de root
Gatilho: Reiniciar o coreaudiod ou o computador
Descrição
De acordo com as descrições anteriores, é possível compilar alguns plugins de áudio e carregá-los.
Extensões QuickLook
Descrição: https://theevilbit.github.io/beyond/beyond_0028/
Localização
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/NomeDoAplicativo/Aplicativo/Conteúdo/Biblioteca/QuickLook/
~/Applications/NomeDoAplicativo/Aplicativo/Conteúdo/Biblioteca/QuickLook/
Descrição & Exploração
As extensões QuickLook podem ser executadas quando você aciona a visualização de um arquivo (pressione a barra de espaço com o arquivo selecionado no Finder) e um plugin que suporta esse tipo de arquivo está instalado.
É possível compilar sua própria extensão QuickLook, colocá-la em uma das localizações anteriores para carregá-la e depois ir para um arquivo suportado e pressionar espaço para ativá-la.
Ganchos de Login/Logout
Isso não funcionou para mim, nem com o LoginHook do usuário nem com o LogoutHook do root
Descrição: https://theevilbit.github.io/beyond/beyond_0022/
Localização
Você precisa ser capaz de executar algo como
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
Localizado em
~/Library/Preferences/com.apple.loginwindow.plist
Eles estão obsoletos, mas podem ser usados para executar comandos quando um usuário faz login.
Esta configuração é armazenada em /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
Para deletar:
O usuário root é armazenado em /private/var/root/Library/Preferences/com.apple.loginwindow.plist
Bypass Condicional de Sandbox
Aqui você pode encontrar locais de inicialização úteis para burlar a sandbox que permite que você simplesmente execute algo escrevendo em um arquivo e não esperando condições super comuns como programas específicos instalados, ações de usuário "pouco comuns" ou ambientes.
Cron
Writeup: https://theevilbit.github.io/beyond/beyond_0004/
Útil para burlar a sandbox: ✅
No entanto, você precisa ser capaz de executar o binário
crontab
Ou ser root
Bypass TCC: 🔴
Localização
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
Root necessário para acesso direto de escrita. Root não é necessário se você puder executar
crontab <arquivo>
Gatilho: Depende do trabalho cron
Descrição e Exploração
Liste os trabalhos cron do usuário atual com:
Você também pode ver todos os trabalhos cron dos usuários em /usr/lib/cron/tabs/
e /var/at/tabs/
(necessita de permissão de root).
No MacOS, várias pastas que executam scripts com certa frequência podem ser encontradas em:
Aqui você pode encontrar os trabalhos cron regulares, os trabalhos at (não muito usados) e os trabalhos periódicos (principalmente usados para limpar arquivos temporários). Os trabalhos periódicos diários podem ser executados, por exemplo, com: periodic daily
.
Para adicionar um trabalho cron de usuário programaticamente, é possível usar:
iTerm2
Descrição: https://theevilbit.github.io/beyond/beyond_0002/
Localizações
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
Gatilho: Abrir iTerm
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
Gatilho: Abrir iTerm
~/Library/Preferences/com.googlecode.iterm2.plist
Gatilho: Abrir iTerm
Descrição e Exploração
Scripts armazenados em ~/Library/Application Support/iTerm2/Scripts/AutoLaunch
serão executados. Por exemplo:
macOS Auto Start Locations
Launch Agents
Launch Agents are used to run processes when a user logs in. They are located in ~/Library/LaunchAgents/
and /Library/LaunchAgents/
.
Launch Daemons
Launch Daemons are used to run processes at system boot or login. They are located in /Library/LaunchDaemons/
and /System/Library/LaunchDaemons/
.
O script ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
também será executado:
O arquivo de preferências do iTerm2 localizado em ~/Library/Preferences/com.googlecode.iterm2.plist
pode indicar um comando a ser executado quando o terminal iTerm2 é aberto.
Essa configuração pode ser feita nas configurações do iTerm2:
E o comando é refletido nas preferências:
Você pode definir o comando a ser executado com:
Altamente provável que existam outras maneiras de abusar das preferências do iTerm2 para executar comandos arbitrários.
xbar
Descrição: https://theevilbit.github.io/beyond/beyond_0007/
Útil para contornar a sandbox: ✅
Mas o xbar deve estar instalado
Bypass do TCC: ✅
Ele solicita permissões de Acessibilidade
Localização
~/Library/Application\ Support/xbar/plugins/
Gatilho: Uma vez que o xbar é executado
Descrição
Se o programa popular xbar estiver instalado, é possível escrever um script shell em ~/Library/Application\ Support/xbar/plugins/
que será executado quando o xbar for iniciado:
Hammerspoon
Descrição: https://theevilbit.github.io/beyond/beyond_0008/
Útil para contornar a sandbox: ✅
Mas o Hammerspoon deve estar instalado
Bypass do TCC: ✅
Requer permissões de Acessibilidade
Localização
~/.hammerspoon/init.lua
Gatilho: Uma vez que o Hammerspoon é executado
Descrição
Hammerspoon atua como uma plataforma de automação para o macOS, aproveitando a linguagem de script LUA para suas operações. Notavelmente, ele suporta a integração de código completo em AppleScript e a execução de scripts de shell, aprimorando significativamente suas capacidades de script.
O aplicativo procura por um único arquivo, ~/.hammerspoon/init.lua
, e quando iniciado, o script será executado.
BetterTouchTool
Útil para contornar a sandbox: ✅
Mas o BetterTouchTool deve estar instalado
Bypass do TCC: ✅
Solicita permissões de Automação-Atalhos e Acessibilidade
Localização
~/Library/Application Support/BetterTouchTool/*
Esta ferramenta permite indicar aplicativos ou scripts para executar quando alguns atalhos são pressionados. Um atacante pode configurar seu próprio atalho e ação para executar no banco de dados para fazer com que ele execute código arbitrário (um atalho poderia ser apenas pressionar uma tecla).
Alfred
Útil para contornar a sandbox: ✅
Mas o Alfred deve estar instalado
Bypass do TCC: ✅
Solicita permissões de Automação, Acessibilidade e até acesso total ao disco
Localização
???
Permite criar fluxos de trabalho que podem executar código quando certas condições são atendidas. Potencialmente, é possível para um atacante criar um arquivo de fluxo de trabalho e fazer o Alfred carregá-lo (é necessário pagar pela versão premium para usar fluxos de trabalho).
SSHRC
Writeup: https://theevilbit.github.io/beyond/beyond_0006/
Útil para contornar a sandbox: ✅
Mas o ssh precisa estar habilitado e em uso
Bypass do TCC: ✅
SSH costumava ter acesso total ao FDA
Localização
~/.ssh/rc
Gatilho: Login via ssh
/etc/ssh/sshrc
Requer privilégios de root
Gatilho: Login via ssh
Para ligar o ssh, é necessário Acesso Total ao Disco:
Descrição & Exploração
Por padrão, a menos que PermitUserRC no
em /etc/ssh/sshd_config
, quando um usuário faz login via SSH os scripts /etc/ssh/sshrc
e ~/.ssh/rc
serão executados.
Itens de Login
Descrição: https://theevilbit.github.io/beyond/beyond_0003/
Localizações
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
Gatilho: Login
Payload de exploração armazenado chamando
osascript
/var/db/com.apple.xpc.launchd/loginitems.501.plist
Gatilho: Login
Requer privilégios de root
Descrição
Em Preferências do Sistema -> Usuários e Grupos -> Itens de Login você pode encontrar itens a serem executados quando o usuário faz login. É possível listá-los, adicionar e remover a partir da linha de comando: