
拿到一个Windows低权限shell之后最忌讳的事情就是一上来就翻内核漏洞。OSCP备考期间我打了大量靶机Windows权限提升这条线里真正让我少走弯路的反而是最朴素的“搜索Windows的敏感信息”——多数时候突破口根本不用你“打”出来它就明晃晃地躺在系统的某个配置文件里。这篇文章就把我在这条线上的完整思路、常用命令、典型链路和踩过的坑一次说清楚适合正在备考OSCP、或者刚开始接触Windows内网提权的朋友。1. 为什么说Windows提权的前几分钟应该先“翻垃圾”而不是“砸内核”1.1 内核提权的“黑天鹅”问题Windows的内核漏洞利用在OSCP考试里其实是最后的选择不是首选。原因很直接内核提权利用的是操作系统底层的漏洞一旦触发条件没掌握好轻则利用失败重则直接蓝屏。考试环境里机器崩了可能还能重置但如果是真实的授权渗透测试项目你把人家的域控打成蓝屏这个责任不是一句“不好意思”能解决的。更重要的是现代Windows系统的补丁更新频率很高。哪怕是一个老版本系统只要运维勤快内核漏洞几乎轮不到你。而OSCP考试有个特点它考的不是你会不会用Metasploit打一个永恒之蓝而是你在面对一个“看起来没什么漏洞”的系统时有没有一套成体系的思路把权限拿下来。搜索敏感信息就是这套思路里成本最低、成功率最高的第一步。1.2 搜索敏感信息和“主动攻击”的本质区别主动攻击是你拿工具去打服务、去爆破、去利用漏洞这需要目标系统存在可利用的条件而且每打一次都会留下大量日志。搜索敏感信息则完全不同——你只是在一个已经拿下的低权限shell里像管理员自己一样去翻系统里的文件、注册表、历史记录。这种行为在蓝队视角里非常难被快速识别因为它和正常运维操作长得一模一样。我个人的理解是Windows本身就是一个“话多”的系统。安装部署的时候会留下Unattend.xml跑应用的时候会写web.config管理员图省事会把密码直接写在批处理脚本里运维排障时会把数据库连接串贴在记事本里。这些信息分散在系统的各个角落而低权限用户往往也能读得到。你需要的不是更高级的漏洞利用技术而是一套系统的“翻找”方法论。1.3 为什么说这是OSCP考试的“送分题”OSCP考试的机器设计是有套路的。出题人不会真的让你去对抗一个补丁全打满的Windows Server 2022他们更倾向于在系统里埋一些“人为失误”——比如一个带明文密码的配置文件、一个权限配置错误的服务、一个可写的计划任务脚本。这些失误里有相当一部分是可以通过搜索敏感信息直接发现的。我的一个体会是OSCP里很多机器提权的路径非常“线性”。你拿到初始shell之后权限很低web目录下一顿翻找到一个数据库配置文件里面有SA账号密码连上去开xp_cmdshell直接SYSTEM。整个过程没有任何漏洞利用全凭信息收集。这也是为什么很多打过OSCP的人都说这台机器与其说是“打”下来的不如说是“翻”下来的。2. Windows到底把敏感信息藏在哪一份能对照着找的清单2.1 九大类高价值目标概览我自己在做Windows敏感信息搜索时会把目标分成九大类每一类对应不同的位置和文件类型。这里先给你一张速查表后面再逐个展开类别典型位置/文件为什么有价值安装配置残留C:\Windows\Panther\Unattend.xml、Unattend\Unattend.xml常含管理员明文密码或base64编码密码应用配置文件web.config、app.config、applicationHost.config数据库连接串、应用账号密码用户操作痕迹PowerShell历史记录、最近打开的文件管理员敲过的命令里常有密码凭据存储cmdkey /list、Vault、RDP凭据、SAM备份直接可复用的登录凭据脚本与批处理.bat、.ps1、.vbs、.cmd运维脚本里常有硬编码密码数据库相关.mdf、.bak、连接字符串文件数据库权限往往等于SYSTEM权限浏览器与客户端浏览器保存的密码、FTP客户端配置内网应用凭据备份与镜像备份目录、隐藏共享、NTDS.dit备份离线破解或哈希传递系统与网络配置hosts文件、网络共享、计划任务内网拓扑、额外入口、计划任务凭据2.2 安装配置残留最容易出成果的地方Windows在自动化部署时经常使用Unattend.xml文件来预配置系统。这个文件会记录管理员账户、密码、产品密钥等信息。安装完成后系统通常会把文件留在C:\Windows\Panther\目录下。密码有两种存放方式一种是明文另一种是base64编码解码一下就能用。我遇到过不止一次整个提权的关键就是一个Unattend.xml里的AdministratorPassword字段。注意这个文件不一定只在Panther目录下有时候在C:\Windows\System32\sysprep\里也有。搜索的时候别漏掉。2.3 应用配置数据库连接串是提权富矿如果你的目标是Windows IIS那么web.config是第一优先级的文件。里面最常见的敏感信息是连接字符串尤其是SQL Server的SA账号密码。拿到数据库权限后通过xp_cmdshell可以直接执行系统命令很多时候一步就到SYSTEM。如果目标跑的是PHP那就要找.env、config.php、database.php这类文件。以我自己的经验PHP站点的配置文件比.NET站点更容易出东西因为PHP项目里把数据库密码写在源码里几乎是常态。2.4 用户痕迹PowerShell历史记录是真正的盲区这条是我反复强调的。很多人在找敏感信息时只盯着配置文件忽略了管理员自己在终端里敲过什么。PowerShell的历史记录存放在C:\Users\用户名\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt这个文件的内容可能让你大开眼界。管理员可能在里面敲过net user Admin Pssw0rd /add、sqlcmd -S localhost -U sa -P Password123、Enter-PSSession -ComputerName DC01 -Credential CORP\admin这类命令。你等于白捡了一个管理员的操作记录里面全是凭据。2.5 凭据存储不只是明文密码Windows自带的凭据管理器Credential Manager也是个值得翻的地方。用cmdkey /list可以查看本机存储的凭据列表有时候能看到针对某台服务器的明文账号。如果系统开启了凭据保管库Vault可以用vaultcmd /listcreds:Windows Credentials来枚举。还有一类是RDP相关如果管理员在机器上保存过RDP凭据可以在当前用户目录下的AppData\Local\Microsoft\Credentials\里找到加密的凭据文件。虽然解密需要DPAPI但如果你能拿到用户的明文密码或hash利用mimikatz的DPAPI模块就能解出来。这条链路比较长但价值极高。2.6 脚本、备份与计划任务管理员随手埋的雷脚本文件是另一个高发区。Windows服务器的运维人员很喜欢写批处理脚本而这些脚本里十有八九会出现明文密码。典型的位置包括C:\Scripts\、C:\Windows\Temp\、C:\Users\Public\等。备份文件则要留意C:\backup\、共享目录、以及带.bak、.zip、.7z扩展名的文件尤其是如果有人把SAM和SYSTEM注册表文件的备份放在里面离线提取hash之后就有机会拿到管理员密码。计划任务也不能忽略。用schtasks /query /fo LIST /v查看计划任务详情重点关注“运行身份”和“要运行的任务”。如果任务是Run with highest privileges指向一个当前用户可以写的脚本那就直接改写脚本内容等SYSTEM用户执行就行。更妙的是很多计划任务的配置里会直接给出用户名和密码虽然显示的密码是********但没关系schtasks的信息已经告诉你这个任务以一个高权限账户运行剩下的就是找它的脚本路径。3. 命令与工具的合理搭配手动搜索与自动化扫描的分工3.1 先手工后工具这是我最推荐的顺序自动化工具很好用但它有个问题输出太多。winPEAS跑一遍能给你几千行结果新手根本分不清哪些是真正有用的。所以我的习惯是先手工搜索高价值位置跑完一轮之后再用自动化工具兜底。手工搜索有几个不可替代的好处。第一你可以随时调整关键词和搜索范围针对性强第二手工搜索的过程也是熟悉目标系统的过程你会知道这台机器装了哪些服务、跑了哪些应用、有哪些用户第三手工命令的执行结果一目了然不会像winPEAS那样被淹没在海量输出里。3.2 核心命令组findstr、where、reg query的组合拳先看文件搜索。Windows下最常用的就是findstr和where。:: 全盘搜索包含password关键词的文件按扩展名限定 findstr /si password C:\*.txt C:\*.xml C:\*.ini C:\*.config C:\*.bat C:\*.ps1 2nul :: 递归搜索当前目录下的常见配置文件 findstr /si password passwd pwd secret token *.xml *.txt *.ini *.config 2nul :: 用where列出特定扩展名的文件 where /r C:\Users\ *.bat 2nul where /r C:\Users\ *.ps1 2nul注意findstr /s是递归搜索子目录/i是忽略大小写。加上2nul把错误输出比如权限拒绝、目录不存在都丢到黑洞里不然满屏的Access is denied会干扰视线。再看注册表。注册表里的键值对经常藏着密码尤其是某些软件会把密码写在注册表里而不是配置文件里。:: 在HKLM和HKCU里全面搜索包含password的键值 reg query HKLM /f password /t REG_SZ /s 2nul reg query HKCU /f password /t REG_SZ /s 2nul :: 查看自动登录配置Winlogon reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 2nulreg query ... /f password是在值数据中进行匹配/s表示递归搜索所有子键。搜索范围是HKLM本机所有用户相关和HKCU当前用户这两个范围覆盖了绝大多数场景。3.3 PowerShell更精确、更现代的搜索方式如果当前shell是PowerShell搜索能力会强很多。可以用Get-ChildItem结合Select-String来做内容过滤# 在C盘用户目录和历史目录中搜索包含password的文件 Get-ChildItem -Path C:\Users -Include *.txt,*.xml,*.ini,*.config,*.bat,*.ps1 -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_ -notmatch ^C:\\Windows\\ } | Select-String -Pattern password|passwd|pwd|secret|token -ErrorAction SilentlyContinue更实用的是直接读取PowerShell历史记录# 读取所有用户下的PowerShell历史记录 Get-ChildItem -Path C:\Users -Filter ConsoleHost_history.txt -Recurse -Force -ErrorAction SilentlyContinue | ForEach-Object { Write-Host --- $($_.FullName) ---; Get-Content $_.FullName }PowerShell的优势是结构化输出方便你过滤和二次处理。但要注意执行策略的限制如果被禁止执行脚本可以用powershell -ExecutionPolicy Bypass或者改用cmd命令替代。3.4 自动化工具winPEAS和Seatbelt怎么用才高效winPEAS是最常用的Windows枚举脚本它会把用户信息、服务权限、文件搜索、注册表搜索、凭据存储等信息一次性收集齐。我的用法是:: 转储所有可执行文件的信息拿到全量输出 winPEASx64.exe -quiet -fast searchfast C:\Temp\peas.txt :: 然后慢慢看输出文件 type C:\Temp\peas.txt拿到输出之后我一般先看几个关键段Checking Write accessible folders——可写文件夹列表对应服务替换和DLL劫持Checking autologon credentials——自动登录凭据Searching for specific files——它内置搜索的敏感文件名PowerShell history——PowerShell历史记录Seatbelt也是不错的工具它的模块化更清晰比如Seatbelt.exe -groupall可以完整跑一遍Seatbelt.exe WindowsCredentialFiles可以单独看凭据文件。3.5 工具虽好但不能无脑信赖这里有个必须提醒的坑自动化工具跑出来的结果很多是“上下文相关”的。winPEAS告诉你某个服务可以替换二进制并不意味着你一定能提权成功还需要看服务的运行账户、文件系统权限、以及该路径是否可写。同样它搜到一个password关键词可能只是文档里的一句话不代表真的能用。务必人肉复核每条高危发现。4. 四条典型的“敏感信息→提权”链路附真实场景拆解4.1 链路一Unattend.xml明文密码直接登管理员场景描述你通过web漏洞拿到一个IIS服务的低权限shell系统是Windows Server 2019标准版。操作过程先看C:\Windows\Panther\Unattend.xml是否存在type C:\Windows\Panther\Unattend.xml文件里出现了一段UserAccounts LocalAccounts LocalAccount NameAdministrator/Name Password ValueSuperSecretPss123/Value /Password /LocalAccount /LocalAccounts /UserAccounts直接用管理员账户登录。如果你的shell是web shell可以尝试net use \\127.0.0.1\C$ /user:Administrator SuperSecretPss123来验证凭据有效性或者用runas开启一个高权限进程。这条链路的要点在于Unattend.xml里的密码安装系统时管理员账号可能已经设置好也可能在部署后仍保留原密码。拿到密码之后不一定要立刻用也可以先留着等后续横向移动时继续用。4.2 链路二web.config里的SA账号一条命令直达SYSTEM场景描述目标是一个IIS站点你已经拿到站点的目录读取权限。操作过程找到C:\inetpub\wwwroot\web.configtype C:\inetpub\wwwroot\web.config | findstr /i connection看到连接字符串connectionStrings add nameconn connectionStringServerlocalhost;Databasemaster;User Idsa;PasswordMySAPass!;Trusted_Connectionfalse; / /connectionStrings用数据库客户端sqlcmd或navicat等连接SQL Serversqlcmd -S localhost -U sa -P MySAPass! -Q EXEC xp_cmdshell whoami;如果xp_cmdshell被禁用先启用sqlcmd -S localhost -U sa -P MySAPass! -Q EXEC sp_configure show advanced options,1; RECONFIGURE; EXEC sp_configure xp_cmdshell,1; RECONFIGURE;whoami返回nt authority\system提权完成。这条链路的“为什么有效”在于SQL Server的SA账号默认映射到sysadmin固定服务器角色而xp_cmdshell执行命令时的安全上下文是SQL Server服务账户。如果服务以SYSTEM身份运行那你的命令就是SYSTEM。OSCP考试里这种机器出镜率相当高。4.3 链路三PowerShell历史记录里的密码反转服务路径场景描述你拿到的shell是普通域用户翻了一圈没有明显的明文密码但你在历史记录里看到管理员手动安装过某个服务。操作过程读取PowerShell历史记录type C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt发现管理员曾经执行过New-Service -Name UpdateService -BinaryPathName C:\Program Files\UpdateService\update.exe -StartupType Automatic -Credential CORP\svc_update检查该服务的权限配置sc qc UpdateService sc.exe sdshow UpdateService如果C:\Program Files\UpdateService\目录允许当前用户写入直接替换update.exe为你自己的payload然后重启服务等待SYSTEM权限执行。这条链路的精髓在于你不要只盯着“密码”两个字管理员留下的一切操作痕迹都可能是提权的线索。服务配置、计划任务、共享路径都是搜索敏感信息的延伸方向。4.4 链路四SAM备份文件离线提取哈希场景描述你在一个备份目录中发现了sam.bak和system.bak两个文件。操作过程确认文件存在dir C:\backup\sam.bak dir C:\backup\system.bak把文件下载到本地Kali用impacket-secretsdump离线提取哈希secretsdump.py -sam sam.bak -system system.bak LOCAL拿到Administrator的NTLM哈希后直接哈希传递Pass-the-Hash登录psexec.py -hashes :NTLM_HASH Administratortarget_ip这条链路提醒我们搜索文件时不要只搜关键词还要按扩展名搜.bak、.old、.zip这类备份文件。运维人员非常喜欢把敏感文件打成压缩包放在任意目录里。5. 搜索过程中最容易被忽略的五个翻车点5.1 文件编码问题UTF-16让你什么都搜不到Windows很多原生文件比如某些配置文件、日志是UTF-16编码的也就是每个字符之间夹着一个00字节。findstr默认按ASCII处理面对UTF-16文件几乎搜不出任何有效内容。解决办法是用type查看内容或者用PowerShell的Get-Content它会自动识别编码来搜索。所以我的习惯是findstr搜出来没结果时不要急着下结论改用PowerShell的Select-String再搜一遍。5.2 权限拒绝导致的假阴性低权限shell访问某些目录会直接Access denied但findstr加上2nul后这些错误会被静默丢弃你以为“没结果”其实是“没权限”。解决思路分目录搜索。先搜你有权限读的目录用户目录、临时目录、web目录、公共共享再做全盘搜索。能用dir列出目录内容说明至少能读目录真正读不了的是文件内容。遇到重要目录显示拒绝访问反而要格外留意——里面往往有货。5.3 搜索范围过大导致超时直接对整个C:\做findstr /s是一次灾难性体验遇到机械硬盘能卡到怀疑人生。更合理的方式是用where按扩展名列文件再用findstr逐个查看。或者干脆输入一段精确路径而不是全盘递归。我自己的优先级排序是当前用户目录和桌面C:\Windows\Panther\和C:\Windows\System32\sysprep\web目录IIS的C:\inetpub\、Apache的htdocs等C:\backup\、C:\temp\、C:\Users\Public\全盘按扩展名撒网按这个顺序通常在第2、3步就能出东西。5.4 PowerShell执行策略限制很多目标机器默认禁止执行PowerShell脚本提示“因为在此系统上禁止运行脚本”。解决办法是用cmd启动时绕过powershell -ExecutionPolicy Bypass -Command Get-ChildItem ...如果连PowerShell都用不了就直接用cmd的findstr和reg query功能上虽然弱一点但足够完成绝大多数敏感信息搜索。5.5 搜索行为可能触发EDR和日志告警真实环境里大规模递归搜索会在短时间内产生大量文件访问日志安全设备很可能会把你标记为恶意行为。所以我在实际项目中会刻意控制搜索范围优先做高价值目录的定向搜索而不是无脑全盘扫。OSCP考试环境没有EDR但养成这种克制的习惯没有坏处。6. OSCP实战节奏五步快速筛查法与心态建议6.1 拿到shell后的第一个五分钟我的习惯是拿到任何Windows shell后先把下面这五步快速走一遍成本极低收益极高查用户和权限whoami /all了解当前用户、所属组、特权。查历史记录快速读取ConsoleHost_history.txt和cmd.exe历史记录。查关键目录Panther、sysprep、当前用户桌面和文档。查连接串web.config、.env、config.php、applicationHost.config。查计划任务schtasks /query /fo LIST /v看有没有可写脚本或高权限任务。跑完这五步再决定要不要上winPEAS。很多时候五步之内就已经有了提权路径。6.2 不要钻进兔子洞搜索敏感信息最大的风险是“自嗨”。你找到一个password关键词激动半天结果发现是某个软件的帮助文档在介绍密码规范。这种事我经历过太多次。判断一个敏感信息是否“真正可用”标准很简单它能不能直接或间接让你获得更高权限的执行能力。如果只是“能看”但不能“用”先记下来不要打断主线的排查节奏。6.3 记录与命名别低估笔记的价值OSCP考试时你会同时打好几台机器信息很容易混。每一台机器单独建一个笔记页凡是搜索到的敏感信息哪怕暂时不知道有什么用也先记录下来。有一次我在一台机器上翻到一句backup user password is BackupAdmin!当时没找到这个用户在哪用但几个小时后横向时发现另一台机器正好用这个名字登录直接省了一轮爆破。这些“伏笔”在考试里经常会派上大用场。6.4 心态上的最后一点建议Windows权限提升最忌讳的就是急躁。敏感信息搜索不像打漏洞那样有强烈的“击破感”它更像是拼图——你翻到的每一条密码、每一份配置、每一个历史命令都是拼图的一小块。有时候你翻了一个小时一无所获但某个毫不起眼的文件名会在你另一个动作之后突然变得重要起来。我自己在OSCP备考后期已经把“先搜二十分钟敏感信息”变成了每次拿shell之后的默认动作像开机要先点亮屏幕一样自然。事实证明这个动作帮我拿下了不少原本看起来毫无头绪的靶机。考试如是真实的授权测试亦如是——别小看那些散落在系统里的“垃圾文件”管理员埋下的雷往往就是你最舒服的提权通道。