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-UnquotedService、Get-ModifiableServiceFile、Get-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-Object、Format-List或Export-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):
| # | 检查项类型 | 底层调用函数 | 预置滥用脚本 |
|---|---|---|---|
| 1 | User Has Local Admin Privileges | 内联:WindowsPrincipal.IsInRole("Administrator") | 无 |
| 2 | User In Local Group with Admin Privileges | Get-ProcessTokenGroup(匹配 SIDS-1-5-32-544) | Invoke-WScriptUACBypass -Command "..." |
| 3 | Process Token Privileges | Get-ProcessTokenPrivilege -Special | 无 |
| 4 | Unquoted Service Paths | Get-UnquotedService | 无(结果自带AbuseFunction字段) |
| 5 | Modifiable Service Files | Get-ModifiableServiceFile | 无(结果自带) |
| 6 | Modifiable Services | Get-ModifiableService | 无(结果自带) |
| 7 | %PATH% .dll Hijacks | Find-PathDLLHijack | Write-HijackDll -DllPath '<路径>\wlbsctrl.dll' |
| 8 | AlwaysInstallElevated Registry Key | Get-RegistryAlwaysInstallElevated | Write-UserAddMSI |
| 9 | Registry Autologons | Get-RegistryAutoLogon | 无 |
| 10 | Modifiable Registry Autorun | Get-ModifiableRegistryAutoRun | 无 |
| 11 | Modifiable Scheduled Task Files | Get-ModifiableScheduledTaskFile | 无 |
| 12 | Unattended Install Files | Get-UnattendedInstallFile | 无 |
| 13 | Encrypted web.config Strings | Get-WebConfig | 无 |
| 14 | Encrypted Application Pool Passwords | Get-ApplicationHost | 无 |
| 15 | McAfee SiteList.xml files | Get-SiteListPassword | 无 |
| 16 | Cached GPP Files | Get-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定义,其中声明了OpenProcessToken、GetTokenInformation、LookupPrivilegeName、RtlAdjustPrivilege等原生函数),无需磁盘落盘即可访问advapi32、kernel32、ntdll接口。
4.2 服务配置类检查(第 4~6 项)
Get-UnquotedService通过 WMI 查询win32_service,筛选出二进制路径含空格且未加引号的服务,并进一步用Get-ModifiablePath判断路径前缀段是否可写、用Test-ServiceDaclPermission -PermissionSet 'Restart'判断当前用户是否具备重启该服务的权限(实现见 Privesc/PowerUp.ps1#L2028-L2096)。返回对象包含ServiceName、Path、ModifiablePath、StartName、AbuseFunction、CanRestart等字段,其中AbuseFunction直接给出Write-ServiceBinary -Name '<服务名>' -Path <劫持路径>的利用命令;Get-ModifiableServiceFile与Get-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\AlwaysInstallElevated与HKCU\...\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.xml、unattend.xml等遗留路径);Get-WebConfig与Get-ApplicationHost:检查 IIS 站点web.config与applicationHost.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 三种输出分支 }几个关键点:
- 只保留有效结果:每项检查的原始输出会先经
Where-Object {$_}过滤,空结果($null、$false、空集合)不会出现在报告中,因此"没问题"的检查项不会产生噪音; - 统一附加
Check字段:每个结果对象都会被追加一个Check属性,标明它来自哪一类检查,方便在混合输出中按来源过滤; AbuseFunction字段:对于预置了滥用脚本的检查项(第 2、7、8 项),结果还会附带AbuseFunction属性,直接给出下一步可利用的命令模板——这是 PowerUp 强调"发现即利用"的体现。而第 4~6 项服务类检查的结果对象本身在底层函数中就已生成了各自的AbuseFunction字段;- 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-ModifiablePath、Get-ProcessTokenGroup、Get-ProcessTokenPrivilege、Get-UnquotedService、Get-ModifiableServiceFile、Invoke-ServiceAbuse、Install-ServiceBinary、Find-ProcessDLLHijack等底层函数逐一断言字段完整性与行为正确性。例如Get-UnquotedService的测试会通过sc.exe create临时注册一个"含空格且未加引号"的服务来验证检测命中,再注册引号包裹路径的服务验证不误报。
需要特别说明:测试套件中相当一部分用例(如令牌枚举、服务 DACL 修改、服务滥用)要求以本地管理员权限运行,测试本身会实际创建/删除服务与用户(如john测试用户),因此只应在受控的测试环境中执行。
八、使用注意事项
- 授权前提:
Invoke-PrivescAudit及其配套的滥用函数属于后渗透/提权工具,仅在获得明确授权的渗透测试、红队评估或自身环境加固检查中使用,请遵守当地法律法规; - 运行环境:目标为 Windows 主机,模块要求 Windows PowerShell 2.0 及以上;
Get-WmiObject、sc.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),仅供参考