[春秋杯2023]Misc sudo(记CVE-2023-22809)

文章详细分析了sudo编辑器在处理用户环境变量时存在的漏洞,特别是SUDO_EDITOR、VISUAL和EDITOR如何被利用进行权限提升。通过环境变量注入额外参数,攻击者可以改变编辑文件列表,影响sudoers策略,实现权限升级。文中提供了一个利用示例,展示了如何通过修改环境变量和sudoedit命令来修改系统敏感文件,如/etc/passwd,从而改变用户权限。

对我来说还是有点难了,web方向的phpstudy那道题,不知道为什么,xss就是打不进去,第二道python反序列化还没有理解,所以就先发一道misc


MISC

sudo

CVE-2023-22809

一、漏洞范围

sudo 1.8.0到1.9.12p1版本受影响

二、漏洞概述

sudo使用用户提供的环境变量让用户选择他们所选择的编辑器。的内容其中一个变量扩展了传递给sudo_edit()函数的实际命令。

然而,后者依赖于--参数的存在来确定要编辑的文件列表。注入在一个已授权的环境变量中使用额外的--参数可以更改此列表并导致特权通过编辑具有RunAs用户权限的任何其他文件来升级。这个问题发生在sudoers之后。

三、漏洞成因

由于Sudo中的sudoedit对处理用户提供的环境变量(如SUDO_EDITORVISUALEDITOR)中传递的额外参数存在缺陷。当用户指定的编辑器包含绕过sudoers策略的 -- 参数时,拥有sudoedit访问权限的本地攻击者可通过将任意条目附加到要处理的文件列表中,最终在目标系统上实现权限提升。除外,该漏洞还影响部分QNAP操作系统:QTS、QuTS hero、QuTScloud、QVP(QVR Pro设备)。

猜测:我们可以利用SUDO_EDITOR、VISUAL、EDITOR传递参数进行提权攻击

四、漏洞分析

sudoers策略插件首先调用sudoers_policy_main()来处理的查找和验证使用sudoers_lookup()的策略。不过,在此功能结束后,策略成功验证时,使用名为find_editor()的编辑器查找方法重写命令。

// plugins/sudoers/sudoers.c@sudoers_policy_main()
int
sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
 bool verbose, void *closure)
{
 // [...]
 validated = sudoers_lookup(snl, sudo_user.pw, &cmnd_status, pwflag);
 // [...]
 if (ISSET(sudo_mode, MODE_EDIT)) {
 // [...]
 safe_cmnd = find_editor(NewArgc - 1, NewArgv + 1, &edit_argc, &edit_argv, NULL,
&env_editor, false);

代码解释:

该代码片段是在sudoers/sudoers.c文件中的sudoers_policy_main函数的一部分。与sudo程序中sudoers策略的实现相关,该策略负责确定是否允许用户以管理员权限执行给定的命令。

在这个特定的代码片段中,sudoers_policy_main函数被传入了几个参数:argcargv,表示传递给sudo的命令行参数,pwflag是一个表示与密码相关的行为的标志,env_add是一个要设置的额外环境变量数组,verbose是一个表示是否启用详细输出的标志,closure是一个指向其他数据的通用指针。

在函数内部,调用了sudoers_lookup函数,传递了snl(可能是某种数据结构)和sudo_user.pw(表示sudo用户的密码)作为参数,并将结果保存在validated变量中。然后,根据sudo_mode中的MODE_EDIT标志,执行了一些与编辑器相关的操作,其中find_editor函数用于查找适当的编辑器并返回相关参数。

该函数首先使用用户提供的三个环境变量执行编辑器查找文档,SUDO_EDITOR, VISUALEDITOR

// plugins/sudoers/editor.c@find_editor()
char *
find_editor(int nfiles, char **files, int *argc_out, char ***argv_out,
 char * const *allowlist, const char **env_editor, bool env_error)
{
 // [...]
 *env_editor = NULL;
 ev[0] = "SUDO_EDITOR";
 ev[1] = "VISUAL";
 ev[2] = "EDITOR";
 for (i = 0; i < nitems(ev); i++) {
 char *editor = getenv(ev[i]);
 if (editor != NULL && *editor != '\0') {
 *env_editor = editor;
 editor_path = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leafzzz__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值