Escalar privilegios con CRON

Una vez hemos conseguido acceso a la máquina de nuestro objetivo tendremos que identificar qué privilegios tenemos sobre el entorno. Si no somos administrador, necesitaremos encontrar un fallo de configuración del sistema, una contraseña anotada en un fichero de texto o ingeniárnoslas de una forma más creativa para ejecutar comandos como root. En este vídeo hablaremos sobre una de estas formas creativas. Escalar privilegios con el servicio CRON.

Si quieres, puedes ver el vídeo explicativo de este post:

Bien, la definición de CRON sacada de Wikipedia es la siguiente:

En el sistema operativo Unix, cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta procesos o guiones a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora a la que deben hacerlo se especifican en el archivo crontab. El nombre cron proviene del griego chronos (χρόνος) que significa «tiempo».

cron (Unix) – Wikipedia

En resumen, CRON es un servicio que nos ayuda a programar la ejecución de tareas. Por ejemplo, realizar copias de seguridad, borrado de ficheros temporales, limpieza de una base de datos o ejecución de scripts. El fichero crontab lo podemos encontrar en el directorio /etc y en él es dónde se configurarán las tareas.

servicio CRON

Como podéis ver hay 7 columnas: minuto, hora, día, mes, día de la semana, nombre de usuario y comando a ejecutar. Veamos un ejemplo para que resulte más fácil de entender todo esto. Si quisiéramos ejecutar el comando nmap para monitorizar los puertos abiertos que tiene un ordenador el día 5 de cada mes, a la 1 de la madrugada, lo especificaríamos de esta forma:

qué es CRON
Tarea con nmap para realizar escaneo automático

Ahora bien, seguro que, en más de una ocasión, querremos ejecutar más de 1 vez al mes una tarea. Incluso múltiples veces en un mismo día. Así que, vayamos por partes.

Como veis he usado el asterisco en las columnas del mes y día de la semana. Esto me permite especificar que la tarea se ejecute en cada ocurrencia. Por ejemplo: en el caso del día de la semana, se ejecutará cada día. En el ejemplo anterior, será el día 5 de cada mes ya sea lunes, martes, miércoles… Por otro lado, si quisiera que se ejecutara cada minuto, no podría poner un 1 directamente en la columna de minutos ya que, entonces, se ejecutaría en el minuto 1 de cada hora y, por lo tanto, solo 1 vez. Lo que debería hacer, es especificarlo con */1 o, en el caso que quisiera cada 5 días, poner */5 en la columna del día del mes.

La parte del comando, es simplemente especificar el comando a ejecutar.

¿Se entiende? Si tienes dudas, pon un comentario 🙂

Perfecto, ahora que sabemos cómo funciona CRON, pasemos a ver cómo podemos usarlo a nuestro favor para escalar privilegios y llegar a ejecutar comandos cómo administrador.

Si quieres preparar el escenario que comentaré a continuación puedes ver cómo hacerlo en el vídeo que hay al inicio de este post.

Imaginemos que hemos conseguido acceso a un sistema con el usuario www. Lo primero que haremos es ver qué tiene en su directorio. Al no tener nada interesante, pasaremos a un directorio más atrás que nos llevará a /home. Ahí volvemos a lanzar el comando ls y observamos un script en bash. Con los argumentos -la podemos ver los privilegios de la carpeta y vemos que el script pertenece al usuario root, que tiene control absoluto sobre el fichero, pero también nos damos cuenta que cualquier usuario puede leerlo y modificarlo. ¿Interesante verdad?

script con todos los permisos
Script encontrado

Si quieres saber cómo funcionan los permisos te recomiendo que veas este vídeo (enlace).

Lo siguiente es ver el contenido del script. Parece que guarda la palabra “running” en un fichero temporal llamado message.txt.

contenido del script
Contenido del script

Como no tiene mucho más misterio, seguimos con nuestra enumeración en el sistema a ver si encontramos algo que nos permita ser root. Así que nos disponemos a ver el contenido de crontab para ver si sacamos algo de información.

escalando privilegios con CRON
Contenido de crontab

!Bingo! Parece que hay programada una tarea que se ejecuta cada minuto por el usuario root y es la ejecución del script que hemos encontrado. Ahora se nos debería encender una lucecita en la cabeza al recordar que este script lo puede modificar cualquiera. Así que vamos a crear una un shell que se ejecutará en una ip y en un puerto concreto. A esto se le llama shell inversa.

shell inversa para escalar privilegios con CRON
Modificación del script para ejecutar una shell inversa

La clave de esto es que, el que ejecutará el script es el usuario root y por lo tanto la shell que se creará tendrá los mismos permisos. Por esta razón vamos a poner a la escucha netcat en el puerto especificado anteriormente y, si todo va bien, recibiremos la shell cuando se ejecute la tarea.

netcat recibe la shell inversa logrando escalar privilegios con CRON
Ejecución de netcat para recibir la shell inversa del usuario root

Ahí la tenemos, ¡ya somos root! Hemos logrado escalar privilegios con el servicio CRON.

Como veis, puede ser fácil que nos encontremos con un escenario parecido en una auditoría real. Por eso, al programar tareas con CRON, deberemos asegurarnos que estos no puedan ser accesible ni modificables por ningún usuario. Otra opción es no ejecutar scripts como root y crear usuarios concretos, con privilegios limitados, para realizar esas tareas.

¡Espero que te haya resultado interesante!
Otros artículos que te pueden interesar, aquí.

Saludos.

Si te ha sido de ayuda, ¡comparte!

Deja una respuesta