news 2026/9/23 4:45:45

PowerSploit 提权审计实战:用 Invoke-PrivescAudit 一键排查 Windows 本地提权隐患

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PowerSploit 提权审计实战:用 Invoke-PrivescAudit 一键排查 Windows 本地提权隐患

PowerSploit 提权审计实战:用 Invoke-PrivescAudit 一键排查 Windows 本地提权隐患

【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit

本文围绕 PowerSploit 项目 Privesc 模块中的Invoke-PrivescAudit命令展开,讲解如何借助它一次性批量执行全部 Windows 本地提权机会检查(服务配置、注册表、DLL 劫持、凭据缓存等 16 类检查项),并掌握对象、列表与 HTML 三种报告输出方式。读完本文,你将能够基于 Privesc/PowerUp.ps1 的源码理解每条检查的判定逻辑,并在授权渗透测试或红队评估中直接复现完整审计流程。

一、Invoke-PrivescAudit 是什么

Invoke-PrivescAudit是 PowerSploit 提权模块(Privesc)中的一个聚合审计命令,其官方定位是"执行所有用于检查各类 Windows 权限提升机会的函数"(Executes all functions that check for various Windows privilege escalation opportunities)。它由 Will Schroeder(@harmj0y)编写,遵循 BSD 3-Clause 许可,无强制依赖项,功能载体是项目中的 Privesc/PowerUp.ps1。

从源码结构看,该命令相当于 PowerUp 工具集的"总控开关":它把分散的单项检查函数(如Get-UnquotedServiceGet-ModifiableServiceFileGet-CachedGPPPassword等)组织成一张检查清单,然后逐项执行、汇总输出。你既可以在获得低权限立足点后用它快速评估横向/纵向提权面,也可以在加固审计时用它核对目标主机是否存在已知的配置类提权漏洞。

加载与调用方式

Privesc 模块通过 Privesc/Privesc.psm1 以 dot-source 方式加载目录下全部.ps1脚本(其中即包含 PowerUp.ps1 与 Get-System.ps1),模块清单 Privesc/Privesc.psd1 声明导出Invoke-PrivescAudit等 30 个函数。有两种常见加载方式:

# 方式一:导入整个 PowerSploit 框架(会自动递归导入各子模块,见 PowerSploit.psm1) Import-Module .\PowerSploit.psm1 # 方式二:仅导入 Privesc 模块 Import-Module .\Privesc\Privesc.psd1

模块清单要求最低 Windows PowerShell 2.0 引擎(见 Privesc/Privesc.psd1 中的PowerShellVersion = '2.0'),因此它可在较老版本的 PowerShell 环境中运行。此外,PowerUp.ps1 在文件末尾为Invoke-PrivescAudit注册了一个历史别名Invoke-AllChecks(见 Privesc/PowerUp.ps1#L4989),二者可互换使用。

二、语法与参数详解

Invoke-PrivescAudit的完整语法如下(引自 docs/Privesc/Invoke-PrivescAudit.md):

Invoke-PrivescAudit [-HTMLReport]

参数:-HTMLReport(Switch)

项目说明
类型SwitchParameter
位置Named(命名参数)
是否必填False
默认值False
管道输入不支持
通配符不支持
作用将审计报告以 HTML 形式写入磁盘

当指定-HTMLReport时,报告文件会以<计算机名>.<用户名>.html的格式命名并写入当前工作目录。具体到源码,文件名的拼接逻辑是"$($Env:ComputerName).$($Env:UserName).html"(见 Privesc/PowerUp.ps1#L4730)。原文档示例中的SYSTEM.username.html即是对这一命名模式的抽象描述——例如在主机名为WIN10-PC、当前用户为john的机器上,实际生成的文件是WIN10-PC.john.html

进阶参数:-Format(源码新增,取代 HTMLReport)

值得注意的实现细节:在 Privesc/PowerUp.ps1#L4717-L4727 中,函数还定义了一个-Format参数,取值集合为Object/List/HTML,默认值为Object;而-HTMLReport在源码注释中已明确标注为DEPRECATED(已弃用),其语义被-Format取代。源码中的兼容处理是:

if($HTMLReport){ $Format = 'HTML' }

也就是说,无论你写-HTMLReport还是-Format HTML,最终都会走同一套 HTML 输出分支。三种取值对应的输出行为见后文"输出格式"一节。

三、两种典型用法示例

示例 1:默认对象输出

Invoke-PrivescAudit

运行全部提权检查,并针对发现的每一项问题输出包含详细字段的状态报告对象。这是最常用的用法,结果可在管道中继续交给Where-ObjectFormat-ListExport-Csv等命令做二次处理。

示例 2:生成 HTML 报告

Invoke-PrivescAudit -HTMLReport # 等价写法: Invoke-PrivescAudit -Format HTML

运行全部提权检查,并把结果写入系统名.用户名.html(如WIN10-PC.john.html)报告文件中,便于归档或在浏览器中审阅。HTML 报告自带内嵌 CSS 样式(源码中定义了BODY为 peachpuff 背景、表格使用 thistle 表头与 palegoldenrod 单元格等配色,见 Privesc/PowerUp.ps1#L4731-L4737),页首会输出PowerUp report for '计算机名.用户名'标题。

如果你只想逐项人眼审阅而不落盘,还可以使用-Format List,它会在终端中先打印[*] Checking for <检查项名称>...提示,再以Format-List形式展示该项的全部发现。

四、16 类检查项全景:源码级拆解

Invoke-PrivescAudit的核心是函数体内维护的$Checks数组(见 Privesc/PowerUp.ps1#L4742-L4815),共注册了16 项检查。下表汇总了每项检查的类型名称、底层调用的检查函数,以及源码中预置的滥用脚本(AbuseScript):

#检查项类型底层调用函数预置滥用脚本
1User Has Local Admin Privileges内联:WindowsPrincipal.IsInRole("Administrator")
2User In Local Group with Admin PrivilegesGet-ProcessTokenGroup(匹配 SIDS-1-5-32-544Invoke-WScriptUACBypass -Command "..."
3Process Token PrivilegesGet-ProcessTokenPrivilege -Special
4Unquoted Service PathsGet-UnquotedService无(结果自带AbuseFunction字段)
5Modifiable Service FilesGet-ModifiableServiceFile无(结果自带)
6Modifiable ServicesGet-ModifiableService无(结果自带)
7%PATH% .dll HijacksFind-PathDLLHijackWrite-HijackDll -DllPath '<路径>\wlbsctrl.dll'
8AlwaysInstallElevated Registry KeyGet-RegistryAlwaysInstallElevatedWrite-UserAddMSI
9Registry AutologonsGet-RegistryAutoLogon
10Modifiable Registry AutorunGet-ModifiableRegistryAutoRun
11Modifiable Scheduled Task FilesGet-ModifiableScheduledTaskFile
12Unattended Install FilesGet-UnattendedInstallFile
13Encrypted web.config StringsGet-WebConfig
14Encrypted Application Pool PasswordsGet-ApplicationHost
15McAfee SiteList.xml filesGet-SiteListPassword
16Cached GPP FilesGet-CachedGPPPassword

这些检查大致可分为五组,理解分组有助于你在收到报告后快速定位问题:

4.1 初始权限与令牌检查(第 1~3 项)

  • 第 1 项通过 .NET 的WindowsPrincipal.IsInRole()直接判断当前进程令牌是否属于 Administrators 内置组;
  • 第 2 项利用Get-ProcessTokenGroup枚举进程令牌中的组 SID,若出现管理员组 SID(S-1-5-32-544)即判定"当前用户所属某本地组具备管理员权限",此时即使当前会话不是完整管理员,也可能借助Invoke-WScriptUACBypass进行 UAC 绕过提权;
  • 第 3 项通过Get-ProcessTokenPrivilege -Special筛选进程令牌中的高价值特权(如 SeDebugPrivilege、SeImpersonatePrivilege、SeBackupPrivilege 等)。

令牌类函数依赖 PSReflect 在内存中动态生成的 Win32 API 原型(见 Privesc/PowerUp.ps1#L16-L22 及文件末尾的$FunctionDefinitions定义,其中声明了OpenProcessTokenGetTokenInformationLookupPrivilegeNameRtlAdjustPrivilege等原生函数),无需磁盘落盘即可访问advapi32kernel32ntdll接口。

4.2 服务配置类检查(第 4~6 项)

  • Get-UnquotedService通过 WMI 查询win32_service,筛选出二进制路径含空格且未加引号的服务,并进一步用Get-ModifiablePath判断路径前缀段是否可写、用Test-ServiceDaclPermission -PermissionSet 'Restart'判断当前用户是否具备重启该服务的权限(实现见 Privesc/PowerUp.ps1#L2028-L2096)。返回对象包含ServiceNamePathModifiablePathStartNameAbuseFunctionCanRestart等字段,其中AbuseFunction直接给出Write-ServiceBinary -Name '<服务名>' -Path <劫持路径>的利用命令;
  • Get-ModifiableServiceFileGet-ModifiableService分别从"服务二进制/依赖文件可写"和"服务 DACL 允许当前用户修改配置"两个角度枚举可滥用服务;
  • 相关单项文档可参考 docs/Privesc/Get-UnquotedService.md、docs/Privesc/Get-ModifiableServiceFile.md、docs/Privesc/Get-ModifiableService.md。

4.3 DLL 劫持检查(第 7 项)

Find-PathDLLHijack检查%PATH%目录中是否存在当前用户可写、且可被系统进程按名加载(如wlbsctrl.dll)的 DLL 劫持点。命中后,源码预置的滥用脚本会指导你用Write-HijackDll -DllPath '<可写路径>\wlbsctrl.dll'植入恶意 DLL(见 docs/Privesc/Write-HijackDll.md)。

4.4 注册表类检查(第 8~10 项)

  • Get-RegistryAlwaysInstallElevated:读取HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevatedHKCU\...\AlwaysInstallElevated两个键是否同时存在并置位(实现见 Privesc/PowerUp.ps1#L3402-L3441)。若置位,则任何 MSI 都会以 SYSTEM 权限安装,可用Write-UserAddMSI构造恶意 MSI 直接添加管理员;
  • Get-RegistryAutoLogon:枚举Winlogon下的 AutoAdminLogon 相关键值,尝试提取明文/可恢复的自动登录凭据;
  • Get-ModifiableRegistryAutoRun:查找 HKCU/HKLM 启动项中当前用户可写的键,可用于植入持久化或提权载荷。

4.5 凭据与配置文件检查(第 11~16 项)

  • Get-ModifiableScheduledTaskFile:查找当前用户可修改的计划任务文件;
  • Get-UnattendedInstallFile:扫描常见无人值守安装应答文件(如sysprep.xmlunattend.xml等遗留路径);
  • Get-WebConfigGet-ApplicationHost:检查 IIS 站点web.configapplicationHost.config中加密的配置字符串/应用程序池密码;
  • Get-SiteListPassword:针对 McAfee SiteList.xml 中经静态密钥加密的凭据进行解密检查(源码注释明确指出该函数利用了 McAfee 静态密钥加密的弱点,见 Privesc/PowerUp.ps1#L4145);
  • Get-CachedGPPPassword:搜索并尝试解密缓存的组策略首选项(GPP)凭据。

五、执行流程与结果字段

Invoke-PrivescAudit的执行主循环位于 Privesc/PowerUp.ps1#L4817-L4831,逻辑如下:

ForEach($Check in $Checks){ Write-Verbose "Checking for $($Check.Type)..." $Results = . $Check.Command $Results | Where-Object {$_} | ForEach-Object { $_ | Add-Member Noteproperty 'Check' $Check.Type if ($Check.AbuseScript){ $_ | Add-Member Noteproperty 'AbuseFunction' (. $Check.AbuseScript) } } # 依据 -Format 分发到 Object / List / HTML 三种输出分支 }

几个关键点:

  1. 只保留有效结果:每项检查的原始输出会先经Where-Object {$_}过滤,空结果($null$false、空集合)不会出现在报告中,因此"没问题"的检查项不会产生噪音;
  2. 统一附加Check字段:每个结果对象都会被追加一个Check属性,标明它来自哪一类检查,方便在混合输出中按来源过滤;
  3. AbuseFunction字段:对于预置了滥用脚本的检查项(第 2、7、8 项),结果还会附带AbuseFunction属性,直接给出下一步可利用的命令模板——这是 PowerUp 强调"发现即利用"的体现。而第 4~6 项服务类检查的结果对象本身在底层函数中就已生成了各自的AbuseFunction字段;
  4. Verbose 调试:函数全程支持-Verbose,会逐项打印Checking for <类型>...,便于审计中途观察进度。

六、输出格式(Object / List / HTML)

对应-Format参数的三种取值,输出行为如下:

-Format输出行为适用场景
Object(默认)逐项输出结果对象,可继续走管道自动化处理、导出 CSV、二次过滤
List每项先打印[*] Checking for ...,再以Format-List排版终端人工逐项审阅
HTML每项用ConvertTo-HTML追加写入<计算机名>.<用户名>.html归档、写报告、跨端审阅

在 HTML 模式下,报告文件会在审计开始前先写入带样式的<H1>页首,随后每个检查项以<H2>小节追加(见 Privesc/PowerUp.ps1#L4829),全部执行完毕后通过Write-Verbose打印报告落盘路径(Privesc/PowerUp.ps1#L4833-L4835)。

七、验证与测试

仓库提供了针对 Privesc 模块的 Pester 测试套件 Tests/Privesc.tests.ps1。该套件会先导入 Privesc/Privesc.psd1 模块清单,再单独导入 PowerUp.ps1 以暴露全部辅助函数(见测试文件头部),随后对Get-ModifiablePathGet-ProcessTokenGroupGet-ProcessTokenPrivilegeGet-UnquotedServiceGet-ModifiableServiceFileInvoke-ServiceAbuseInstall-ServiceBinaryFind-ProcessDLLHijack等底层函数逐一断言字段完整性与行为正确性。例如Get-UnquotedService的测试会通过sc.exe create临时注册一个"含空格且未加引号"的服务来验证检测命中,再注册引号包裹路径的服务验证不误报。

需要特别说明:测试套件中相当一部分用例(如令牌枚举、服务 DACL 修改、服务滥用)要求以本地管理员权限运行,测试本身会实际创建/删除服务与用户(如john测试用户),因此只应在受控的测试环境中执行。

八、使用注意事项

  • 授权前提Invoke-PrivescAudit及其配套的滥用函数属于后渗透/提权工具,仅在获得明确授权的渗透测试、红队评估或自身环境加固检查中使用,请遵守当地法律法规;
  • 运行环境:目标为 Windows 主机,模块要求 Windows PowerShell 2.0 及以上;Get-WmiObjectsc.exe、注册表与 IIS 配置读取等操作受目标系统组件影响;
  • 权限差异:部分检查项(如令牌特权枚举、服务 DACL 评估)在低权限与管理员会话下结果不同,建议在不同权限上下文中分别审计;
  • 结果解读:报告中的AbuseFunction是自动生成的利用建议模板,执行前需结合目标环境核实路径、服务名等占位符,切勿盲目复制执行;
  • 相关资源:更多单项函数的详细文档位于 docs/Privesc/index.md 索引中,每个提权向量(服务、DLL、注册表、GPP 等)都有独立页面;模块整体说明可参考 Privesc/README.md。

九、小结

Invoke-PrivescAudit把 PowerUp 工具集中的全部本地提权检查收敛为一条命令,覆盖管理员权限确认、令牌特权、服务配置、DLL 劫持、注册表配置与凭据缓存等 16 类常见提权面,并通过统一的Check/AbuseFunction字段让"发现问题"与"给出利用路径"无缝衔接。无论是快速评估一台新拿下的主机,还是系统性加固检查,它都是一份高性价比的起点清单。

【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 4:44:42

图像分割实战指南:语义、实例与全景分割从训练到部署

简介&#xff1a;一份覆盖语义分割、实例分割与全景分割的图像分割Python项目&#xff0c;适合计算机视觉与深度学习方向的开发者、学生及科研人员&#xff0c;可直接用于毕设或课程设计参考。压缩包共5个文件&#xff0c;含3个Markdown说明文档、1个Python脚本与1个工程文件&a…

作者头像 李华
网站建设 2026/9/23 4:43:10

CMMI 3.0规范文档编写指南:四层结构、裁剪逻辑与追溯校验

简介&#xff1a;CMMI 3.0 软件工程规范文档面向软件研发管理者、过程改进&#xff08;EPG&#xff09;成员及质量与项目管理从业者&#xff0c;用于系统理解能力成熟度模型集成框架&#xff0c;解决组织在过程定义、量化管理与持续优化中缺乏统一参照的问题。资源包共1个文件&…

作者头像 李华
网站建设 2026/9/23 4:43:06

从描述到治理:Agent技能设计的完整实操指南

1. 先搞清楚&#xff1a;Agent的技能到底是什么1.1 技能不是普通函数&#xff0c;差的不是语法做Agent开发有一段时间的人应该都有同感&#xff1a;把一个大模型接上工具&#xff0c;让它能查天气、发邮件、查数据库&#xff0c;这事儿本身不难。真正难的是让模型在合适的场景下…

作者头像 李华
网站建设 2026/9/23 4:42:45

乳酰化修饰:表观遗传学新星与疾病研究突破

1. 乳酰化研究背景与行业现状乳酰化&#xff08;Lactylation&#xff09;作为近年来表观遗传学领域最受关注的新型翻译后修饰方式&#xff0c;正在彻底改变我们对细胞代谢与基因调控关系的认知。这种将乳酸基团共价结合到蛋白质上的修饰方式&#xff0c;最早由芝加哥大学赵英明…

作者头像 李华