cve-2021-3156分析

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一般,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值