sudo -l 权限提升

ste*_*man 4 sudo privileges

我正在做一个 ctf,我正处于它的最后一步——权限升级。使用该sudo -l命令,输出是这样的:

Matching Defaults entries for nick on 192:

    always_set_home, !env_reset, env_keep="LANG LC_ADDRESS LC_CTYPE LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC
    LC_PAPER LC_TELEPHONE LC_ATIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE",!insults, targetpw

User nick may run the following commands on 192:
    (ALL) ALL
    (root) NOPASSWD: /restart-apache
Run Code Online (Sandbox Code Playgroud)

我知道 env_reset 不应该被禁用,但我不知道如何使用它来获得 root 访问权限!

$ file restart-apache
restart-apache: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, BuildID[sha1]=1b1a4ab278b2d1be83e8b14adfc358cfd277d655, for GNU/Linux 3.2.0, with debug_info, not stripped
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 6

从 sudoers 手册页:

但是,如果该env_reset选项被禁用,则任何没有被env_checkenv_delete选项明确拒绝的变量都将从调用过程中继承。

因此,您可以将任意环境变量插入到启动的进程中。

您没有显示程序/restart-apache是什么类型,但如果恰好是一个 shell 脚本,这应该很容易。你能想到会影响它做什么的任何环境变量吗?当 shell 脚本运行几乎任何命令时,究竟会发生什么?它在哪里找到它?

好吧,事实证明我没有走运,而是一个实际编译的程序,所以它可能不会通过PATH. 它仍然可能,但很难指望这一点。

来自的输出file看起来可能会被截断:我从中得到的输出file /bin/ls是这样的(拆分为多行):

/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
for GNU/Linux 2.6.32, BuildID[sha1]=3c233e12c466a83aa9b2094b07dbfaa5bd10eccd,
stripped
Run Code Online (Sandbox Code Playgroud)

(问题的输出中缺少解释器的完整路径。)

如果您的程序使用ld-linux-x86-64.so.2,就像所有“正常”动态可执行文件一样,我们可以开始查看运行此类程序时实际发生的情况。例如从这里:什么是/lib64/ld-linux-x86-64.so.2,为什么它可以用来执行文件?.

剧透:程序本身并不是最先运行的。

我们还可以找到动态链接器手册页。该手册页列出了一些有趣的环境变量,它们会影响程序在启动时的设置方式,名称类似于LD_*. 您可能需要进行一些编码才能让它按照您的意愿行事。