cve-2021-3156
首先了解sudoedit这个命令是在干什么
使用sudoedit命令可以以另外一个用户身份编辑文件
-u 以指定用户运行命令
-g 以指定主要组群运行命令
-n 防止提示用户输入密码
这个漏洞听说估计是很早就出现了是一个堆溢出,漏洞点在
for (size = 0, av = NewArgv + 1; *av; av++)
size += strlen(*av) + 1;
if (size == 0 || (user_args = malloc(size)) == NULL) { #user_args是一个堆地址
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_int(NOT_FOUND_ERROR);
}
if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)) {
/*
* When running a command via a shell, the sudo front-end
* escapes potential meta chars. We unescape non-spaces
* for sudoers matching and logging purposes.
*/
for (to = user_args, av = NewArgv + 1; (from = *av); av++) {#把我们的参数放入了from里面
while (*from) {
if (from[0] == '\\' && !isspace((unsigned char)from[1]))
from++;
*to++ = *from++;#from里面是我们的输入把参数拷贝到了堆空间
}
*to++ = ' ';
}
可以看到user_arg是一个堆地址赋值给了to,newArgv是我们输入的参数,while里面有一个if判断如果是换行’'和空格的化from就会加一(这里from就像成idx即可,我们输入参数字符串的idx)我们的输入
arg1 \
arg2 ‘a’*0x17
当走到while里面时就会先进入if语句也就会from++然后from就指向了arg2将其拷贝了进去,当我们再继续运行时漏洞就出现了,程序就会按照原来的逻辑将arg2再次拷贝,形成了堆溢出
ememmd帮比赛出题去了,主要是出的题还被各种非预期,我真的tcl,所以我自闭了,一周,一周之后我发现利用脚本已经有人写好了,这里我再详细复现一波把
复现
这里有堆溢出
,但是这不是我们寻常做的pwn题,能够反复的malloc,free等我们就只有一次溢出机会,不然就控制pc,所以能够的办法也很少,fuzz一波就写结构体指针控制程序流程才是,最直接的
验证漏洞存在
可以看到报错了
复现流程
跟进源码首先执行sudoedit 命令会调用sudo.c,然后会在此处(main+953)调用sudoedit这个插件
之后就会走到sudoers.c然后就走到我们漏洞产生的地方了,
github上的exp是利用劫持动态链接库,glibc的nss又叫Name Service Switch ,每个linux都有这样一套称之为NSS的共享库做解析,就如同我们的libc一般,