一、sudo介绍
https://blog.csdn.net/hsj_csdn/article/details/102593827
二、sudo漏洞简介
who where=(whom:group) command
默认情况下,在大多数Linux发行版中,/etc /sudoers文件中,如果在括号中配置了ALL,表示以任意身份执行命令,ALL关键字允许admin或sudo组中的所有用户以系统上的任何有效用户身份运行任何命令。
但是,由于特权分离是Linux中的基本安全范例之一,因此管理员可以配置sudoers文件来定义哪些用户可以运行哪些命令。
在sudo版本小于1.8.28时,即使限制了用户以root用户身份运行特定命令或任何命令,该漏洞也可能允许用户绕过此安全策略并完全控制系统。
攻击者可以利用此漏洞,只需指定用户ID“ -1”或“4294967295”即可以root身份运行命令。这是因为将用户ID转换为用户名的函数将-1或其无符号等效4294967295误认为是0,该值始终是root用户的用户ID。
三、漏洞条件
在sudo版本小于1.8.28时,会有该漏洞。使用 sudo -V 可以查看版本。
利用该漏洞的条件是用户具有sudo配置,并且在配置项中可以以ALL身份执行命令。这样,用户可以以任意用户或任意uid运行命令。这是这个漏洞利用的前提,因为利用漏洞时,需要指定uid为-1。
例如,如下配置项允许 mkdir 命令以任意用户身份运行,因为它括号中指定了ALL,表示以任意的身份执行。
hao ALL=(ALL) /usr/bin/id,/usr/bin/mkdir
用户不仅能够以其它合法用户身份运行该 id,mkdir 命令,还能使用 #uid 语法以任意用户 ID 运行该命令,例如:
sudo -u#1234 id -u
可以看到,用户hao的id是1000。由于/etc/sudoers 中配置了用户hao可以以任何身份运行id命令。使用#uid指定身份为id=1234的用户,执行id命令,可以看到,输出的uid是1234,说明此时用户hao已经可以以uid=1234的用户身份执行命令了。
三、漏洞触发
根据(二)中的描述,当我们把uid改为 -1 或 4294967295 时,将uid转换为用户名的函数将出现bug,返回uid=0。这是因为 sudo命令本身就已经以用户 ID 为0 运行,因此当 sudo 试图将用户 ID 修改成 -1时,不会发生任何变化。
sudo -u#-1 id -u
sudo -u#4294967295 id -u
四、例子
sudo -V 查看我的centos里sudo 的版本是 1.8.23,是有漏洞的版本。
为了演示和测试方便,这里在 /etc/sudoers 中为用户hao配置一条策略,禁止其使用root身份执行mkdir命令。而通过该漏洞,可以让用户hao成功的以root身份运行mkdir命令。
配置 /etc/sudoers ,
hao ALL=(ALL,!root) /usr/bin/mkdir
切换为用户hao,在root根目录下执行mkdir命令,提示无权限:
执行该漏洞的payload,通过这个漏洞执行mkdir,
sudo -u#-1 mkdir test
命令执行成功,
可以看到已经在根目录下创建了一个test目录:
五、修复
1、及时升级到sudo1.8.28 版本。
2、检索/etc/sudoers是否存在 ALL 关键词的复合限制逻辑。
总结:
1、sudo版本小于1.8.28有此漏洞;使用sudo -V 命令查看版本信息。
2、默认的/etc/sudoers 配置是没有漏洞的。漏洞利用条件是在 /etc/sudoer 中配置了以ALL 身份执行。因为这里需要指定uid为-1。
3、还需要知道该普通用户的密码,因为sudo执行时需要密码。如果在/etc/sudoers中配置了免密,可不用知道密码。