🐧Linux - Logrotate
Cada sistema Linux produce grandes cantidades de archivos de registro. Para evitar que el disco duro se desborde, una herramienta llamada logrotate
se encarga de archivar o eliminar los registros antiguos. Si no se presta atención a los archivos de registro, se vuelven cada vez más grandes y terminan ocupando todo el espacio disponible en el disco.
Además, buscar en muchos archivos de registro grandes lleva mucho tiempo. Para evitar esto y ahorrar espacio en el disco, se ha desarrollado una herramienta llamada logrotate
. Los registros /var/log
proporcionan a los administradores la información que necesitan para determinar la causa de los fallos. Casi más importantes son los detalles del sistema que pasan desapercibidos, como por ejemplo si todos los servicios se están ejecutando correctamente.
Logrotate
tiene muchas funciones para gestionar estos archivos de registro, entre ellas la especificación de:
El
size
del archivo de registroEl
age
Y las medidas
action
que se deben tomar cuando se alcanza uno de estos factores
La función de la rotación consiste en renombrar los archivos de registro. Por ejemplo, se pueden crear nuevos archivos de registro cada nuevo día y los más antiguos se renombrarán automáticamente. Otro ejemplo de esto sería vaciar el archivo de registro más antiguo y, de esta forma, reducir el consumo de memoria.
Esta herramienta se inicia periódicamente en cron
y se controla mediante el archivo de configuración /etc/logrotate.conf
. Este archivo contiene configuraciones globales que determinan la función de logrotate
.
Para forzar una nueva rotación en el mismo día, podemos establecer la fecha después de los archivos de registro individuales en el archivo de estado /var/lib/logrotate.status
o usar la opción -f
/ :--force
Podemos encontrar los archivos de configuración correspondientes en el directorio /etc/logrotate.d/
.
Explotar logrotate
Para explotar logrotate
, necesitamos algunos requisitos que debemos cumplir.
Necesitamos permisos
write
sobre los archivos de registroLogrotate debe ejecutarse como un usuario privilegiado o
root
Versiones vulnerables:
3.8.6
3.11.0
3.15.0
3.18.0
Existe un exploit prefabricado que podemos utilizar para esto si se cumplen los requisitos. Este exploit se llama logrotten . Podemos descargarlo y compilarlo en un núcleo similar del sistema de destino y luego transferirlo al sistema de destino. Alternativamente, si podemos compilar el código en el sistema de destino, podemos hacerlo directamente en el sistema de destino.
Para que funcione correctamente debemos compilarlo en el sistema linux objetivo
A continuación, necesitamos ejecutar un payload. Aquí tenemos muchas opciones diferentes que podemos usar. En este ejemplo, ejecutaremos un reverse shell simple basado en bash con la IP
y puerto
de nuestra máquina virtual que usaremos para atacar el sistema de destino.
Sin embargo, antes de ejecutar el exploit, debemos determinar qué opción logrotate
se usa en logrotate.conf
.
En nuestro caso es la opción: create
. Por lo que tendremos que utilizar el exploit adaptado a esta función.
Después de eso, tenemos que iniciar un listener en nuestra máquina de atacante, que espera la conexión del sistema de destino.
Como paso final, ejecutamos el exploit con el payload preparado y esperamos un reverse shell como usuario privilegiado o root.
Caso práctico
Aumente los privilegios y envíe el contenido de flag.txt como respuesta.
Lo primero que encontramos al acceder es un directorio de backups
con archivos de logs dentro que se van renombrando, lo que nos puede indicar la presencia de logrotate:
Lo confirmamos accediendo al directorio /tmp/logrotate.d
:
Si leemos el archivo mon
obtenemos información relevante, como un archivo mon.log
dentro del directorio /home/htb-student/mon
. Esto nos permitiría forzar este archivo de log para ejecutar logrotten, aunque para este ejemplo vamos a crear un archivo access.log
en el directorio /backups
, para ver que igualmente es efectivo.
Comprobamos la versión de logrotate y observamos que el vulnerable:
Retrocedamos un paso y entendamos para qué sirve logrotate. Los archivos de registro se acumulan y, si se desarchivan o se dividen en archivos más pequeños, se vuelven demasiado grandes para ser legibles, por lo que el trabajo de logrotate es limitar cada archivo de registro una vez que alcanza un cierto tamaño especificado y comprimirlo. Estas configuraciones son configurables. Enlace de HackTricks a esta explicación sobre cómo funciona
Elevación de privilegios
Ahora vamos a transferir logrotten y lo vamos a compilar en la máquina objetivo, concretamente en el directorio /dev:shm
:
Ahora vamos a crear un payload con una reverse shell que se ejecutará una vez que se produzca el logrotate:
En la imagen de arriba vemos el proceso de explotación:
Ya tenemos logrotten compilado en el sistema objetivo
Abrimos un listener con netcat en nuestro equipo de atacante
Creamos el payload y ejecutamos logrotten de la siguiente manera:
Nos conectamos por SSH en otra terminal y en el directorio backups forzamos el logrotate haciendo un echo hacia el archivo access.log
Al forzarlo se completa el exploit en el sistema objetivo
Recibimos una reverse shell como root en el listener de netcat
Solo recibimos la conexión como root durante unos breves segundos, pero más que suficiente para extraer la flag o introducir el comando que queramos:
Última actualización