the_open_door
café
ESEN
← Volver al índice

sudo over a writable script (or directory)

Una regla de sudo que permite ejecutar un script (o un intérprete con un script como argumento) como root solo es segura si ese script no se puede modificar. Si el fichero es escribible por nuestro usuario, o si lo es el directorio que lo contiene (podemos borrarlo y recrearlo aunque el original esté protegido), controlamos lo que sudo ejecuta con privilegios de root.

El primer paso es leer sudo -l y mirar la propiedad del script y de su carpeta:

sudo -l
ls -l /ruta/al/script.py
ls -ld /ruta/al/

Dos variantes habituales:

El payload típico cuando la regla es sudo python <script> es poner el bit SUID a una shell o copiar/editar ficheros sensibles:

import os
os.system("chmod u+s /bin/bash")   # luego: bash -p  ->  [[suid-abuse|euid=0]]

Es un caso particular del problema general de sudo con intérpretes (GTFOBins): ejecutar python, perl o bash como root sobre un fichero que controlamos no acota nada. Se diferencia del cron sobre script escribible en quién dispara la ejecución (nosotros, vía sudo, en lugar del planificador).

Cómo detectarlo. sudo deja en /var/log/auth.log (o journalctl _COMM=sudo) la regla ejecutada con su usuario y argumentos; el abuso se ve porque el script privilegiado hace algo que no le corresponde: un chmod +s /bin/bash, un sh/bash hijo, o la escritura en /root/.ssh (auditd/Sysmon for Linux sobre execve/open con ppid del script). En reposo, la firma es un script referenciado por una regla de sudo que es escribible por un usuario o cuyo directorio lo es (ls -ld), y su modificación con mtime reciente justo antes de un sudo es el indicio previo.

Defensa. El binario o script al que apunta una regla de sudo, y su directorio, deben ser propiedad de root y no escribibles por terceros. Nunca conceder por sudo un intérprete con un argumento de script editable; fijar rutas absolutas no manipulables.

Máquinas donde se aplica