
PrivescCheck v2026.09.21-1
Windows 权限提升枚举脚本
PrivescCheck
快速识别常见的 Windows 漏洞 和 配置问题,这些问题不一定被公共安全标准所覆盖,并收集用于利用和后利用任务的有用信息。
[!IMPORTANT] 使用此工具时需要注意的一个重要方面是,所有访问控制检查都是在当前用户的上下文中完成的。因此,如果以管理员权限运行,许多漏洞检查会被跳过,以避免生成错误的发现结果。
快速开始
在此处下载脚本:PrivescCheck.ps1
[!TIP] 上面的链接也可以直接在 PowerShell 终端中使用
(New-Object Net.WebClient).DownloadString(...)来使用。
用例 1:快速评估
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Report TXT,HTML"
用例 2:扩展评估
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended -Report TXT,HTML"
用例 3:全面评估
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended -Audit -Report ALL"
详细用法
Invoke-PrivescCheck [-Extended] [-Audit] [-Risky] [-Report <FORMAT>[,...]]
[-FilePath <PREFIX>] [-Silent] [-Force]
-Extended
在扫描中包含所有“扩展”检查。
-Audit
在扫描中包含所有“审计”检查。
-Risky
在扫描中包含所有“高风险”检查。这些检查由于其行为,
很可能会触发主动的 EDR 反制措施。
-Report <FORMAT>[,...]
指定输出报告文件格式(TXT、HTML、CSV、XML)。使用别名
'ALL' 生成所有报告文件。默认情况下,输出文件名
会自动生成。使用选项 '-FilePath' 显式指定
文件名。
-FilePath <PREFIX>
指定输出报告文件名或目录。文件扩展名
会自动附加。如果提供的是目录路径,
文件名会在运行时自动生成。
-Silent
抑制终端输出。如果你想将脚本作为批处理文件的一部分运行,
例如在计划任务中,这会很有用。
-Force
强制运行并忽略警告。通常,如果脚本以管理员权限执行,
它会停止。使用此选项可以
无论如何都执行它。
报告文件格式
报告文件格式 > TXT
使用选项 -Report TXT 生成 原始文本报告。输出与终端输出类似,不同之处在于它只包含 ASCII 字符,以便更好地兼容文本编辑器。

报告文件格式 > HTML
使用选项 -Report HTML 生成 HTML 报告。输出文件可以在 Web 浏览器中打开。不需要 Internet 连接,因为它没有外部依赖项。与原始文本报告相比,它更便于可视化数据。此外,它还提供 排序 和 筛选 功能!

报告文件格式 > CSV 或 XML
使用选项 -Report CSV 或 -Report XML 生成 CSV 或 XML 报告。输出文件旨在便于自动化报告工具解析结果。
[!NOTE] 尽管输出格式(目前)尚未文档化,但你可以通过分析已生成文件的结构轻松弄清楚它。你可以将每个检查的
Id值用作唯一标识符。
检查类型
检查类型 > Base
类型为 Base 的检查将始终执行,除非脚本以管理员身份运行。它们主要用于识别权限提升漏洞或其他重要问题。
检查类型 > Extended
类型为 Extended 的检查只有在命令行中指定了选项 -Extended 时才能执行。它们主要用于提供可能对漏洞利用开发或后利用有用的附加信息。
检查类型 > Audit
类型为 Audit 的检查只有在命令行中指定了选项 -Audit 时才能执行。它们主要用于提供在配置审计上下文中相关的信息。
提示与技巧
PowerShell 执行策略
默认情况下,当启动新的 powershell.exe 进程时,客户端上的 PowerShell 执行策略 设置为 Restricted,服务器上设置为 RemoteSigned。这些策略会阻止(未签名)脚本的执行,但可以在当前作用域内按如下方式覆盖。
Set-ExecutionPolicy Bypass -Scope Process -Force
. .\PrivescCheck.ps1
但是,当执行策略通过 GPO 强制执行时,此技巧不起作用。在这种情况下,在启动新的 PowerShell 会话后,你可以按如下方式加载脚本。
Get-Content .\PrivescCheck.ps1 | Out-String | Invoke-Expression
PowerShell 版本 2
绕过 Constrained Language Mode 的一种常见方法是使用 PSv2,因为它没有实现此保护。因此,相当一部分开发工作都用于维护这种向后兼容性。
[!NOTE] 尽管 PowerShell 版本 2
在最近的 Windows 版本中仍默认启用(从 Windows 中移除 PowerShell 2.0),但如果没有 .Net framework 版本 2.0,它就无法运行,而后者需要手动安装。
Metasploit 超时
如果你在 Meterpreter 会话中运行此脚本,你很可能会遇到“超时”错误。这是因为 Metasploit 使用默认超时值 15 秒,这对于脚本的典型执行完成来说是不够的。
meterpreter > load powershell
Loading extension powershell...Success.
meterpreter > powershell_import /local/path/to/PrivescCheck.ps1
[+] File successfully imported. No result was returned.
meterpreter > powershell_execute "Invoke-PrivescCheck"
[-] Error running command powershell_execute: Rex::TimeoutError Operation timed out.
可以通过 sessions 命令的 -t 选项设置不同的超时值(文档)。在以下示例中,为 ID 为 1 的会话设置了 2 分钟的超时,但你可能希望设置更高的值。
msf6 exploit(multi/handler) > sessions -t 120 -i 1
[*] Starting interaction with 1...
meterpreter > powershell_execute "Invoke-PrivescCheck"
构建
更新数据
某些检查依赖在线数据(例如 LOL 驱动程序数据库),但脚本旨在离线工作。为了解决这个问题,数据被嵌入到脚本中,因此需要定期更新。此过程在官方发布中完全自动化,但如果你想在本地构建脚本,可以选择手动执行此操作。
powershell -ep bypass ". .\build\Build.ps1; Update-LolDriverFile"
构建脚本
构建脚本就像运行下面的命令一样简单。输出文件将保存在 .\dist\ 文件夹中。
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck"
构建脚本使用带有随机生成的 seed 的伪随机数生成器为每个模块选择变量名。如果你想在多次构建之间生成可重现的结果,可以使用选项 -NoNewSeed 选择重用先前生成的 seed。
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck -NoNewSeed"
构建脚本使用带有随机生成的 key 的 AES 加密来混淆每个模块的内容。如果你想在多次构建之间生成可重现的结果,可以使用选项 -NoNewKey 选择重用先前生成的 key。
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck -NoNewKey"
致谢
- 单词列表 - CBHue/PyFuscation
- 已知易受攻击驱动程序列表 - https://www.loldrivers.io/