在Windows系统提权的江湖里,有一种漏洞,它既不靠缓冲区溢出,也不玩内核态的骚操作,而是静静地潜伏在系统服务的配置里,等待着粗心的管理员或不规范的软件 installer 将它唤醒。它就是——不带引号的空格提权(Unquoted Service Path)。
这个漏洞被微软戏称为“脚本小子报告的新宠儿”,但在实际的渗透测试和红队对抗中,它依然是一把劈开低权账号、直取 SYSTEM 大权的利刃。今天,我们就来扒一扒这个“老古董”漏洞的底裤,看看它是如何让系统翻车的。
一、 追本溯源:为什么一个空格就能提权?
要理解这个漏洞,我们得先聊聊 Windows 服务控制管理器(SCM)的一个“古老习惯”。
想象一下,你在 CMD 里敲下一行命令:
C:\Program Files\Awesome App\service.exe
如果没有引号,Windows 的命令行解析器会怎么想?它会认为C:\Program是一个程序,后面跟着参数Files\Awesome和App\service.exe。但因为找不到C:\Program.exe,它会继续往下试,直到拼凑出完整的、正确的路径。
不带引号的空格提权,本质上就是利用了 Windows 在解析带空格文件路径时的“贪婪匹配”机制。
如果一个服务的可执行文件路径是这样配置的(注意,没有双引号):
C:\Program Files\Vulnerable App\LegitService.exe
并且,这个服务是以高权限(比如 SYSTEM 或 Administrator)运行的。那么,当系统启动这个服务时,它不会直接报错,而是会像瞎子摸象一样,从最前面的路径开始,依次尝试执行以下程序:
C:\Program.exeC:\Program Files\Vulnerable.exeC:\Program Files\Vulnerable App\LegitService.exe
攻击的精髓来了: 如果攻击者能在C:\` 或C:\Program Files`目录下偷偷放一个名为Program.exe或Vulnerable.exe的恶意程序,那么当服务重启时,系统就会优先执行攻击者植入的恶意程序,并且继承该服务的高权限!
二、 实战演练:从“破烂王”到低权用户,再走向 SYSTEM
在实战中,利用这个漏洞就像是在玩一场“路径拼图”游戏。假设你已经通过 Webshell 或钓鱼邮件拿到了目标机器上的一个低权限账号(比如cmarko),接下来该怎么做?
第一步:翻箱倒柜找“漏洞服务”
我们需要用 WMI 命令把所有服务拉出来溜溜,筛选出那些路径带空格、没引号,并且是自动启动的服务:
cmd
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """如果运气好,你会看到类似这样的回显:
VulnService Vulnerable Service 1 C:\Program Files\Vulnerable Service1\Service.exe Auto
第二步:勘察地形,找“可写目录”
光有漏洞路径还不够,你得能把恶意文件塞进去。通常,普通用户是没有权限往C:\` 或C:\Program Files里写文件的。这时候就需要用到icacls` 命令来查看目录的 ACL(访问控制列表)权限了。
cmd
icacls "C:\Program Files"如果你发现该目录的权限里包含(M)(修改权限)或(F)(完全控制),甚至(W)(写入权限),并且是针对普通用户或Authenticated Users组的,那恭喜你,突破口找到了!
第三步:投毒与“守株待兔”
既然有了写入权限,我们就可以把编译好的恶意程序(比如一个反向 Shell 的 exe)上传到可利用的路径下。例如,如果我们对C:\Program Files有写权限,就上传一个名为Vulnerable.exe的程序。
接下来怎么办?等着!
如果这个服务平时很少重启,我们可以手动尝试停止并启动它(如果有相应权限的话):
cmd
sc stop "VulnService" sc start "VulnService"更绝的是,如果你有SeShutdownPrivilege权限(即使显示为Disabled也可以在某些情况下生效),你可以直接发个重启命令,等系统再次上线时,你的恶意程序就会以高权限运行,从而完成提权。
三、 拨开迷雾:这真的是高危漏洞吗?
看到这里,你可能会觉得:“哇,那岂不是满地都是 SYSTEM 权限?”
别急,微软的工程师们早就考虑到了这一点。在默认情况下,Windows 系统的核心目录(如C:\`、C:\Program Files`)的权限是极其严格的。 普通用户根本无法在这些目录下创建文件。
正如微软官方博客所言,大多数报告上来的“不带引号空格提权”漏洞,其实都位于这层严密的防御之下,属于“不可利用”的范畴。真正的漏洞往往诞生于:
第三方不规范软件: 它们在安装时粗暴地更改了目录权限,或者在注册表里写下了不合规的服务路径。
管理员的“上帝模式”: 某些管理员为了图省事,直接用管理员权限运行一切,甚至放宽了关键目录的 ACL。
所以,这个漏洞更像是一个“系统基线配置是否达标”的试金石。
四、 亡羊补牢:如何修补这道“空格门”?
无论是作为防守方还是开发人员,防范这种低级错误的成本几乎为零。
1. 加引号!加引号!加引号!
在编写安装脚本或注册服务时,只要路径中包含空格,必须使用双引号将路径包裹起来。这是最根本的解决办法。
正确示范:
sc create MyService binPath= "\"C:\Program Files\My App\service.exe\""
2. 收紧权限(最小权限原则)
定期检查系统服务的配置权限,确保只有SYSTEM和Administrators组才有权修改服务配置。可以使用accesschk等工具进行权限审计。
3. 规范目录 ACL
千万不要随意放宽C:\`、C:\Program Files` 等关键目录的写入权限。对于第三方应用,尽量将其隔离在专用的、权限受限的目录中。
💡 互动时刻:你的“赛博直觉”还在线吗?
看完这篇文章,你是否也回忆起了自己曾经在渗透测试中利用(或被这个漏洞坑过)的某个深夜?
我们在评论区发起一个“一句话避坑”征集:
除了不加引号,你在 Windows 提权中还见过哪些“令人窒息的操作”或“阴间漏洞”?
无论是AlwaysInstallElevated的降维打击,还是 Potato 家族的魔法攻击,亦或是你踩过的各种奇葩 CVE,欢迎在下方留言分享!让我们一起在互相吐槽中,把系统安全的大门焊得死死的!👇