sudo提权 CVE-2021-3156复现
Linux操作系统漏洞,缓冲区溢出漏洞,可用于提权,被收录与CVE-2021-3156
sudo
sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。
su命令的主要作用是让你可以在已经登录的会话中切换到另外一个用户,换句话说,这个工具可以让你在不登出当前用户的情况下,登录另外一个用户。
sudo命令的主要作用是允许特定的用户以root用户或其他用户的身份执行命令。
sudo的配置文件/etc/sudoers
安全策略(用户规则)
user1 ALL=(ALL) ALL
#user1 表示该用户user1可以使用sudo命令,第一个ALL指的是网络中的主机(可以是主机名也可以是ip地址),它指明user1用户可以在此主机上执行后面命令;第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL是指命令路径。
user1 localhost=(root) /bin/kill
#表示user1用户可以在本地以root的身份去执行kill命令
user01 localhost=(root) NOPASSWD:/usr/bin/passwd,!/usr/bin/passwd root
#user01用户可以执行passwd程序,但是不能修改root密码,在命令前面加上叹号表示不能执行该程序。
漏洞描述
当sudo通过-s或-i命令行选项在shell模式下运行命令时,它将在命令参数中使用反斜杠转义特殊字符。但使用-s或-i标志运行sudoedit时,实际上并未进行转义,从而可能导致缓冲区溢出。因此只要存在sudoers文件(通常是/etc/sudoers),攻击者就可以使用本地普通用户利用sudo获得系统root权限。研究人员利用该漏洞在多个Linux发行版上成功获得了完整的root权限,包括Ubuntu 20.04(sudo 1.8.31)、Debian 10(sudo 1.8.27)和Fedora 33(sudo 1.9.2),并且sudo支持的其他操作系统和Linux发行版也很容易受到攻击。
并非所有存在漏洞的sudo版本都能利用成功,glibc>=2.27版本漏洞利用难度较小,低版本的glibc也能利用成功,只是漏洞利用难度增加。
漏洞复现
判断是否存在该漏洞
sudoedit -s /
返回 usage 开头的内容,表示该漏洞已经修复
返回 sudoedit 开头的内容,表示存在该漏洞
发现此版本不存在该漏洞,于是安装旧版本的sudo
使用以下命令来获取不同版本的sudo:
apt-cache madison sudo
sudo apt install sudo=1.8.21p2-3ubuntu1 (注意这个版本与上图对应)
sudoedit -s /
所以此时该版本sudo存在漏洞
下载exp:git clone https://github.com/blasty/CVE-2021-3156.git (已下载在桌面)
cd CVE-2021-3156 //进入该目录
make //编译
读取当前目录下的Makefile文件,并执行其中定义的目标和规则
all:默认目标,编译相关文件。执行以下操作:
删除名为 libnss_X 的目录(如果存在)。
创建名为 libnss_X 的目录。
使用 gcc 编译名为 sudo-hax-me-a-sandwich 的源文件 hax.c,生成可执行文件。
使用 gcc 编译名为 libnss_X/P0P_SH3LLZ_ .so.2 的共享库文件,源文件为 lib.c。
brute:依赖于目标 all,用于生成针对暴力破解的共享库文件。执行以下操作:
使用宏定义 BRUTE 编译名为 libnss_X/P0P_SH3LLZ_ .so.2 的共享库文件,源文件为 lib.c。
clean:清理目标,用于删除生成的文件。执行以下操作:
删除名为 libnss_X 和 sudo-hax-me-a-sandwich 的文件和目录。
这个Makefile 文件的目的是编译源文件 hax.c 和 lib.c,生成可执行文件 sudo-hax-me-a-sandwich 和共享库文件 libnss_X/P0P_SH3LLZ_ .so.2。其中 libnss_X/P0P_SH3LLZ_ .so.2 可能是一个具有恶意目的的共享库文件,用于进行漏洞利用或其他安全相关的操作。
./sudo-hax-me-a-sandwich
选择对应操作系统版本
./sudo-hax-me-a-sandwich 1
成功提权
exp原理
这段代码的目的是在程序加载时获取特权并启动一个shell交互环境
代码使用 execve 函数执行特定路径的 sudoedit 命令,传递构造的参数和环境变量,以触发漏洞。
1、为 smash_a 和 smash_b 分配内存,并填充相应长度的 'A' 和 'B' 字符。
2、在 smash_a 和 smash_b 的末尾添加 '' 字符,用于构造漏洞利用时的溢出。
3、创建一个字符指针数组 s_argv,用于存储要执行的命令参数。这里是将 "sudoedit"、"-s"、smash_a、''、smash_b 和 NULL 添加到数组中。
4、创建一个字符指针数组 s_envp,用于存储要传递的环境变量。这里首先将 '\' 字符重复添加 null_stomp_len 次,然后将 "X/P0P_SH3LLZ_" 添加到数组中。
5、分配内存并构造 lc_all 字符串,其中包含 "LC_ALL=C.UTF-8@" 和一系列 'C' 字符,长度为 lc_all_len。
6、将构造好的 lc_all 添加到 s_envp 数组中。
7、使用 execve 函数执行指定路径的 sudoedit 命令,传递构造的参数 s_argv 和环境变量 s_envp。这将触发漏洞并尝试提升权限。
总体来说,该代码的核心过程是构造恶意参数和环境变量,利用 sudoedit 命令中的漏洞,通过溢出实现权限提升。具体而言,通过在参数中构造特定的字符串长度和溢出字符,以及伪造的环境变量,诱使 sudoedit 在处理这些数据时发生堆溢出漏洞,从而导致特权提升。
完结
本页文章可以学习复现因为本人也是复现的。