Windows服务是一种在后台运行的计算机程序,它在概念上类似于Unix守护进程。
每个Windows服务都将其可执行文件的路径存储在称为BINARY_PATH_NAME
的变量中。当启动服务时,会检查此变量并执行其下设置的.exe
文件。
前提条件:Windows服务必须启用第3点权限,并且当前用户有启动或停止服务权限,否则必须等待系统重启才能执行恶意payload。
SERVICE_ALL_ACCESS
或SERVICE_CHANGE_CONFIG
是否已启用(这些权限允许用户修改服务配置和 bin 路径)使用 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
服务已运行
可执行文件是包含可以由操作系统执行的机器码指令构成的文件,可以是特定于平台的,也可以是跨平台
前提条件:服务的 .exe(二进制文件)权限是可写的或启用FILE_ALL_ACCESS
权限以及启动/停止服务的权限
.exe
(二进制文件)是否可写.exe
并以 SYSTEM 权限运行上面写入的任何内容使用 winPEAS 来枚举所有可执行文件权限配置错误的服务。
在 winpeas 探测结果中,我们可以看到filepermsvc
服务的原始 .exe
为任意用户设置了AllAccess
权限。简单来说就是“系统上的所有用户都可以对该文件进行任何操作(r、w、x)”,再次使用accesschk
工具确认,这些自动化工具在加固的系统运行时可能触发告警
利用错误配置,只需修改脚本,或者在这里用恶意文件覆盖原始的 .exe
最后只需启动服务即可
注意:即使服务以localSystem
权限运行,我们也有启动和停止服务的权限
.msi 文件专为 Windows 软件而设计的,其中包含了以标准化方式(由 Windows Installer 服务管理)安装应用程序所需的信息和文件。此利用手法体现在 Windows installer数据包 (.msi) 中,数据包默认是以管理员权限运行。这意味着任何执行 .msi 数据包的用户或应用程序都会自动获得管理员权限,而无需任何用户输入或身份验证。
前提条件:下面两个注册表项值的权限都设置为 TRUE ,才能允许通过管理员工权限安装 .msi
# 必须设置为 1 (0×1) 表示启用
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
检查注册表项
两者都设置为0×1,目标机器可以尝试使用该方法提权
创建一个恶意的 .msi payload(stageless)
至于如何传到目标机上,是格局打开五花八门的,例如在 HTTP、SMB 服务器托管此恶意文件,在目标端使用 certutil、PowerShell 或 SMB 从VPS或其他服务器下载 .msi payload
目标机运行 .msi
攻击端
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
,使系统启动其服务时找到并执行。
Windows系统中,操作系统、驱动程序、和系统安装组件、服务配置信息会存放在注册表中。而注册表,实际上是一个数据库,通过树类进行区分,如下图所示,会分成四个树类型。
微软官方介绍
在Windows中,服务有注册表键,这些键位于HKLM\SYSTEM\CurrentControlSet\Services<service_name>
,攻击者可以使用 Windows 服务上的弱注册表权限,通过修改服务的配置设置以使用提升的权限运行,进行提权。
某些服务的注册表键值ImagePath
,指定了其服务的可执行文件位置。ImagePath 值包含运行该服务的可执行文件的完整路径和文件名,以及该服务所需的执行参数或选项。
前提条件:必须有一个正在运行的SYSTEM/ADMIN
权限的服务并且其注册表项具有可写权限
ImagePath
键值(包含应用程序二进制的路径)枚举目标系统服务
检查此服务的注册表项权限
regsvc
服务注册表键的权限为KEY_ALL_ACCESS
,意味着允许用户或组可以完全访问注册表键值,包括查看,修改和删除值和子键
修改服务regsvc
的imagepath
键值
更改注册表键值后,只需启动或重启服务即可以 SYSTEM/ADMIN 权限执行恶意文件
当用户登录资源并选择保存凭据时,Windows将它们安全地存储在凭据管理器( Windows 操作系统的一个组件,用于管理凭据并允许用户查看、编辑和删除已保存的凭据)中。
凭据保存是一项功能,允许用户安全地存储各种资源(例如网站、网络共享或远程服务器)的登录信息,这样用户就不必在每次访问这些资源时输入用户名和密码。
1.在目标系统中运行cmdkey /list
命令,从凭据管理器列出保存的所有凭据或界面操作 WIN+R
-> control keymgr.dll
2.如果找到任何更高权限的帐户,可以使用这些凭据执行一些具有该权限的命令。
注:第一段条目默认存在于 Windows 操作系统中,不需要理会。
第二段条目内容解释:
Domain:interactive
,与WIN-QBA94KB3IOF
域交互,用户帐户admin
在交互式会话的上下文中使用。Domain Password
,表明这些凭据特定于在 Windows 域环境中使用域控制器进行身份验证。WIN-QBA94KB3IOF\admin
,表示它是具有管理权限的域用户帐户。Startup App
可以定义为配置在计算机启动时自动启动的程序或应用程序。 这些应用程序在登录用户帐户时在后台自动运行。常见自启动应用程序的一些示例包括防病毒软件、即时消息客户端、云存储服务、Windows 更新和系统实用程序。
1.枚举所有启动应用程序。 有两种类型的自启动程序目录:
User自启动应用程序目录
C:\Users<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
知识点: Windows主机上每个用户都有自己的启动应用程序目录,该目录以其权限运行并且每个用户将仅运行其自启动程序目录中可用的任意二进制文件。
System自启动应用程序目录
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
知识点:系统范围的启动应用程序目录,工作原理与单用户下的相同,但它适用于所有用户,因此每当任何用户登录时它都会触发。 另外,目录下的每个二进制文件都会以
SYSTEM
权限运行
2.检查当前用户是否具有覆盖目录下某些应用程序的二进制文件的写入权限,或者检查存储启动应用程序的目录中是否启用了FILE_ALL_ACCESS
权限。
3.修改原程序的二进制文件(payload.exe名称必须与原始.exe相同)或在自启动目录中直接创建恶意程序。
4.等待用户登录活动触发恶意程序有效负载,从而获得该特定用户的权限(User自启动目录)或获得SYSTEM
权限(系统自启动目录)
检查整个系统中所有的自启动应用程序目录:
autorunsc.exe -m -nobanner -a * -ct /accepteula(Sysinternals 工具,用于枚举启动和自动运行应用程序所在的所有路径)
同时发现SYSTEM启动应用程序目录”的权限设置可以被利用
根据权限,所有buildin/Users
组成员在这个目录上拥有FULL_ACCESS
权限
BUILTIN\Users - Windows 中的默认组,向本地用户授予基本访问权限(允许基本任务和访问公共资源),同时确保他们没有系统的完全管理权限。在系统上创建的任何本地用户帐户都会自动成为该组的成员。
将恶意程序托管到该目录下,等待系统重新启动或用户登录,即可执行恶意应用程序。
在 PowerShell 中,多个实用程序监视或记录运行的所有 PS 命令。如:
历史命令:PowerShell 维护命令历史记录,是用户在当前会话期间执行过的命令的列表。此历史记录允许我们查看和访问以前执行的命令,而无需重新输入。
转录日志: 将 PowerShell 会话的所有输入和输出记录到文件中。转录日志不仅捕获用户执行的命令,还捕获这些命令的结果以及会话期间生成的任何输出或错误。
PSReadLine:PSReadLine 负责提供增强的命令行编辑和历史记录功能,包括语法突出显示、多行编辑和改进的命令历史记录导航等功能。涉及文件 ConsoleHost_history.txt:管理的简单文本文件,存储当前用户的 PowerShell 会话的命令历史记录。
1.检查所有 PS 历史文件以查找有用信息,例如凭据和其他配置信息
检查所有 PS 历史日志文件,当前没有 PS 会话在目标系统中运行,因此get-history
在这里毫无用处,转录日志服务(Transcription Logs)也没有运行,最后查看是否有任何ConsoleHost_history.txt
。
图中用户使用了cmdkey
命令并在其中记录了密码。可以在runas
中使用这些凭据来生成进程或启动具有这些用户权限的程序。