白 - 权限提升和漏洞利用技巧
Windows服务
1.不安全的服务文件权限或路径
基本原理
Windows服务是一种在后台运行的计算机程序,它在概念上类似于Unix守护进程。
每个Windows服务都将其可执行文件的路径存储在称为BINARY_PATH_NAME
的变量中。当启动服务时,会检查此变量并执行其下设置的.exe
文件。
步骤
前提条件:Windows服务必须启用第3点权限,并且当前用户有启动或停止服务权限,否则必须等待系统重启才能执行恶意payload。
- 检查目标系统中的所有服务
- 枚举服务的所有权限集
- 查找
SERVICE_ALL_ACCESS
或SERVICE_CHANGE_CONFIG
是否已启用(这些权限允许用户修改服务配置和 bin 路径) - 查询该服务以检查该服务是否以更高的权限运行
- 可使用命令或恶意文件更改服务的 BINARY_PATH_NAME (binpath)
- 重启或启动服务并获得更高权限shell
实操
使用 PowerUp脚本查找错误配置,枚举机器服务寻找打开了 binpath 的服务。
<#返回当前用户可以写入服务的路径或其配置的服务#>
powershell -ep bypass
.\powerup.ps
Get-ModifiableServiceFile
找到了一个名为“daclsvc”的服务,为避免工具误报,可使用Accesschk工具再次检查此服务以确认它确实设置了SERVICE_ALL_ACCESS
或SERVICE_CHANGE_CONFIG
权限。
有启动 (service_start)权限 、停止权限,也有权更改服务“daclsvc”的可执行文件路径的权限
进一步查看一下该服务以何种权限运行
注意:大多数情况下,Windows会以 SYSTEM 或管理员权限运行所有服务
以本地系统权限运行
利用这个错误配置,可以使用sc
或service control
(默认安装)来更改此服务的可执行文件路径
可将其设置为反弹shell的可执行文件路径。再次使用sc
查询以检查设置的新路径是否正确
配置无误后,使用net
(默认安装)启动此服务即可获得 SYSTEM 权限的shell
服务已运行
2.不安全的服务文件
基本原理
可执行文件是包含可以由操作系统执行的机器码指令构成的文件,可以是特定于平台的,也可以是跨平台
步骤
前提条件:服务的 .exe(二进制文件)权限是可写的或启用FILE_ALL_ACCESS
权限以及启动/停止服务的权限
- 1.枚举所有服务以检查全部原始
.exe
(二进制文件)是否可写 - 2.使用恶意文件替换或更改原始二进制文件
- 3.刷新或启动该服务,该服务将执行其
.exe
并以 SYSTEM 权限运行上面写入的任何内容
实操
使用 winPEAS 来枚举所有可执行文件权限配置错误的服务。
在 winpeas 探测结果中,我们可以看到filepermsvc
服务的原始 .exe
为任意用户设置了AllAccess
权限。简单来说就是“系统上的所有用户都可以对该文件进行任何操作(r、w、x)”,再次使用accesschk
工具确认,这些自动化工具在加固的系统运行时可能触发告警
利用错误配置,只需修改脚本,或者在这里用恶意文件覆盖原始的 .exe
最后只需启动服务即可
注意:即使服务以localSystem
权限运行,我们也有启动和停止服务的权限
3. 注册表 (.msi利用)
基本原理
.msi 文件专为 Windows 软件而设计的,其中包含了以标准化方式(由 Windows Installer 服务管理)安装应用程序所需的信息和文件。此利用手法体现在 Windows installer数据包 (.msi) 中,数据包默认是以管理员权限运行。这意味着任何执行 .msi 数据包的用户或应用程序都会自动获得管理员权限,而无需任何用户输入或身份验证。
步骤
前提条件:下面两个注册表项值的权限都设置为 TRUE ,才能允许通过管理员工权限安装 .msi
- 检查注册表,当前用户是否允许下载 .msi
# 必须设置为 1 (0×1) 表示启用
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
- 创建一个 .msi payload 传到目标机器上,执行该 .msi 即可获得 ADMIN/SYSTEM 权限
实操
检查注册表项
两者都设置为0×1,目标机器可以尝试使用该方法提权
创建一个恶意的 .msi payload(stageless)
至于如何传到目标机上,是格局打开五花八门的,例如在 HTTP、SMB 服务器托管此恶意文件,在目标端使用 certutil、PowerShell 或 SMB 从VPS或其他服务器下载 .msi payload
目标机运行 .msi
攻击端
4.未加引号的服务程序路径
Windows服务是一种在后台运行的计算机程序,在概念上类似于 Unix 守护进程
Windows每个服务都将其可执行文件的路径写在 BINARY_PATH_NAME
的变量中。当系统启动服务时,会检查此变量并执行其下设置的 .exe文件
注意:这与上面在不安全的服务文件权限和路径所讲述的是同一回事,但是第一节中 binpath 变量是可写的,所以可以劫持。此节讲述的利用场景完全不同:在服务的 BINPATH 是安全的/不允许操作的情况下
基本原理
未加引号的服务程序路径(Unquoted Service Path)利用发生在安装了 包含空格但未包含引号的可执行程序路径的Windows服务中。
当 Windows启动服务时,系统会在服务配置中指定的路径中查找可执行文件。如果服务路径不包含引号且其中有空格,Windows 将尝试将路径的第一个单词作为可执行文件执行,并将其余单词用作命令行参数。
例如,对于服务程序的路径C:\Program Files\Script dir\service.exe
Windows系统将尝试执行:
C:\Program.exe
C:\Program Files\Script.exe (Here \Program Files dir is writable so the attacker can create a payload with the service’s extension to get it executed by OS during traversing)
C:\Program Files\Script dir\service.exe
步骤
前提条件:1.必须有服务的路径,不包含引号和空格;2.与原二进制目录相比,在更高优先级的目录中拥有可写权限
1.枚举所有服务,检查是否有某个服务的 BinPath 未被引用并且包含空格或其他分隔符
2.然后在列出的未加引号的二进制路径中找到至少一个可写目录,并且与原始目录相比,它的优先级必须更高
3.使用 sc 查询服务以检查该服务是否以 (SYSTEM/Admin) 权限运行
4.在该可写目录中创建一个恶意文件
5.重启或启动服务以使用 SYSTEM 权限执行 .exe
实操
wmic service get name,displayname,pathname,startmode | findstr /i /v “C:\Windows\system32\” |findstr /i /v """
最后,服务路径有空格或未包含在引号中
进一步检查文件目录,与原始服务程序路径相比要具有更高优先级的可写路径
没有权限写入当前目录,继续查看其他目录
获取到可以创建恶意文件的地方,在未加引号的服务程序路径上的目录中拥有完全访问 (rwx) 权限,并且此处目录的执行优先级也更高。
将恶意文件复制到可写目录并将其名称更改为 Common.exe(因为操作系统将在遍历查找期间执行此目录)
现在只需使用net start <service-name>
启动此服务,即可获得目标机器的管理员权限shell
简单总结下,原始目录是C:\Program Files\Unquoted Path Service\Common Files\UnquotedPathService.exe
, 因为 BinPath 有空格但没有用引号括起来所以可被利用提权
因此正常情况下,每当此服务启动时,Windows系统都会通过以下方式读取此BinPath
C:\Program.exe (Program Not Found)
C:\Program Files\Unquoted.exe (Program Not Found)
C:\Program Files\Unquoted Path.exe (Program Not Found)
C:\Program Files\Unquoted Path Service\Common.exe (Program Not Found)
C:\Program Files\Unquoted Path Service\Common Files\UnquotedPathService.exe (Program Found)
所以系统在找到路径上的每个空格后,会加一个 .exe
扩展名并执行。如果没有找到要执行的二进制文件,则将继续遍历,直到在完整的 BinPath 路径上找到正确的二进制文件。
攻击者要做的就是在原始服务路径之间找到一条可写路径,并使用相同的名称和扩展名创建其恶意文件,Windows 将遍历该名称和扩展名来查找执行二进制文件。
在此示例中,发现/Unquoted Path Service
目录是可写的,因此创建了恶意文件Common.exe
,使系统启动其服务时找到并执行。
5.弱注册表权限
基本原理
Windows系统中,操作系统、驱动程序、和系统安装组件、服务配置信息会存放在注册表中。而注册表,实际上是一个数据库,通过树类进行区分,如下图所示,会分成四个树类型。

在Windows中,服务有注册表键,这些键位于HKLM\SYSTEM\CurrentControlSet\Services<service_name>
,攻击者可以使用 Windows 服务上的弱注册表权限,通过修改服务的配置设置以使用提升的权限运行,进行提权。
某些服务的注册表键值ImagePath
,指定了其服务的可执行文件位置。ImagePath 值包含运行该服务的可执行文件的完整路径和文件名,以及该服务所需的执行参数或选项。
步骤
前提条件:必须有一个正在运行的SYSTEM/ADMIN
权限的服务并且其注册表项具有可写权限
- 枚举系统服务,检查目标机注册表键是否可写
- 修改服务的
ImagePath
键值(包含应用程序二进制的路径) - 重启或启动服务,将以 SYSTEM 权限在其键值指定的路径中执行二进制文件
实操
枚举目标系统服务
检查此服务的注册表项权限
regsvc
服务注册表键的权限为KEY_ALL_ACCESS
,意味着允许用户或组可以完全访问注册表键值,包括查看,修改和删除值和子键
修改服务regsvc
的imagepath
键值
更改注册表键值后,只需启动或重启服务即可以 SYSTEM/ADMIN 权限执行恶意文件