首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
CTF实战:sudo提权原理与典型场景解析
📅 2026/10/21 5:58:05
✍️ 爱科研究院
👁 阅读 3,247
1. 实战思路拆解为什么CTF里sudo提权永远是热门考点刚接触CTF的人往往有个误解觉得拿到一个网站的webshell就已经是大成功。但真正打过几场线下赛和线上赛就会明白能拿到低权限shell只是比赛的起点。一道题目中经常只给你一个普通用户或者服务账户的交互式shell接下来要面对的是横向移动和纵向提权而sudo恰好是Linux系统里最常出现、也最值得研究的提权入口。CTF出题人特别喜欢在sudo上做文章原因其实很简单sudo是Linux系统自带的标准机制不属于某个具体框架或中间件不会因为版本升级就完全消失。而且sudoers配置的灵活度极高既可以给用户超高权限也可以做细粒度的命令白名单限制这种“看似限制实则有大坑”的状态天然适合出题。我打过的不少CTF题目里出题人往往故意在一台服务上配置了某个NOPASSWD的可执行命令或者保留了不合理的环境变量设置让选手有机会从普通用户跨到root。再往深了说sudo提权之所以是CTF选手必须掌握的技能是因为它在真实安全测试中同样通用。与CVE漏洞利用不同sudo提权不一定依赖某个未修复的版本缺陷很多时候纯粹是配置疏忽或者权限边界设计不合理。也就是说哪怕你已经做了很好的系统补丁管理sudo配置上的一个小瑕疵依然可能让攻击者直接拿下root。这也是为什么各大安全技能认证和CTF培训都把sudo提权列为必修内容。这篇文章适合正在备赛的CTF选手、对Linux权限机制感兴趣的安全爱好者以及需要在日常工作中排查系统权限配置的运维人员。我会从原理讲起再带着你完整走几遍典型提权操作最后把那些坑点都整理出来。内容以CTF竞赛和授权测试环境为前提请确保你只在被许可的系统中实践。2. sudo的权限模型与配置语法拆解2.1 sudoers文件的底层逻辑要玩透sudo提权先得明白sudo到底是怎么工作的。sudo的核心配置文件是/etc/sudoers推荐用visudo命令来编辑因为visudo会在保存时检查语法避免配置写错导致sudo直接不可用。sudoers里每一行规则的语法格式可以简化为user host(runas) commanduser谁能执行这条规则。host在哪些主机上生效通常写ALL。runas可以以哪个身份执行常见的有root、ALL或者某个指定用户。command允许执行的具体命令路径必须写绝对路径。CTF场景中最常看到的一个提权基础是这条配置alice ALL(ALL:ALL) ALL这表示alice可以在任何主机上以任何用户的身份执行任何命令。换算成sudo操作就是alice能直接sudo -i切换成root根本不需要什么特殊技巧。真正有挑战性的是那些“部分限制”的配置比如alice ALL(root) NOPASSWD: /usr/bin/vim这条规则意味着alice不需要密码就能以root身份运行vim后面我会演示如何用这个vim拿到shell。理解sudoers的匹配机制也很关键。sudo执行命令时会从sudoers文件顶部往下逐条匹配一旦遇到匹配的规则就用它不会再把后面的规则全部看完。这意味着有时候你看到一条很宽的规则比如用户被赋予了某个命令的root执行权限但如果你能找到一个更窄的匹配项可能就限制了你的提权路径。反过来如果配置里有一条写法不严谨的规则也可能意外给了你超出预期的权限。2.2 时间戳缓存机制容易被忽视的机会点sudo有个默认特性用户认证成功后系统会记录一个时间戳默认超时时间通常是5分钟由timestamp_timeout参数控制。在这5分钟内你再次执行sudo命令时不会要求重新输入密码直接放行。这个机制在CTF实战中的价值在于如果你是在一个已经有人用sudo登录过的会话里拿到的shell或者目标环境里正好有一个挂起的认证状态你执行sudo时可能根本不需要密码。我曾在一个靶场里看到选手一直拿着低权限shell等源码而我上去先敲了一句sudo -l结果系统直接列出了当前用户的权限根本没有要求输入密码。因为环境里的前一个会话刚好在时间戳有效期内。这个细节在真实测试里容易被忽略但它往往是快速提权的第一把钥匙。另外时间戳文件默认存放在/run/sudo/ts/目录下以用户名命名。如果你能读取这些文件的信息也可能在审计权限时派上用场。不过CTF中直接利用时间戳文件本身的情况不多更多是体现“要时刻检查环境状态”的思路。2.3 sudo -l输出里的门道sudo -l是提权前必敲的命令它的作用是列出当前用户被允许执行的命令。很多新手拿到shell以后就直接CtrlC复制了个文件出来从头到尾没想过先跑sudo -l结果错过了最明显的提权路径。sudo -l的输出可能长这样Matching Defaults entries for alice on host: env_reset, mail_badpass, secure_path/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin User alice may run the following commands on host: (root) NOPASSWD: /usr/bin/find (root) /usr/bin/vim /tmp/*.conf解读这段输出需要关注三个点。第一是NOPASSWD标签它表示执行这条命令时不需要密码这通常是出题人故意留的口子。第二是命令的绝对路径说明只有这个路径下的二进制被允许不在路径内的同名命令不会生效。第三是命令后面是否带参数限制比如上面例子中vim后面跟了/tmp/*.conf看起来有限制但后面我会说这种限制如何绕过。另外sudo -l输出的“Matching Defaults entries”部分也值得留意。如果里面出现了env_keepLD_PRELOAD之类的配置那就意味着sudo在运行时不会清除LD_PRELOAD环境变量你可以尝试环境变量劫持提权。如果出现secure_path则意味着sudo会覆盖PATH变量你的PATH劫持思路需要在别处做突破。3. 典型sudo提权场景与实操细节明确了原理之后下面进入实操环节。我从CTF中提取了四类最常见的sudo提权场景每类都会给出完整判断方法和操作命令。这些命令都经过我在多个靶场环境的反复验证你完全可以照着抄。3.1 场景一NOPASSWD下有编辑器或查看器这是CTF里最基础的sudo提权路径。当sudo -l显示你可以无密码运行vim、less、more、nano这类交互式工具并且是以root身份运行那等同于把root shell送到了你面前。以vim为例当你有如下权限(user) NOPASSWD: /usr/bin/vim拿到shell后做两件事。第一打开任意文件sudo vim /etc/passwd第二在vim的Normal模式中输入:set shell/bin/sh :shell执行以后你会直接落入一个root身份的shell。如果你面对的vim版本不支持set shell还有备选方案直接在vim中执行:!sh这个命令的含义是调用外部shell同样能拿到root shell。我见过有的同学在此卡住原因是vim处于只读模式或者文件不可写但实际上我们需要的不是写文件而是跳出到shell所以文件是否可写无关紧要。less和more也是同一个套路。运行sudo less /etc/passwd进入less后输入!/bin/shless会调用shell直接返回root环境。nano的提权方式稍微特殊一点因为nano支持执行命令的特性不是默认开启的但有的系统里通过AltX组合键能进入命令执行模式。如果你在这个场景里发现有sudo nano的权限动手试一下总没有坏处。这里要记住一个核心判断逻辑只要sudo允许你以root身份运行一个可以“派生shell”或“执行外部命令”的程序就基本拿到了提权钥匙。vi、vim、less、more、man、bash、env、awk、python、perl、ruby等都属于这类工具。3.2 场景二借助命令自身的执行参数逃逸很多时候sudoers配置看起来只允许运行某个工具但这个工具本身就自带执行系统命令的能力。安全社区把这类工具总结成了一个速查项目叫GTFOBins专门收录“可以用来逃逸权限的二进制命令列表”。CTF玩家几乎人手一份遇到不知道怎么办的sudo场景就先翻它。用find命令举例。find本来是查找文件用的但它有一个-exec参数可以执行任意命令。假设sudo -l给出了(root) NOPASSWD: /usr/bin/find在你拥有交互式shell的情况下一行就能提权sudo find / -name anything -exec /bin/sh \;这条命令会遍历文件系统找到一个文件后就以root权限执行/bin/sh。因为它执行的是“find这个命令本身”但-exec让find去调用了shell所以sudo的规则限制被天然绕过了。再举一个常用例子awksudo awk BEGIN {system(/bin/sh)}awk的system函数可以直接执行系统命令。python和perl更不用说sudo python -c import os; os.system(/bin/sh) sudo perl -e exec /bin/shtar也是经典sudo tar -cf /dev/null /dev/null --checkpoint1 --checkpoint-actionexec/bin/sh这条命令稍微绕一点我解释一下原理。tar支持checkpoint机制在压缩或解压过程中到达指定检查点时可以触发一个外部动作而这个外部动作被设定成了执行/bin/sh。因为整个行为都发生在tar的进程内所以sudo授权被绕过。观察这些命令你会发现共通点就是“让程序替你去调一个shell”。所以在实战中不妨把sudo -l列出的每个命令都去GTFOBins搜索一下看是否有已知的逃逸参数或选项。这个方法简单、高效而且生成的结果基本稳定。3.3 场景三利用LD_PRELOAD劫持动态库如果sudo规则里没有直接能派生shell的工具但你在用户目录下可以写文件并且系统里有gcc或cc编译器那么可以试试LD_PRELOAD环境变量劫持。这种手法在CTF里出现频率不低而且一旦成功可以适用于任何“sudo允许执行某个二进制”的场景。LD_PRELOAD的原理是当程序启动时动态链接器会优先加载LD_PRELOAD指定的共享库然后其中的函数可以拦截并替换程序原本调用的库函数。我们可以写一个共享库在它被加载时直接执行/bin/sh。先准备一段C代码保存为shell.c#include stdio.h #include sys/types.h #include stdlib.h void _init() { unsetenv(LD_PRELOAD); setgid(0); setuid(0); system(/bin/sh); }然后编译成共享库gcc -fPIC -shared -o shell.so shell.c -nostartfiles接下来用sudo加载这个共享库执行一个任意被允许的程序。假设你有一条sudo权限是(root) NOPASSWD: /usr/bin/id那么执行sudo LD_PRELOAD/tmp/shell.so /usr/bin/idid命令本身只是用来打印当前用户信息但LD_PRELOAD劫持在程序加载阶段就抢跑了程序还没正常运行我们构造的_init函数就为我们弹出了一个root shell。这种做法有个很重要的前提sudo的env_reset配置不会清除LD_PRELOAD。在高版本的sudo中默认会清理危险环境变量所以你需要先看sudo -l输出的Defaults条目中是否存在env_keepLD_PRELOAD等字样。如果没有这条路可能走不通。CTF中如果配置了env_keep这条路径的成功率极高。还有一个细节需要注意编译共享库时用了-nostartfiles参数这是为了让_init函数成为入口点而不是默认的_start。如果你不写这个参数共享库也能编出来但_init不一定会在加载时被调用。3.4 场景四sudo调用脚本时的PATH劫持有时候sudo -l显示允许某条自定义脚本以root身份运行但脚本本身不是二进制文件而是个shell脚本。这种情况下哪怕你没有直接执行任意命令的能力脚本内部对外部命令的调用也可能被劫持。举个例子假设sudoers里配置了(root) NOPASSWD: /usr/local/bin/backup.sh你查看backup.sh的内容发现它调用了tar命令但写的是tar -czf /backup/data.tar.gz /data这里的tar没有使用绝对路径。如果脚本在执行时会从上到下扫描PATH目录找到明确指定的可执行文件。由于你是普通用户你可以在自己的目录下创建一个同名假脚本tar内容直接是#!/bin/sh /bin/sh -i接着设置PATH变量指向你的目录export PATH/home/alice/bin:$PATH然后执行sudo /usr/local/bin/backup.sh当脚本跑到tar那一步时系统会在PATH里查找tar由于你的目录排在前面就会执行你的伪造tar从而以root身份弹出一个shell。这种手法成立的关键条件是sudo执行脚本时没有重置PATH。现在很多系统的sudo都配置了secure_path会强制把PATH恢复成默认安全值这时候你的PATH劫持就不会生效。判断方法同样是看sudo -l输出的Defaults条目里是否有secure_path。如果存在secure_path你可以尝试修改脚本可写的内容或者寻找其他可修改路径的方法。4. 常见问题与排错技巧实录上面这些操作我看着简单但实际敲的时候总会有各种意外。下面整理几个我在靶场和测试环境中频繁遇到的问题以及对应的排查思路。4.1 为什么sudo -l的时候要求输密码但自己不知道密码CTF里拿到的低权限shell经常不知道账户密码这时候遇到sudo要求输密码就卡住了。我的经验是先把当前用户的密码相关提示记录下来然后去检查是否配置了NOPASSWD。有NOPASSWD标签的命令即使不知道密码也能以root身份运行因为规则本身免密。真正无解的是那些需要密码又没有免密配置的情况这时只能寻找其他途径比如suid文件或可写文件提权。另外提一个检查点sudo -l本身在有些配置下不需要密码就可以列出权限。如果你发现命令行卡在密码提示可以先试着按CtrlC再检查是否有别的用户身份可切换比如sudo -u user命令配合其他已知用户名。4.2 命令有效但始终没弹回root shell这种情况通常是对工具交互方式不够熟悉。比如vim的:!sh执行后如果vim本身在受限模式下运行可能不会正常弹shell。解决办法是换个方式先:set shell/bin/sh再:shell或者尝试直接:!/bin/bash。另外执行完:!sh后shell是作为子进程启动的这时候你可能还需要再输入exit返回vim容易让人误解成操作失败注意观察shell提示符的变化。还有一种常见问题是sudoers里指定了命令后跟了参数比如(root) NOPASSWD: /usr/bin/vim /tmp/*.conf看起来vim只能编辑.conf文件但实际上参数限制很容易绕过。执行命令时只要把路径写成满足匹配条件的文件再借助vim的escape功能即可。实际操作中直接进入vim打开任意一个.conf文件然后执行:!sh一样能拿到shell因为sudo校验的是“命令最终运行的程序路径”而不是你在程序内部做了什么。4.3 老版CVE尝试无效版本差异导致手法失效sudo的历史上出现过几个知名提权漏洞比如某个版本中如果sudoers里配置了ALL但不是root时可以借助用户ID参数绕过来获取root权限。这类漏洞在旧版本中真实存在但现在主流系统的sudo版本都已经修复。在CTF里除非题目明说是老版本系统否则不建议把时间浪费在尝试旧CVE上优先把配置文件分析和GTFOBins搜索的路径走通效率会高得多。版本差异还体现在LD_PRELOAD上。sudo从1.8.28开始默认会清除LD_PRELOAD除非sudoers里有明确的env_keep配置。在判断LD_PRELOAD是否能用时除了看sudo -l的Defaults输出还可以直接看sudo的版本sudo --version如果版本高于1.8.28且未看到env_keepLD_PRELOAD直接放弃这条路省下编译时间。4.4 环境中没有gcc怎么办在这种场景下LD_PRELOAD的编译就做不了但不代表没有出路。可以先看看系统里有没其他编译工具比如cc、clang、tcc。如果都没有尝试借用系统已有的二进制来构造动态库加载环境。比如Python如果可以在你的权限下执行你可以用Python的ctypes库来加载共享库而不是依赖gcc编译出.so文件。另外如果sudo允许运行某个脚本时校验不够严格也可以直接修改脚本内容不一定要走环境变量劫持。先看看这个脚本的属主和写权限也许它权限配置比较松你就直接把system(/bin/sh)写进去了。判断脚本是否可写的命令是ls -l /usr/local/bin/backup.sh如果所有者是root但其他用户也有写权限那你等于找到了一个直接的root代码执行点。4.5 本地提权成功但没有交互shellCTF的打法经常是通过反连shell来操作而不是坐在靶机屏幕前敲键盘。如果你拿到的是非交互式shell或者只有一个远程命令执行点那些需要交互界面才能触发的vim、less提权方式就用不上。这时候优先选择不依赖交互的命令比如find的-exec、awk的system、python的os.system这些都是一行命令直接出结果特别适合写进你的提权脚本里。如果被迫用vim这类交互工具也是可以通过管道或者参数来逼近交互效果。比如在非交互环境下尝试echo :!sh | sudo vim -n -u NONE这种方式虽然比较挑环境但在某些配置下确实能绕过交互需求。不过我的建议还是优先选非交互命令稳定且不易出错。5. 提权后的巩固思路与环境信息利用当你成功拿到root shell后CTF题目并不会立刻结束。有些题目的flag只是随手放在root下但另一些题目需要你进一步梳理环境、还原攻击路径。我的习惯是先把权限稳定住再收集信息最后才去读取flag。提权后首先要做的不是急着找flag而是确认自己当前确实是root并了解系统的基本状态id whoami uname -a cat /etc/sudoers | grep -v ^# | grep -v ^$root身份意味着你可以重新配置sudoers文件把后门保持下来或者以后免密切换。不过CTF环境下大多数时候你只需要在当前会话里拿到flag即可修改系统配置反而容易引入不确定性我自己一般只在有后续任务需求时才动sudoers。在提权过程中我还会习惯性地收集sudoers里其他用户的权限配置有时候同一个shell可以横向扩散到其他机器的账户形成整套渗透路径。比如某个非root用户拥有一组命令权限而你能完成sudo提权后再切换过去利用它可能打开新的突破口。这部分在红队测试里比较有用CTF的团队赛里也能为队友提供便利。环境信息整理也有讲究。拿到root shell后建议先执行cat /etc/passwd | grep -v nologin env ps aux这些信息能帮你快速理解这台机器的服务架构判断flag到底存放在哪个服务目录下。我曾经在一个靶场里看到选手已经拿到了root但因为没有查看环境变量漏掉了一个由环境变量指向的隐藏目录白白多花了半小时。6. 一套高效练习sudo提权的复盘方法sudo提权这东西看十遍不如亲手敲一遍。我强烈建议你自己搭一个虚拟机或者用现成的靶场环境反复练到肌肉记忆。下面是我自己的复盘流程每次做完都按照这个路子梳理一遍。第一步先跑sudo -l把输出中的每条规则抄下来标注每个命令属于下面哪一类能直接派生shell的交互工具vim/less/nano带执行外部命令参数的工具find/awk/tar/python可尝试LD_PRELOAD劫持的环境可能被PATH劫持的自定义脚本第二步针对每一条规则去GTFOBins上搜索把对应的逃逸命令记下来。不要只记一个命令因为不同版本的二进制可能参数有差异多记一个备选方案会更有把握。我的速查表里每个工具都留了三四个变种真到比赛时总能碰到一个能用的。第三步测试完成后重新看一遍sudoers配置思考出题人设置这条规则的漏洞成因。这个思考过程比命令本身更重要只有理解了“为什么这条规则能被绕过”你才能举一反三。比如我看到NOPASSWD: /usr/bin/vim时脑海里立刻会跳出“vim逃逸”这组关键词看到tar时则马上想到checkpoint这是一种条件反射靠练。第四步把这些经验记录成自己的模板。我的笔记里已经积累了几十个提权模板每条模板都包含触发条件、操作指令、预期输出、失败原因。比赛时遇到陌生的sudo权限直接检索自己的模板库比现场翻资料快得多。这个复盘方法对新手特别友好。初学者不需要背几十条命令而是先掌握一种“看到规则去搜索、搜到命令去执行、失败后去排查”的循环熟练以后自然就有了自己的提权感觉。最后提醒一句sudo提权练习一定要在自己搭建或明确获得授权的环境中进行别在未授权机器上乱敲命令。CTF比赛本身就是为了让大家在安全环境下锻炼技能你练得越多对这种边界就越有分寸感。希望这篇内容能帮你在之后的比赛里少走几步弯路。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/21 5:58:05
轻量级数据库建模工具db-designer:从ER图到DDL的一体化设计实践
2026/10/21 5:53:05
中考物理模拟卷:暴露概念迁移与实验逻辑断层的诊断工具
2026/10/21 5:53:05
激光3D打印机设计说明书:光路-运动-控制三域协同的工程证据链
2026/10/21 6:53:22
景区信息管理系统中的图算法实战:Dijkstra、Prim与DFS/BFS实现
2026/10/21 6:53:22
CT工作原理教学PPT:从X射线衰减到断层图像的完整成像链解析
2026/10/21 6:53:22
卷积特征可视化实战:从特征图到Grad-CAM的PyTorch调试指南
2026/10/21 6:53:22
lingbot-map 深度解析:智能体地图映射与路径管理实战
2026/10/21 6:53:22
SpringBoot+Bootstrap+MyBatis旅游信息平台毕设全解析
2026/10/21 6:48:21
三招驯服Claude Code:从人工智障到代码智能持续进化
2026/10/21 0:01:44
ClickHouse实战:从列式存储到亿级数据秒级查询
2026/10/21 0:01:44
高效筛选arXiv机器学习论文:四步法实战指南
2026/10/21 0:01:44
Python爬取百度迁徙数据:接口签名、反爬与SQLite存储实战
2026/10/20 16:07:12
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/20 7:57:25
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/20 16:49:38
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/20 2:24:03
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/20 2:23:57
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/20 2:23:53
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)