☰
Linux Setuid提权实战指南:从权限机制到OSCP靶机利用
2026/10/20 5:26:13 网站建设 项目流程

别急着提权失败就换路径,先把Setuid吃透

在OSCP备考系列里,这套“研记”已经写到了第12篇,前前后后把内核漏洞、SUDO配置、通配符陷阱过了好几轮。但老实说,每次在真实靶机或考试环境里碰到一个问题——当前用户明明在sudoers里没戏、内核补丁打得很死、可这就是有个奇怪的文件带着s权限躺在角落里——我都绕不开这条经典路径:滥用Setuid二进制文件权限实现提权。

这篇文章不是搬运GTFOBins,是我把Linux权限模型里setuid相关的机制、实验过程、踩坑点、以及OSCP视角下怎么系统性地找和测,完整梳理一遍。无论你是刚开始爬提权这条线的新手,还是已经做过几台靶机想查漏补缺,这篇都可以直接当操作手册用。

1. 这套机制到底是怎么回事

1.1 从“为什么需要Setuid”说起

现代Linux进程跑起来的时候,内核不是只看“你是哪个用户”,而是看一组ID。标准情况下每个进程至少有四类ID:真实用户ID(real UID)、有效用户ID(effective UID)、保存的用户ID(saved UID),以及对应的组ID版本。绝大多数时候,真实ID和有效ID一致,比如你用alice登录shell,bash进程的ruid和euid都是alice的UID。

Setuid位干的事,说穿了就是把可执行文件启动时的有效用户ID切换为文件所有者的ID。这个设计初衷非常朴素:让普通用户能临时以特权身份执行某个特定任务,同时不把完整的root shell交出去。

最典型的是/usr/bin/passwd。普通用户要改自己的密码,而密码存储文件/etc/shadow只有root能写。如果让每个用户都能直接改shadow,那等于把所有密码文件暴露给所有人。所以passwd这个程序被设成root所有、带setuid位——普通用户运行它时,进程的有效UID变成0,得以写shadow完成密码修改,但程序内部只做“验证旧密码、写入新密码”这两件事,不会给你一个root shell的入口。

这个设计的假设前提是:程序本身是安全的,它只做该做的事,不会把权限交给用户。问题恰恰出在这里——现实中能找到太多“该做的事没做好”的程序,这就是setuid提权的核心入口。

1.2 权限位之外的隐藏陷阱

x权限决定你能不能执行这个文件,setuid位则用s代替了执行位的位置。用ls -l看得很清楚:-rwsr-xr-x里的-rws,那个s就是setuid,如果是大写的S,说明虽然有setuid位但没有执行权限——这种文件你不会真去利用它,因为根本跑不起来,但它会告诉你系统里曾经有人对某个文件动过手脚,是个值得记下来的侦察信号。

真正阴险的是脚本文件的setuid。早期Linux内核允许shell脚本带setuid位运行,但后来因为一系列安全问题,绝大多数现代系统已经忽略脚本上的setuid位。不过如果你在靶机上遇到一个带setuid位的Python脚本、Perl脚本,别急着认为“系统会忽略它”,先去确认解释器本身的行为、/proc/sys/fs/suid_dumpable的设置、以及是否有包装器。某些环境下脚本setuid仍然可被利用,只是利用方式从“直接跑”变成“通过动态链接器或特定解释器选项触发”。

不夸张地说,OSCP的靶机设计者就爱把这些“按理说应该安全”的程序留下点后门,你要是只盯着/bin/bash那几条路,很容易错过真正的入口。

1.3 为什么这类提权在考试中频繁出现

OSCP考试限制里明确不让你用Metasploit的自动提权模块(除非有特殊说明),鼓励的是手动枚举和利用。Setuid提权恰好是个“纯手动友好型”漏洞——不需要内核源码分析、不需要复杂的ROP链,只需要你找到正确的文件、理解它的行为、然后用一个相对短的命令序列完成提权。

但另一个现实是:我在练习平台和考试环境里见过太多人倒在“枚举不全”上。大家跑完linpeas.sh看一眼输出,看到几个熟悉的setuid工具没戏就直接放弃了。实际上setuid提权最考验的不是利用代码的复杂度,而是你能不能把枚举结果和程序行为联系起来——find命令的某个选项、cp的某个特性、甚至一个看似无害的自定义备份工具,都可能成为突破口。

2. 手工枚举和高危文件识别

2.1 三条必须背下来的查找命令

找setuid文件不是靠肉眼翻目录,我有几条固定命令,在每台靶机上都会跑:

find / -perm -4000 -type f 2>/dev/null find / -perm -2000 -type f 2>/dev/null find / -perm -4000 -o -perm -2000 -type f 2>/dev/null

解释一下三条命令的区别:第一条只找setuid位(八进制4000),第二条只找setgid位(2000),第三条是并集。第三种写法实际上有个优先级问题,所以我会写成这样更保险:

find / \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null

加上-type f是为了排除目录——目录的setgid位是正常的共享目录机制,绝大多数情况下不用作为提权线索去分析。2>/dev/null则是把“权限不够读不了”的报错全部扔掉,避免噪音干扰判断。

还有一个能顺带带出文件所有者信息的写法,我会在需要做版本比对时用:

find / -perm -4000 -type f -printf "%u %p\n" 2>/dev/null | sort -u

这样能一眼看出哪些setuid文件的所有者不是root——如果某个文件的所有者是某个服务账号或者一个自定义用户,那它几乎就是给你准备的礼物。

2.2 算一算哪些文件“不该有”setuid

单纯的“文件列表”意义不大,真正的价值在于和正常系统的基线做对比。Debian系默认的setuid文件就那么一批:/usr/bin/passwd、/usr/bin/su、/usr/bin/mount、/usr/bin/umount、/usr/bin/chsh、/usr/bin/chfn、/usr/bin/gpasswd、/usr/bin/newgrp、/usr/lib/openssh/ssh-keysign这类。这些是系统组件,理论上可以通过它们获得一些能力,但通常不是“误配置”的产物。

所以我的排查习惯是:先过滤掉已知的系统setuid白名单,然后看剩余部分。比如你自己编译的一个C程序放在/tmp下带setuid位,或者某个备份脚本、某个服务程序带setuid位,这些就是真正的可疑目标。

手动做基线对比比较费时间,但linpeas.sh的输出里其实已经帮你标了颜色——红色/黄色的一般是值得关注的。不过我从来不会只依赖linpeas的结果,原因后面会讲。

2.3 判断一个文件是不是“可利用”的

拿到可疑文件清单之后,先回答四个问题:

  1. 文件所有者是谁?如果是root,那利用成功后你拿到的就是root权限;如果所有者是一个普通用户,那提权目标就要调整为那个用户。
  2. 这个文件是二进制还是脚本?二进制通常直接用,脚本要确认解释器行为和运行环境。
  3. 这个程序的功能是什么?它会不会调用shell、会不会执行外部命令、有没有读写任意文件的能力?
  4. 有没有已知的提权手法?这里就要请出GTFOBins了——每个安全测试者浏览器里都应该躺着这个站点。

以/usr/bin/find为例,正常情况下find不是setuid,但如果你在枚举结果里看到-rwsr-xr-x 1 root root /usr/bin/find,那等什么,直接利用:

find . -exec /bin/sh -p \; -quit

-p参数是防止shell在euid != ruid时自动把有效UID降回真实UID——这是sh家族的基本行为,后面我会专门解释这个坑。

另一个常见目标是cp,如果它被加上了setuid位,你可以把/etc/passwd复制出来改掉root密码哈希再覆盖回去。实际命令流程:

cp /etc/passwd /tmp/passwd.bak # 编辑/tmp/passwd.bak,把root行的哈希换成已知密码的哈希 cp /tmp/passwd.bak /etc/passwd su root

注意:这条链路能成立的前提是cp真的带setuid位,而且目标文件系统允许写入。很多系统对/etc/passwd有额外的文件属性保护(chattr +i),覆盖不进去就是覆盖不进去。

3. 从原理到实战:四种典型的利用手法

3.1 直接调用shell:从“有用的工具”到“root shell”

二进制程序带setuid位,同时它又能执行外部程序,那这个外部程序往往就成了突破口。看几个CTF和靶机里常见的例子:

vim如果带setuid位,不管文件所有者是谁,你都可以通过vim的!命令执行shell:

vim :!/bin/sh

如果vim是以root身份运行的setuid程序,这个shell就是root shell。

less / more同理,它们都支持在浏览文件时用!调用shell:

less /etc/passwd !/bin/sh

tar虽然本身不直接提供shell调用,但如果系统里有别的文件配合,也能做出一些事。这里就不展开了,GTFOBins上每个工具都有一整页姿势。

3.2 利用程序的参数注入:不那么直接但更考验分析

有的setuid程序不提供shell接口,但允许你指定“要操作的文件路径”,这时可以利用它越权读写文件。比如一个自定义的日志备份程序,它以root权限运行,允许你指定输出目录,那你就可以把日志文件写到任意位置——如果它能被触发去读取某个特定文件的内容,你就实现了任意文件读取。

这类程序的逆向分析超出纯“权限提升”范畴,但OSCP的BOF题目里经常揉在一起考。我的建议是:拿到一个陌生setuid二进制,先strings看一眼,再ltrace跟踪库调用,如果允许的话strace一把梭。很多时候不用完整逆向,光看字符串提示就能猜出它调用了什么外部命令。

有个经典模式是:程序内部调用了system("ls -l " + user_input)之类的拼接命令,如果你能让参数带上; /bin/sh,那就直接命令注入。但这种场景在“完整二进制分析”里才会大量出现,OSCP提权环节相对少见。

3.3 动态链接器劫持和环境变量注入

程序员写setuid程序时常犯一个错:没有在代码里固定PATH环境变量。这类程序如果调用system("cp ...")或system("tar ..."),它会去PATH里找可执行文件——而PATH是我们可以控制的。

export PATH=/tmp:$PATH # 在/tmp下放一个名为cp的恶意脚本

这条路径的利用前提是程序内部没有显式使用绝对路径调用外部命令。现代Linux发行版上system()函数用的是/bin/sh,而bash在euid!=ruid时会做安全降权——这是为什么这种利用经常在“看起来可行”时莫名失效,原因在3.4里详细说。

但有些程序不受影响,因为它们的调用链里走的是execve()而不是system(),或者程序的真实UID也被设置成root了(setuid程序在启动时ruid和euid都可能是root,取决于文件所有者和内核行为)。同一套手法能不能打通,取决于非常微妙的运行时状态,这也是为什么必须在靶机上实际验证而不是凭经验下结论。

另外还有LD_PRELOAD劫持——绝大多数现代系统会在执行setuid程序时忽略LD_PRELOAD,除非程序本身是一个动态加载器。所以别一看到setuid就试LD_PRELOAD,大概率浪费时间。但LD_LIBRARY_PATH在某些特殊环境下也可能无效,同样需要实测。

3.4 /bin/sh的“降权”行为和-p参数的门道

这个坑我栽过不止一次,值得单独拿出来写。

当你在一个setuid-rshell里执行/bin/sh,系统根据/proc/sys/fs/suid_dumpable等配置以及shell自身的编译选项可能让有效UID自动退回真实UID。真实UID是普通用户,所以拿到的shell还是普通用户权限,看起来“提权失败”。

解决办法有两个方向:

  1. 执行/bin/sh -p,强制保留有效UID(privilege mode)。
  2. 使用其他不检查ruid/euid不一致的shell实现,比如/usr/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'。

第一种是最常见的做法。但要注意,不是所有shell都支持-p,bash、dash显然支持,zsh我印象中在“privilege mode”下的行为也有对应选项,具体以实测为准。

$ /bin/sh -p # id uid=1000(alice) gid=1000(alice) euid=0(root) ...

注意到这里的输出,euid是0,但ruid仍然是1000——很多提权利用尝试读取root专属文件或写root目录时会遇到“权限检查用的是ruid还是euid”的问题。好消息是绝大多数权限决策看的是euid,所以euid=0就够用了。

4. 实操记录:一次完整的Setuid提权过程

4.1 场景设定与初步枚举

这算是我在练习靶机上做的一次完整实录(细节做了虚化处理)。初始情况:拿到一个低权限shell,用户是webadmin,机器是一台CentOS风格系统。

第一步永远是看身份和环境:

id uname -a cat /etc/os-release sudo -l

sudo -l结果显示没有当前用户的任何sudo权限。内核版本看起来也挺新,内核提权路径风险大、成功率低。接下来就跑setuid枚举:

find / \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null

输出里有一行很有问题:

-rwsr-xr-x 1 root root /usr/local/bin/backup-job

看到/usr/local/bin/下的文件,我下意识就会多看两眼——系统自带的setuid程序集中在/usr/bin和/usr/lib,自定义的/usr/local/bin路径基本就是管理员手工放的。

4.2 分析backup-job的行为

拿到文件先不急着跑,先看元数据和字符串信息:

file /usr/local/bin/backup-job strings /usr/local/bin/backup-job | head -50

file结果显示这是一个32位ELF可执行文件,动态链接。strings里出现了几处有意思的内容:tar、/tmp/backup.tar.gz、/var/www/html、以及调用方式。看起来这个程序做的事情是:把/var/www/html打包成/tmp/backup.tar.gz。

问题来了,它是怎么调用tar的?如果用的是system("tar czf /tmp/backup.tar.gz /var/www/html"),而且没有写死PATH,那我就可以通过控制PATH来替换掉它找到的“tar”。

4.3 构造恶意tar并触发

建一个专门的目录,放一个恶意tar脚本:

mkdir /tmp/evil cat > /tmp/evil/tar << 'EOF' #!/bin/bash cp /bin/bash /tmp/rootbash chmod u+s /tmp/rootbash EOF chmod +x /tmp/evil/tar

然后修改当前环境的PATH,让程序优先找到我们的tar:

export PATH=/tmp/evil:$PATH /usr/local/bin/backup-job

跑完之后检查:

ls -l /tmp/rootbash

如果一切顺利,/tmp/rootbash就是root所有、带setuid位的bash副本。运行它:

/tmp/rootbash -p id

输出显示euid=0,提权成功。

但这里有个非常关键的细节——如果程序里用的是绝对路径调用/usr/bin/tar,我这一整套PATH劫持就白搭了。在测试之前我并不知道是哪一种。所以本质上,我在第一轮就跑了脚本,没反应,说明它大概率用了绝对路径,或者环境里对PATH构造有特殊处理。这轮失败之后,我才做了第二轮更细的分析。

4.4 第二轮:用ltrace和strace看真实调用

ltrace /usr/local/bin/backup-job 2>&1 | head -30 strace -f -e execve /usr/local/bin/backup-job 2>&1 | grep tar

strace的输出清楚显示execve("/bin/tar", ...),是绝对路径,PATH劫持失效。

再往下看,程序在调用tar之后,还把tar生成的备份文件移动到/tmp/backup.tar.gz——而这个移动操作可能是root执行的rename系统调用,也可能调用了mv。如果调用了mv且没写绝对路径……试一下就知道。

但另一个点更吸引我:程序是不是对/var/www/html下的文件做了某种包含/排除过滤?如果它把某个用户可写的配置文件也打包进去了,而且这个配置文件在恢复时可被触发执行,那思路就转到别处去了。这一步的分析让我意识到setuid提权的另一层玩法:不一定要直接劫持程序本身,你可以劫持程序依赖的数据。

实际上最后打通的方式是这样的:backup-job在打包前会先读取/var/www/html/backup.conf作为配置文件,里面可以指定额外的打包目录和“恢复后执行的命令”。该配置文件对webadmin可写,所以我往里面塞了一条命令,等程序以root权限解析并执行了它——本质上是利用了这个程序“信任用户可写配置文件”的逻辑漏洞。这条路径比较冷门,但真实环境更常见,值得记录。

提权后的操作是:

id # uid=0(root) ... cat /root/flag.txt

二次确认没有留下可疑的历史记录后,清理现场:

rm -rf /tmp/evil /tmp/rootbash /tmp/backup.tar.gz

5. 常见问题与排查技巧实录

5.1 为什么明明找到了setuid文件却提权失败

现象可能原因排查方法
执行/bin/sh后euid回到普通用户shell的降权机制改用/bin/sh -p或python3
运行程序报“Permission denied”文件有S但无执行权限,或SELinux限制检查ls -l,查getenforce和audit日志
PATH劫持无效程序内部使用绝对路径strace看execve调用
利用脚本没有触发内核忽略了脚本setuid位确认是否是脚本,找解释器利用方式
cp /etc/passwd覆盖失败文件系统只读或chattr保护检查mount输出和lsattr /etc/passwd
提权后无法读root目录文件系统/目录权限本身限制,或SELinux contexts先id确认euid,再看目录权限

这些坑里面最阴的是SELinux——很多靶机默认没开,但有个别会开。SELinux开着的情况下,即使euid=0,进程的type域不对,照样读不了/root下的文件。判断方法:getenforce,如果是Enforcing,先别慌,看看是否有对应的boolean可以调整,或者找其他路径。

还有一个常见误解:系统自带setuid程序如/usr/bin/passwd很少能被直接提权。它们确实以root运行,但它们的主要功能“修改密码”并不会让你随意执行命令。所以枚举出/usr/bin/passwd别激动,除非你能找到漏洞CVE,否则它就是系统正常行为。同理/usr/bin/su虽然允许你切换用户,但内部会检验密码,不构成直接提权。

5.2 不能用Metasploit的情况下如何系统化手动利用

OSCP规则限制的是自动利用框架,不代表你不能用手动方式做同样的事。我的标准流程是三步:

  1. 列清单:find枚举所有setuid/setgid文件。
  2. 查GTFOBins:把每个文件名丢进GTFOBins的搜索框,看有没有标注SUID利用方法。GTFOBins会把利用方法分为sudo、suid、受限环境等分类,只关注suid列。
  3. 本地验证:在靶机上按GTFOBins的命令执行,观察输出和id结果变化。

举个实际例子,枚举结果里出现/usr/bin/env带setuid位,GTFOBins给出的方法很直接:

env /bin/sh -p

这条命令的原理是:env程序被执行时带着root的euid,然后它启动/bin/sh并传递-p参数,shell保留euid=0权限。前提是env文件本身要真的带setuid位——正常情况下/usr/bin/env不会带,如果看到它带,说明配置错误,运气好。

注意:很多人会忽略GTFOBins右上角的搜索框旁边的“SUID”标签筛选。直接看整个列表也行,但考试时间有限,筛选之后效率高很多。

5.3 一些容易被忽略的侦察细节

枚举setuid文件不只是“跑命令”,还涉及一些细节判断:

  • TLB和文件系统挂载选项:如果/tmp被挂载为nosuid,你把恶意二进制放/tmp再给它setuid位是没用的——mount的nosuid选项会直接忽略setuid位。所以做提权时,恶意文件尽量放在/var/tmp或者其他rwx+ 非nosuid的目录。
  • Owner是root但普通用户可写:检查文件权限位时别只看setuid位,如果/usr/local/bin/backup-job的所有者root但组/其他用户有写权限(比如-rwsrwxrwx),那你直接覆盖这个文件本身就行,根本不需要分析它的行为。这种情况在靶机上出题时也常见。
  • 硬链接:某些文件通过硬链接可能绕过文件系统级的限制,实际操作里会遇到,但比较稀有。知道有这回事就行,不必上来就试。
  • 程序的辅助组:除了setuid位,还可能有setgid位+某个特殊组。如果程序setgid到shadow组,且程序允许你读文件,那你可能直接读/etc/shadow。这条路径在枚举时容易被忽略,因为大家注意力都在euid=0上。

我在一台靶机上就遇到过:/usr/bin/read-gshadow这个自定义程序setgid到shadow组,而正常运行它就能读取/etc/gshadow——我直接拿到了组哈希,然后本机破解出某个用户的密码,横向移动成功。这条利用里根本就没碰setuid,但它是从setgid枚举里发现的,所以枚举时4000和2000都别漏。

5.4 环境变量梳理与清理

提权成功之后,顺手整理一下当前环境的特殊点,对后续复盘或者考试里的其他机器也有帮助:

env | sort alias cat ~/.bash_history ls -la /root/

.bash_history可能是root留下的操作记录,里面偶尔藏着数据库密码、备份路径、甚至其他机器的连接命令。但不建议依赖这些——考试环境不一定给你留这么多线索。

清理痕迹方面,主要注意:/tmp下的临时文件、.bash_history中的敏感命令、以及bash进程的/proc/self/fd指向。不过这些在考试里不是重点,重点是确认你已经拿到root shell、拿到flag,别浪费时间在“反取证”上。

5.5 复查清单:提权成功的判定标准

别看到#提示符就兴奋,shell提示符可以伪造,id的输出才是硬标准:

id # uid=0(root) gid=0(root) groups=0(root) ...

如果groups里没有0(root组),但euid是0,也行。再看一眼能不能读root专属文件:

cat /root/flag.txt /root/proof.txt 2>/dev/null cp /etc/shadow /tmp/out && wc -l /tmp/out

我习惯在执行完利用后立即跑一次cat /etc/shadow,确认权限真实生效。有些奇怪的攻击路径虽然euid看起来变了,但实际系统调用路径上还是会被SELinux或AppArmor拦截——最后一道验证永远是以实际读写root文件为准。

6. 扩展思维:Setuid之外还有哪些提权入口

6.1 其他权限位和内核能力

现代Linux用Capabilities(能力)替代了部分setuid的粗粒度权限。你可以用getcap扫描系统里带特殊能力的可执行文件:

getcap -r / 2>/dev/null

如果某个程序有cap_setuid+ep,那它可以在运行时把自己转为root UID——这本质上就是setuid的细粒度版本,利用思路一致。

Capabilities这块在OSCP教材里权重不高,但真实渗透测试中越来越常见。容器环境里cap_sys_admin、cap_dac_override加上错误配置可以直接导致逃逸或提权。靶机上遇到getcap扫出的结果不要放过,我曾经在一台机器的/usr/bin/python3上看到cap_setuid+ep,最简单的利用:

python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'

效果和setuid提权完全一样。

6.2 与SUDO配置的联动利用

sudo -l里暴露的命令,配合setuid的某些行为,可以合成更隐蔽的提权链。比如普通用户被允许以root身份运行/usr/bin/find(通过sudo),而find可以通过-exec执行shell,那这就是一条sudo提权。但setuid在这类场景的角色是:如果sudo配置里的命令本身带setuid位,或者sudo配置允许你设置环境变量(env_keep包含LD_PRELOAD),那利用复杂度就更低了。

OSCP考试中sudo提权是单独一个大类,但这篇既然讲setuid,就提醒一句:sudo配置里出现的命令,和setuid文件列举出来的命令,是两套独立清单,但可能存在交集。拿到了sudo -l的输出,也顺手跑一遍setuid枚举,用交叉对比的方式找“疑似目标”。

6.3 手动提权工具箱推荐

写到这里,顺手整理一下我在练习和考试里最常用的提权辅助命令。不用全背,但至少要知道有这些:

# 常用枚举 id; uname -a; cat /etc/os-release sudo -l find / \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null getcap -r / 2>/dev/null cat /etc/crontab; ls -la /etc/cron.* # 常用利用验证 which python3 gcc cc nc find / -writable -type f 2>/dev/null | grep -v proc | head -50

还有一份我自用的“提权路径树”思路:先看sudo、再看setuid/setgid、再看capabilities、然后看cron和可写文件、最后才考虑内核漏洞。内核漏洞放在最后不是因为不危险,而是因为成功率低、稳定性差,考试场景下不值得一开始就梭哈。

7. 实战经验总结

写到这里,我想分享几个从实战里沉淀下来的判断心得。

第一,setuid提权本质上是“信任边界”问题。系统信任了某个程序不会滥用权限,而这个程序又信任了用户输入、用户可写的配置文件、或者环境变量。你要找的不是“哪里权限最大”,而是“哪里信任链能被折断”。这个思路放到真实渗透测试里,比单纯背几个exp更通用。

第二,手动分析和现成工具要结合。GTFOBins是一张地图,但不是每个入口都有路标。拿到一个陌生setuid程序,先跑strings、ltrace、strace,确认它的调用链,再决定用哪种手法。这条方法论是我觉得最有复制价值的经验——因为靶机会变、工具会变,但“分析程序行为”的思路不会过期。

第三,多实际测试,少凭经验断言。我以前写过一个利用脚本,理论上完美无缺,跑在靶机上就是不行——后来发现是目标机编译内核时关了某个模块,导致unshare系统调用直接失败。而另一个看似不可能的路径,因为目标的/bin/sh是老版本且支持特权模式,反而一击就中。所以每一台机器都是一次新学习,别让“经验”变成“偏见”。

那回到开头的问题:setuid这条路在OSCP体系中的位置是什么?它不是最快的,多数时候不如sudo配置一击致命;也不是最炫的,不如内核漏洞听起来有排面。但它是最稳的、最容易在真实系统里重现的、最能训练你程序分析能力的一条路径。把这条路径吃透,后面遇到Windows的alwaysInstallElevated、遇到macOS的setuid绕不过去时,你都会更从容——因为底层逻辑是一样的:特权程序的信任边界可以被打破。

希望这篇研记能让你在下一台靶机上少走点弯路。如果配着GTFOBins一起食用,效果更佳。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询