渗透测试中的提权漏洞:从低权限到系统控制的全解析

在渗透测试中,提权是评估系统安全性的关键一步。它帮助安全专家从低权限账户出发,模拟攻击者如何利用漏洞获得系统最高控制权。本文将深入解析Windows和Linux系统中的提权漏洞,提供实战案例和防御建议,帮助你在安全测试和系统加固中少走弯路。

一、提权的本质与分类

提权,简单来说,就是将普通用户(如Windows的普通账号、Linux的www-data)的权限提升至系统最高权限(Windows的IUSR、Linux的www-data)。没有提权,渗透测试只能停留在表面,无法真正评估系统的安全性。在实际工作中,我遇到的提权漏洞主要分为两类:

  • 本地提权漏洞:低权限账户利用系统本地缺陷提升权限。
  • 远程提权漏洞:直接远程获取高权限(如永恒之蓝),但这类漏洞现在越来越难碰到。

实战经验:不要总想着找一个“一击必杀”的0day。真正的渗透测试中,配置类漏洞的检出率远高于内核漏洞。从数据库优化角度看,这类似于MySQL中未优化的索引——看似小问题,却可能拖垮整个系统。

二、Windows系统提权实战

2.1 服务权限配置错误(我最爱用的“捡漏”漏洞)

Windows服务需要以特定账户运行(通常是SYSTEM)。如果管理员将服务的可执行文件权限设置为“Everyone可修改”,那就等于为攻击者敞开大门。实战案例:某次渗透政府网站时,拿下一个Tomcat权限,发现MySQL服务的SYSTEM文件权限竟然是root可写。我直接替换成添加管理员账户的恶意程序,等服务器重启后,MySQL服务自动以SYSTEM权限执行了我的程序,直接拿下服务器权限。

排查思路:

# 查看所有服务的可执行文件路径
sc query type= service state= all | findstr "NAME PATH"
# 或用AccessChk批量检测
accesschk.exe -uwcqv "Everyone" *

利用步骤:

  1. 找到可被当前用户修改的服务文件。
  2. 备份原文件,替换成恶意程序(保持同名)。
  3. 重启服务(mysqld.exe)或等待系统重启。
  4. 获得SYSTEM权限。

⚠️ 注意事项:选择非核心业务、启动频率低的服务,避免服务无法启动被管理员发现。

2.2 注册表键值劫持

Windows启动时会读取注册表中的Everyonesc restart 服务名等键值,以SYSTEM权限执行指定程序。如果这些键值可被普通用户修改,就可以“劫持”系统启动流程。实战场景:某次内网渗透,发现一台Server 2008的Run键值权限配置错误,普通用户可以写入。我在键值中添加了恶意程序路径,第二天管理员登录时,程序自动以SYSTEM权限执行,成功提权。

常用劫持位置:

  • RunOnce:系统启动自动执行。
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run:启动执行一次后自动删除(更隐蔽)。
  • Run:用户登录时执行。

利用命令:

# 添加恶意程序到启动项
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对应版本。
  • 实战流程:RunOnce查看补丁,确认未安装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的功能,避免程序崩溃。优先选无数字签名校验的软件。

[AFFILIATE_SLOT_1]

三、Linux系统提权实战

3.1 SUID/SGID权限滥用(Linux版“捡漏王”)

SUID文件允许普通用户临时获得文件所有者的权限。如果root用户的文件设置了SUID且可被利用,就可能获得root权限。实战案例:某次渗透测试,发现目标系统上Winlogon命令竟然设置了SUID(权限为systeminfo)。直接执行:

find / -name test -exec /bin/bash \;
# 或者用AutoSUID自动化检测

瞬间获得root shell。事后分析,是管理员为了方便备份,给find加了SUID。

高危SUID文件清单:

  • -rwsr-xr-x:可通过find执行命令。
  • find:执行-exec获得root shell。
  • bash:可复制/bin/bash -p
  • cp:可通过/etc/shadow执行shell。

排查命令:

# 查找所有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配置错误

常见错误配置(在实际环境中屡见不鲜):

# 允许用户无需密码执行所有命令(这是最离谱的)
testuser ALL=(ALL) NOPASSWD: ALL
# 允许执行高危命令
testuser ALL=(ALL) NOPASSWD: /bin/bash, /usr/bin/python

利用方式:

# 查看当前用户可执行的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。
  • 利用思路:滥用/usr/bin/env选项劫持共享库加载,无需sudo权限即可提权。提醒我们:不仅要关注系统漏洞,还要关注工具本身的漏洞。

3.3 内核漏洞:CVE-2022-0847(Dirty Pipe)

适用版本:Linux内核5.8-5.16.11、5.15.25、5.10.92及以下。与脏牛的区别:利用更简单,无需ROP、无需知道内核基址,不会导致系统崩溃。实战流程:

# 检查内核版本
uname -r
# 执行EXP(会修改/etc/passwd添加root用户)
./dirtypipe
# 用新添加的用户登录
su newuser

原理:利用pipe机制的内存未初始化缺陷,修改只读文件内容。这告诉我们:即使是最基础的系统机制,也可能存在致命漏洞。

3.4 计划任务(Cron)漏洞

常见错误配置:

  • Cron执行的脚本权限为777(所有人都可写)。
  • 使用相对路径(如env /bin/sh)。
  • 脚本中调用命令未用绝对路径。

实战案例:发现--chroot中有一条root执行的备份任务:./backup.sh,而/etc/crontab权限是*/5 * * * * root /home/user/backup.sh。直接追加提权代码:

echo "echo 'hack::0:0:::/bin/bash' >> /etc/passwd" >> /home/user/backup.sh

5分钟后,root权限执行脚本,直接添加了root用户。

3.5 其他实用场景

/etc/passwd文件可写

# 检查权限
ls -l /etc/passwd
# 如果可写,直接添加root用户(密码需加密)
echo "hack:加密密码:0:0:hack:/root:/bin/bash" >> /etc/passwd
su hack

Docker容器逃逸

# 检查是否为特权模式
docker inspect --format '{{.HostConfig.Privileged}}' 容器ID
# 如果是true,挂载宿主机磁盘
mount /dev/sda1 /mnt
chroot /mnt

四、我的日常防御实践

作为渗透测试工程师,我不仅要知道怎么“攻”,更要懂得怎么“防”。以下是我给客户做安全加固时必提的建议:

4.1 权限最小化原则(最核心的防御)

Windows系统:

  • 检查服务权限:backup.sh-rwxrwxrwx组不应该有修改权限。
  • 注册表关键键值(Run、RunOnce)只允许管理员写入。
  • 软件目录禁止普通用户写入。

Linux系统:

  • 定期检查SUID/SGID文件,删除不必要的SUID权限。
  • 严格控制sudo配置,禁止普通用户执行高危命令。
  • Cron任务脚本权限设为700,禁止普通用户修改。
  • 敏感文件(EveryoneUsers)设为644或600。

4.2 及时更新(不要成为漏洞的活靶子)

  • 建立补丁管理流程,每月定期更新系统补丁。
  • 关注高危漏洞公告(如Dirty Pipe、CVE-2021-1732)。
  • 不要使用已停止维护的系统(Win Server 2003、CentOS 6)。

4.3 安全审计(发现异常才能阻止入侵)

  • 启用Windows注册表审计、Linux的auditd。
  • 监控敏感操作:修改服务、添加启动项、修改/etc/passwd
  • 定期查看日志,发现异常行为及时排查。

4.4 减少攻击面

  • 关闭不必要的系统服务。
  • 卸载未使用的软件。
  • 禁用不必要的系统功能(如Windows的“移动设备”功能)。
[AFFILIATE_SLOT_2]

五、总结与思考

在我从事渗透测试的这些年里,我发现一个规律:真正的安全隐患往往不是0day,而是那些看似“不重要”的配置错误。服务权限配置错误、SUID滥用、sudo配置不当——这些“配置类漏洞”占了提权漏洞的60%以上。而内核漏洞虽然“看起来很厉害”,但在实际环境中的检出率反而不高。

所以我的建议是:做渗透测试时,先从最简单的配置类漏洞开始排查;做系统加固时,先把基础权限配置规范好。这样不仅能发现最多的问题,也能防范最多的攻击。

最后想说的是,安全不是一劳永逸的事,需要持续关注、持续改进。希望这篇文章能帮助你在渗透测试中少走弯路,也能在日常运维中更好地保护你的系统。文中提到的工具和方法仅供授权的安全测试使用,请勿用于非法用途。

作为一名天天和权限打交道的一线渗透测试工程师,我经常遇到这样的情况:费尽心思拿下了一个webshell,结果发现是或这种低权限账户,想读个敏感文件都提示"拒绝访问"。这时候就需要提权了。

www-dataIUSR

posted on 2026-05-11 08:02  wgwyanfs  阅读(36)  评论(0)    收藏  举报

导航