ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Windows提权信息收集下篇:软件、进程、计划任务与敏感文件全排查

Windows提权信息收集下篇:软件、进程、计划任务与敏感文件全排查

1. 信息收集的延续:为什么“下篇”更关键

接着上一篇继续聊。前文我们把ipconfig /all、systeminfo、whoami /priv这些“开场三板斧”过了一遍,拿到了网络配置、补丁级别和基本权限面貌。但如果你以为信息收集到此为止,那后面的路会越走越窄。OSCP考试的靶机往往不会把答案直接摆在systeminfo的输出里,更多时候,关键线索藏在下一层:已安装软件、进程列表、计划任务、历史命令、敏感文件、当前用户环境变量。这些数据点单看都不起眼,但拼在一起能勾勒出完整的提权路径。本篇要做的就是把这层“看不见的地表”翻出来。

先说清楚这篇博文面向谁。如果你是正在备考OSCP的选手,或者平时做授权渗透测试、红队评估的技术人员,这篇文章帮你把Windows下的信息收集脉络理顺,知道下一步该往哪个方向使劲。如果你是刚入门的安全爱好者,读这篇可以建立一个基本认知:提权不是瞎试exp,而是先把自己变成目标机器里的“本地用户”,用它的眼睛看世界。

我习惯把信息收集分成两个阶段。第一阶段是“猜”,用系统自带命令快速勾勒轮廓,上一篇覆盖了这部分。第二阶段是“查”,基于第一阶段的线索做定向深挖——查软件、查服务、查任务、查历史、查文件。第二阶段决定了你最终能不能凑齐提权所需的最后一块拼图。所以这篇的内容,本质上是给“从普通用户到SYSTEM”这段路上铺路。

2. 软件与补丁信息:找提权杠杆的支点

拿到一个Windows shell之后,我最先看的东西之一就是已安装软件列表。原因很简单:第三方软件是提权漏洞的重灾区。系统补丁可能有专人维护,但某个角落里装的老旧播放器、PDF阅读器、压缩工具,往往没人记得更新。而OSCP靶机里,这类软件几乎就是为你准备的入口。

2.1 获取已安装软件列表的几种方式

Windows下查看已安装软件,最常用的是注册表卸载项,但我建议你同时用好几种方法交叉验证,因为不同方式得到的信息完整性不一样。

:: 查看当前用户的软件安装记录 reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall /s :: 查看全部用户的软件安装记录(需要一定权限,但很多低权限环境也可读) reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s :: 64位系统上还需查看WOW6432Node节点,这里往往藏着32位软件 reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s

实际测试中,第三行命令经常被忽略。32位软件在64位系统上注册在WOW6432Node节点下,而一些老旧的提权exp恰恰是针对32位版本的软件。漏掉这个节点,等于把半张地图扔了。

还有一条路是wmic,虽然微软在新系统里逐步弃用WMIC,但很多旧靶机还能用:

wmic product get name,version,vendor

这条命令会去查询CIM数据库,信息非常全,但有个明显的缺点:慢。wmic product在部分系统上会触发Windows Installer的重新配置,导致命令执行时间长达几分钟,而且可能引起目标系统上的异常行为。我的经验是,先用注册表方式快速看一遍,如果信息不够再考虑wmic。

PowerShell方式在较新系统上更灵活:

Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

如果你拿到的shell是Meterpreter,直接用post/windows/gather/enum_applications模块也行,本质也是读注册表,但输出格式更友好。不过依赖Meterpreter的话,一旦流量被拦就比较被动,我建议手动命令先走一遍。

2.2 补丁信息核对与缺失补丁判断

拿到软件列表后,脑子里要形成一个动态清单:哪些软件的版本是近两年的,哪些还是四五年前的。旧版本软件往往对应着已公开的CVE,而这些漏洞的利用代码在Exploit-DB或GitHub上基本都能找到。

这里分享一个我常用的工作方法:把收集到的软件名称和版本号放进一个本地维护的“重点关注清单”里核对。清单里记录的是历年提权漏洞高发的软件类型——PDF阅读器、文档处理工具、压缩软件、浏览器、通讯工具、数据库客户端、开发框架运行时等。一旦发现目标机器的软件版本落在漏洞影响范围内,基本就锁定了下一步方向。

补丁信息的核查则是另一条线。上一篇提到的systeminfo输出里,最后一段列出的“Hotfix(s)”就是补丁安装情况。但直接看KB编号去对照缺失补丁,效率太低。实战中更实用的做法是:把KB列表导出来,然后用一些公开的补丁对照脚本去匹配是否存在对应的提权exp可用。

systeminfo > sysinfo.txt findstr /B "KB" sysinfo.txt

导出KB列表之后,可以用在线工具或本地脚本做匹配。需要注意的是,在线匹配工具虽然方便,但会导致KB信息外传。如果你在做涉密或敏感环境的测试,务必在离线环境下用本地脚本做匹配,避免数据外泄。

注意:补丁匹配只是辅助手段,不能完全依赖。很多时候系统显示安装了某个KB,但实际防护依然存在缺口;反过来,某些提权利用并不依赖缺失补丁,而是利用服务配置缺陷或内核逻辑问题。所以补丁线索只能作为方向指引,不能作为唯一判断依据。

2.3 服务类软件与内核版本关联分析

软件列表里还有一类特殊成员:以服务方式运行的后台程序。这类程序如果以SYSTEM权限运行且存在漏洞,提权路径几乎就是“直达”。

wmic service list full | findstr /i "pathname serviceType" sc query type= service state= all

通过服务路径和启动账户,能快速筛出那些以LocalSystem运行的第三方服务。sc query输出的结果里,SERVICE_START_NAME字段就是启动账户,如果是LocalSystem,且服务对应的程序存在已知漏洞,这个服务就是理想的提权目标。

还要注意服务的二进制路径是否可以写。如果服务以SYSTEM权限运行,但服务对应的exe所在目录允许当前用户写入,那么可以直接替换exe,下一次服务重启或系统重启时就能获得SYSTEM shell。这种手法在OSCP中非常常见,后面需要重点排查目录权限。

3. 进程与服务排查:看目标系统正在跑什么

软件列表告诉你系统“装过什么”,进程列表告诉你系统“正在跑什么”。这个区别很关键——有些漏洞利用的前提是特定进程正在运行,有些敏感信息只存在于特定进程的内存里。而且,进程路径往往能暴露软件列表里看不到的东西。

3.1 进程枚举与手工分析技巧

拿到shell后,我通常会先看一眼进程列表,确认目标机器上是否有杀软、EDR等安全产品在运行。这个判断会直接影响后续操作策略:如果杀软进程存在,任何落地文件都需要做免杀处理;如果EDR存在,命令行操作可能被记录分析,需要更小心。

:: 查看所有进程及其路径、PID、会话信息 tasklist /v /fo:list :: 查看进程对应的可执行文件路径 wmic process get processid,name,executablepath,commandline

wmic process返回的commandline字段很有价值。进程启动时携带的命令行参数往往会泄露配置信息,比如数据库连接字符串、管理工具的明文凭据、脚本的路径等。MySQL服务的命令行里可能带着配置文件路径,Web服务的命令行里可能带着站点路径,这些都能帮你定位后续要读取的文件。

PowerShell环境下也可以用:

Get-Process | Select-Object Id, ProcessName, Path Get-CimInstance Win32_Process | Select-Object ProcessId, Name, ExecutablePath, CommandLine

如果当前shell权限不足,某些进程的Path字段可能无法正常显示,这时可以尝试通过/proc文件系统或者通过访问进程的模块列表来获取路径信息。如果实在拿不到路径,至少拿到进程名和PID,结合本地知识也能推断个大概。

3.2 服务配置排查与敏感路径定位

服务排查和进程排查总是配套使用的。我习惯先把服务的启动账户、状态、二进制路径整理成一张表。整理过程本身就是在做“优先级排序”——LocalSystem启动的第三方服务,排在所有排查项的最前面。

sc query type= service state= all | findstr /i "SERVICE_NAME SERVICE_STATE"

拿到服务列表后,对每个非微软服务做三件事。第一,记录启动账户是LocalSystem还是LocalService还是NetworkService;第二,记录二进制路径;第三,检查二进制路径对应的目录权限,确认当前用户是否可写。

这个检查的典型命令是:

icacls "C:\Program Files\SomeService"

如果icacls输出里出现Everyone:(OI)(CI)(F)或者Authenticated Users:(OI)(CI)(M)这类权限,当前用户大概率可以在这个目录里写入文件。配合服务重启权限(通过sc或net stop/start能否控制该服务),就能构成一条完整的提权链路。

还有一类容易被忽略的是可注册的服务路径——如果服务启动的二进制路径里有未加引号的可执行路径,且路径中存在空格,就可能存在“不带引号的服务路径”提权问题。整体思路是:系统在解析带空格的服务路径时,如果原路径没有用引号包裹,就会尝试按空格拆分路径去逐个查找可执行文件。如果你能在其中某个拆分路径上写入自己的exe,服务重启后就会执行你的payload。

3.3 环境变量与当前用户信息的定向提取

环境变量里藏着很多容易被忽略的信息。特别是PATH、TEMP、USERPROFILE、HOMEDRIVE这些变量,它们决定了你在目标上的落脚点。

set reg query "HKCU\Environment"

环境变量中的PATH值得单独看一眼——如果某个目录对当前用户可写,而这个目录又在PATH里,那么当系统尝试调用某个命令时,可能优先执行你放入这个目录的同名程序(路径劫持)。这个手法在CTF靶机和实战中都有运用场景。

当前用户的个人目录也需要仔细翻。C:\Users\<用户名>\Desktop、C:\Users\<用户名>\Documents、C:\Users\<用户名>\Downloads这些目录,经常能翻到以前登录用户留下的笔记、配置文件、脚本和凭据。OSCP靶机的设计者非常喜欢在这些位置放“通关锦囊”。

dir C:\Users\<用户名>\Desktop /a /s dir C:\Users\<用户名>\Documents /a /s dir C:\Users\Public /a /s

C:\Users\Public这个目录常常被忽略。它面向所有用户开放,靶场的出题者有时会把一些通用工具或脚本放在这里。还有回收站里的文件——C:\$Recycle.Bin下如果权限足够,也可能挖到删除但未彻底清除的数据。

4. 计划任务与历史记录:找那些来过又走了的痕迹

计划任务是Windows系统上另一个容易被忽视的信息宝库。系统管理员配置的计划任务,往往承担着备份、清理、同步之类的日常工作。这些任务如果以高权限运行,且任务指向的脚本路径可写,提权链路立刻成立。

4.1 计划任务枚举与可写路径识别

schtasks /query /fo list /v

这条命令会输出所有计划任务的详细信息,包括任务名称、下次运行时间、任务状态、要运行的操作、启动账户等。输出内容很长,建议重定向到文件再慢慢分析:

schtasks /query /fo list /v > tasks.txt

拿到任务列表后,重点筛选两类:一类是启动账户为SYSTEM或Administrator的任务;另一类是路径指向用户可写目录的任务。如果两个条件同时满足,那就等于看到了一条提权通道。

计划任务的另一个是查找当前用户能创建或修改的任务。如果当前用户在某任务的写权限里(可以通过注册表或者schtasks权限设置查看),那么可以直接修改该任务的执行内容,等待系统按计划执行时拿到高权限。

需要注意的是,部分计划任务只在特定时间触发,比如“每天下午三点执行”。如果等不及,可能要考虑其他路径;但有些任务支持手动触发,前提是当前用户对任务有Run权限。

4.2 历史命令、日志与缓存凭据寻找

Windows系统本身不像Linux那样有一个通用的~/.bash_history,但很多软件会在用户目录下留下历史记录文件。PowerShell的历史记录就是一个典型例子:

type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

这条历史记录文件记录了交互式PowerShell会话中输入过的命令。如果管理员在目标机器上配置过服务、改过账号、连过数据库,这些操作很可能就留在历史记录里。读这个文件不需要高权限,只要你能登录到对应用户账户,就能看到该用户的历史命令行内容。

cmd的历史记录相对难拿,但Windows会保存每个会话的LastVisitedMRU和OpenSaveMRU等注册表项,可以看到该用户最近打开过的文件路径。注册表里还有UserAssist键值,记录着用户运行过的程序。

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs"

另一个常被忽视的位置是IIS日志和Web访问日志。如果目标机器上跑了Web服务,日志文件里可能有其他攻击者留下的路径线索,也可能有管理员访问后台管理页面时留下的参数。不过这属于横向信息,和提权的直接关系要看具体情况。

凭据缓存方面,可以关注:

cmdkey /list

cmdkey /list列出当前用户保存的凭据。如果输出里有目标: LegacyGeneric:target=xxxx这样的条目,说明保存了一个通用凭据,后面可以用runas /savecred调用。这个操作在OSCP环境中偶尔能用上。

4.3 网络连接与共享信息排查

网络层面的排查看似和“获取基本信息”关系不大,但实际上,当前主机能访问哪些内网主机、哪些端口开放,直接决定了后续是本地提权还是横向移动。尤其当本地提权暂时无果时,网络信息可能帮你换一条路走。

netstat -ano net use net share

netstat -ano输出当前所有TCP/UDP连接和监听端口。重点关注监听在0.0.0.0或::上的端口——这些端口暴露给整个网络,如果某个端口对应着存在漏洞的服务,其他内网主机可能也在跑同样的服务。net use查看当前建立的SMB连接,net share查看共享目录。共享目录里有时藏着部署脚本、备份文件、配置文件,值得翻一翻。

arp -a也能补充一些信息——当前主机最近通信过的IP和MAC地址,能帮你勾勒内网拓扑的大致轮廓。这些数据结合后续的端口扫描结果,能在全局视角上指导下一步行动方向。

5. 文件系统定向搜索:敏感文件与凭据的隐藏角落

文件系统搜索是最耗时也最看运气的一个环节。系统里文件成千上万,盲目全盘扫描既慢又不精。我的做法是:先圈定几个高概率目录,再配合定向关键词搜索。

5.1 高价值目录清单与搜索策略

常被翻找的高价值文件包括:配置文件(web.config、app.config、.ini)、脚本文件(.ps1、.bat、.cmd、.vbs)、数据库备份文件(.bak、*.sql)、日志文件、SSH密钥、云平台凭据文件、浏览器保存的密码数据库等。

优先搜查的目录:

  • C:\inetpub\wwwroot\——IIS网站根目录,web.config里常带数据库连接字符串
  • C:\xampp\htdocs\——XAMPP默认Web根目录,常见于靶机
  • C:\ProgramData\——程序数据目录,部分软件会把配置明文放在这里
  • C:\Users\<用户名>\AppData\Roaming\——浏览器配置、应用配置、聊天记录
  • C:\Windows\Temp\和C:\Users\<用户名>\AppData\Local\Temp\——临时目录,经常有别人运行过的脚本残留

用命令做定向搜索的话:

where /r C:\ *.config 2>nul where /r C:\ *.bak 2>nul where /r C:\ *.ps1 2>nul

where /r的搜索速度在大型目录树里很慢,而且经常会因为权限不足冒出大量错误信息。更实用的做法是结合dir加/s参数,把输出重定向到文件再慢慢看:

dir C:\ /s /b | findstr /i "\.config$ \.bak$ \.ps1$ \.sql$"

PowerShell环境下面,还可以用Get-ChildItem加-Recurse和-ErrorAction SilentlyContinue来提速:

Get-ChildItem C:\ -Include *.config,*.bak,*.ps1,*.sql -File -Recurse -ErrorAction SilentlyContinue

这里有一个经验:Get-ChildItem -Include需要配合-Recurse或通配符才能起效,直接裸用经常搜不出结果。搜索时也可以加上-Hidden,因为很多敏感文件是隐藏属性。

5.2 用户目录、桌面与文档的定向挖掘

用户目录下的内容值得逐项展开看。桌面和文档往往有“管理员留下的求助信息”之类的文本文件,靶场里也有不少笔记直接在桌面上。

dir C:\Users\ /s /b 2>nul | findstr /v "AppData\\Local\\Google Chrome\\User Data\\Default\\Cache"

这句命令会把所有用户目录下的文件路径列出来,然后过滤掉浏览器的缓存目录,剩下的文件通常数量可控、值得逐一翻阅。注意从结果中筛选出.txt、.md、.rtf这类文本文件,内容通常直接了当。

AppData目录也不该跳过。AppData\Roaming下常见软件配置和会话数据,例如FileZilla的recentservers.xml(保存SFTP/FTP密码)、WinSCP的WinSCP.ini(保存会话密码),这些文件都可能包含以明文或弱加密保存的凭据。这类信息在Windows提权阶段的价值体现在:如果拿到了更高权限的用户凭据,就可以与该用户的权限绑定进行横向或垂直跳跃。

5.3 搜索数据库密码、连接字符串与自动化脚本

拿到一堆文件之后,真正要用的是里面的连接字符串和明文密码。搜索这些内容不需要特别复杂的工具,用findstr配合正则就能过滤:

findstr /si "password\s*=" *.xml *.ini *.txt *.config 2>nul findstr /si "connectionstring" *.xml *.config 2>nul findstr /si "user.*=.*pass" *.txt *.bat *.ps1 2>nul

PowerShell方式则更灵活:

Get-ChildItem C:\Users\ -Recurse -Include *.txt,*.xml,*.ini,*.config,*.ps1 -ErrorAction SilentlyContinue | Select-String -Pattern "password|passwd|pwd|connectionstring" -ErrorAction SilentlyContinue

实际操作中,这类搜索会返回大量误报,需要根据上下文人工判断。但能拿到连接字符串的话,通常意味着拿到了某个数据库的访问权限,而数据库里往往有一张表保存着所有用户的密码哈希。

还有一类自动化脚本特别值得关注——部署脚本、备份脚本、日志清理脚本。管理员为了省事,常把明文密码直接写在脚本里。比如:

net use Z: \\10.10.10.5\backup /user:backupuser Passw0rd123!

如果这个脚本以SYSTEM权限在计划任务里运行,那么脚本中的凭据就是SYSTEM级的凭据;如果这个脚本以当前用户权限运行,也至少能让你在内网中获得一个额外的跳板账户。

6. 常见问题与排查思路速查

信息收集阶段遇到的问题,大多不是技术门槛,而是思路和方法的问题。这里把我踩过的坑和总结出的排查思路整理成一张速查表,方便你自己实操时对照。

常见问题可能原因排查思路
wmic命令无法使用新版Windows移除或未安装WMIC改用Get-CimInstance Win32_Process或注册表方式
命令执行很慢某些wmic product触发了系统重新配置优先用注册表卸载项,避免wmic product
看不到某些进程的路径当前用户权限不足以读取进程可执行路径尝试通过/proc或tasklist /v获取详细信息
systeminfo输出不全或无法执行目标系统过于精简或命令被限制改用读取注册表获取OS版本和补丁信息
PowerShell被禁用或受限组策略限制了脚本执行权限用cmd命令绕过,或者用base64编码命令执行
搜索文件太慢目录文件过多或权限不足导致大量报错分目录搜索,加-ErrorAction SilentlyContinue过滤
杀软拦截操作目标环境存在安全软件先枚举杀软进程,针对性地调整免杀策略和操作方式
计划任务手动触发失败当前用户无任务运行权限检查任务是否允许交互式触发,或改用等待系统调度

排查的过程中,最重要的是保持“记录”的习惯。我一般会在本地笔记里维护一个目标信息表,每收集到一项信息就及时登记,比如当前用户权限、系统版本、补丁列表、软件列表、服务列表、计划任务列表、敏感文件路径、历史记录条目。当信息积累到一定程度时,提权路径往往自己就“浮出水面”了。

有一个教训我重复踩过多次:刚拿到shell时太过兴奋,按着经验里的固定顺序把命令跑完,但没有把结果串起来看。systeminfo里的补丁信息单独看没什么,但和软件列表里的某个老版本软件一对照,提权路径就清楚了。文本搜索到的一个密码单独看也没用,但配上net use的输出立刻就能扩展成一条横向移动路径。信息收集的价值不在于“已知信息多”,而在于“已知信息之间的联系”。

7. 实操中的进阶心得:整理与串联比堆砌命令更重要

这篇的内容虽然重点是“获取目标主机的基本信息(下)”,但我更想强调的一点是:信息收集本身不是目的,后续的串联分析才是。OSCP考试里的很多靶机,提权路径的起点都微不足道——可能只是一个不安全的服务路径、一个桌面上的密码文本文件、一个PowerShell历史记录里的数据库凭据。你能不能在堆成小山的信息里发现那条隐蔽的线,取决于你整理信息的方式。

我个人的做法是:拿到shell的前十分钟,不管三七二十一先跑一遍“标配命令集”,把系统信息、用户信息、网络信息、进程信息、服务信息、计划任务、已安装软件、历史记录全部导出到一个临时文件夹;然后花时间逐项核对,在笔记里把“能对得上”的信息用箭头连起来。比如服务A以SYSTEM运行 → 服务A路径目录可写 → 替换exe或dll → 重启服务拿SYSTEM,这条链路建立起来之后,提权方向就不会跑偏。

再分享一个小技巧:如果条件允许,把reg query的几个关键节点都用上,比如HKLM和HKCU的Software目录全量导出,再配合reg export把结果直接落盘。Windows的注册表里除了软件安装信息,还有大量服务的配置参数、启动命令、环境变量、最近使用项。一个完整导出的注册表,相当于在主机层面获得了一份“全量快照”,很多隐蔽信息都在里面,只是平时没注意。

另外,一定要记得在每次操作前后都重新检查一遍当前用户和权限状态。有时候一次误操作可能让自己的权限被降级,或者触发了目标系统的某些防护机制。一旦发现行为异常,要果断停止操作、重新梳理已有信息,而不是继续盲目试探。

我个人在实际操作中的最大体会是:Windows权限提升的成功率,与其说取决于你掌握多少exploit,不如说取决于你对目标系统信息掌握得有多细。系统里到处是线索,缺的是发现线索的眼睛和把线索拼起来的大脑。拿到shell之后,先别急着找exp库,静下来把机器“读”一遍,往往比盲目试exp有效得多。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进