sudo 权限绕过漏洞复现(CVE-2019-14287)

免责声明

  1. 本文章仅用于技术交流学习,复现环境均在虚拟机中进行,在利用过程中,您应确保自己所有行为符合当地法律法规,并且已经取得了足够的授权。
  2. 如果您在利用的过程中存在任何非法行为,您需自行承担所有后果,作者不承担任何法律及连带责任。除非您已充分阅读、完全理解并接受本协议所有条款,否则,请您不要使用此文章中所提到的技术。您的使用行为或者您以其他任何明示或者默认方式表示接受本条款的,即视为您已阅读并统一本协议的约束。

漏洞背景

2019年10月14日, sudo 官方在发布了 CVE-2019-14287 的漏洞预警及sudo 1.8.28版本,该版本修复了sudo的一个本地提权漏洞。
CVE-2019-14287 是管理员在配置文件中用了 ALL 关键词后造成的。但默认的 sudo 配置文件不受影响。

漏洞描述

当sudo配置为允许用户以任意方式运行命令时,用户通过RunAs规范中的ALL关键字指定用户的id,当用户id为-1或4294967295(0xffffffff)时,低权限用户可以使用root权限运行命令。

影响版本

sudo 1.8.28 版本之前的所有版本

实验环境

Kali

复现过程

查询下sudo的版本
sudo -V
sudo 权限绕过漏洞复现(CVE-2019-14287)
创建新用户
sudo 权限绕过漏洞复现(CVE-2019-14287)
编辑/etc/sudoers文件
sudo 权限绕过漏洞复现(CVE-2019-14287)
这里表示 test 可以 任意主机上 任何用户 但这个用户不能属于root组 执行所有命令

这里介绍下字段含义:
授权用户/组 主机=[(切换到哪些用户或组)][是否需要输入密码验证] 命令1,命令2

第一个字段表示:
授权用户/组 不以%开头的,代表“将要授权的用户” 以%开头的表示“将要授权的组”
第二个和第三个ALL则表示可以切换到任何(用户:组)
第四个字段表示:
若添加NOPASSWD表示不需要输入密码,如果省略则表示需要输入密码
第五个字段表示:
可以运行的命令

切换到test用户
sudo 权限绕过漏洞复现(CVE-2019-14287)
sudo -u#-1 cat /etc/shadow或者sudo -u#4294967295 cat /etc/shadow
sudo 权限绕过漏洞复现(CVE-2019-14287)
成功读取文件。
之所以会产生这个漏洞,是因为将用户 ID 转换为用户名的函数会将 -1(或无效等效的 4294967295)误认为是 0,而这正好是 root 用户 User ID 。此外,由于通过 -u 选项指定的 User ID 在密码数据库中不存在,因此不会运行任何 PAM 会话模块

修复建议

  1. 及时升级到 sudo 1.8.28 版本。
  2. 检索/etc/sudoers 是否存在 ALL 关键词的复合限制逻辑