ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PowerSploit PowerView 的 Find-InterestingFile 深度指南:按关键词递归搜索敏感文件的侦察利器

PowerSploit PowerView 的 Find-InterestingFile 深度指南:按关键词递归搜索敏感文件的侦察利器 PowerSploit PowerView 的 Find-InterestingFile 深度指南按关键词递归搜索敏感文件的侦察利器【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit导读Find-InterestingFile是 PowerSploit 框架的 Recon 模块PowerView 工具集中用于文件侦察的核心函数它能够在本地路径或 UNC 网络共享上递归搜索文件名匹配指定关键词如 password、sensitive、secret、admin 等的有趣文件并可结合时间戳、写权限与备用凭据等条件进一步收敛结果。读完本篇你将掌握该函数全部参数的含义与用法、三种预置参数集FileSpecification / OfficeDocs / FreshEXEs的差异、输出对象PowerView.FoundFile的结构以及其底层基于Get-ChildItem与WNetAddConnection2W的实现原理能够在渗透测试的后期利用Post-Exploitation阶段快速定位可窃取凭据、配置或敏感资料的候选文件。功能定位为何需要按文件名找敏感文件在内网渗透的侦察阶段攻击者或授权红队人员最常做的事情之一就是在文件服务器、备份目录、用户主目录中翻找包含明文口令、凭据、配置信息的文件。手动逐个目录翻看不现实而Find-InterestingFile恰好把这一过程自动化它递归遍历指定路径按一组预置的通配符规则匹配文件名把命中项连同所有者、时间戳、文件大小等元数据一并返回。从仓库定义看该函数由 Will Schroederharmj0y编写采用 BSD 3-Clause 许可声明的外部依赖为Add-RemoteConnection与Remove-RemoteConnection用于凭据映射远程共享。完整实现位于 Recon/PowerView.ps1并通过 Recon/Recon.psd1 导出为 Recon 模块命令Recon/README.md 中的功能索引将其概括为searches for files on the given path that match a series of specified criteria。加载方式Find-InterestingFile包含在 PowerView 中你可以直接导入整个 PowerView 脚本Import-Module .\Recon\PowerView.ps1或者加载 Recon 模块同时获得Get-HttpStatus、Invoke-ReverseDnsLookup等其余侦察工具Import-Module .\Recon\Recon.psd1导入后即可通过Get-Command Find-InterestingFile验证命令是否可用。三种语法集Parameter Sets根据官方文档 docs/Recon/Find-InterestingFile.md该函数共有三种语法集分别面向自定义关键词、Office 文档和近期 EXE三类场景。源码中通过[CmdletBinding(DefaultParameterSetName FileSpecification)]Recon/PowerView.ps1指定默认参数集为FileSpecification。FileSpecification默认Find-InterestingFile [[-Path] String[]] [-Include String[]] [-LastAccessTime DateTime] [-LastWriteTime DateTime] [-CreationTime DateTime] [-ExcludeFolders] [-ExcludeHidden] [-CheckWriteAccess] [-Credential PSCredential]OfficeDocsFind-InterestingFile [[-Path] String[]] [-OfficeDocs] [-CheckWriteAccess] [-Credential PSCredential]FreshEXEsFind-InterestingFile [[-Path] String[]] [-FreshEXEs] [-CheckWriteAccess] [-Credential PSCredential]注意OfficeDocs与FreshEXEs是互斥的快捷开关一旦使用便不再接受-Include和三个时间参数它们只属于FileSpecification参数集而-CheckWriteAccess与-Credential在所有参数集中都可用。参数详解以下参数信息继承自官方文档并对照源码逐一核实。-Path要递归搜索的 UNC/本地路径。Type: String[] Parameter Sets: (All) Required: False Position: 1 Default value: .\ Accept pipeline input: True (ByPropertyName, ByValue) Accept wildcard characters: False源码中定义$Path .\Recon/PowerView.ps1默认搜索当前目录。支持传数组或通过管道输入多个路径函数会逐个处理。-Include仅返回文件名匹配指定字符串数组的文件/文件夹例如(*.doc*, *.xls*, *.ppt*)。别名为SearchTerms、Terms。Type: String[] Parameter Sets: FileSpecification Required: False Position: Named Default value: (*password*, *sensitive*, *admin*, *login*, *secret*, unattend*.xml, *.vmdk, *creds*, *credential*, *.config) Accept pipeline input: False Accept wildcard characters: False该默认数组在 Recon/PowerView.ps1 中与文档完全一致它直接作为Get-ChildItem -Include的参数使用因此通配符语法遵循 PowerShell 的文件匹配规则。-LastAccessTime只返回LastAccessTime大于该日期值的文件。Type: DateTime Parameter Sets: FileSpecification Required: False Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: False-LastWriteTime只返回LastWriteTime大于该日期值的文件。Type: DateTime Parameter Sets: FileSpecification Required: False Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: False-CreationTime只返回CreationTime大于该日期值的文件。Type: DateTime Parameter Sets: FileSpecification Required: False Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: False-OfficeDocs开关参数。搜索 Office 文档*.doc*、*.xls*、*.ppt*。Type: SwitchParameter Parameter Sets: OfficeDocs Required: False Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False源码中对应的展开规则为(*.doc, *.docx, *.xls, *.xlsx, *.ppt, *.pptx)Recon/PowerView.ps1。-FreshEXEs开关参数。查找最近 7 天内被访问过的.EXE文件。Type: SwitchParameter Parameter Sets: FreshEXEs Required: False Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False源码实现为$LastAccessTime (Get-Date).AddDays(-7).ToString(MM/dd/yyyy)并将Include设为(*.exe)Recon/PowerView.ps1。注意它复用的是 LastAccessTime 过滤路径。-ExcludeFolders开关参数。从搜索结果中排除文件夹。Type: SwitchParameter Parameter Sets: FileSpecification Required: False Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False-ExcludeHidden开关参数。从搜索结果中排除隐藏文件和文件夹。默认情况下隐藏项包含在结果中。Type: SwitchParameter Parameter Sets: FileSpecification Required: False Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False源码通过$SearcherArguments[Force] -not $PSBoundParameters[ExcludeHidden]Recon/PowerView.ps1实现未指定-ExcludeHidden时Force为$True让Get-ChildItem强制显示隐藏项。-CheckWriteAccess开关参数。只返回当前用户具有写权限的文件。所有参数集均可用。Type: SwitchParameter Parameter Sets: (All) Required: False Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False源码中通过内部辅助函数Test-Write实现见下文实现解析。-Credential用于连接远程系统进行文件枚举的备用凭据[Management.Automation.PSCredential]对象。Type: PSCredential Parameter Sets: (All) Required: False Position: Named Default value: [Management.Automation.PSCredential]::Empty Accept pipeline input: False Accept wildcard characters: False当-Path是 UNC 路径匹配\\主机\共享形式且传入了凭据时函数会先用Add-RemoteConnection临时挂载该主机的IPC$枚举结束后再用Remove-RemoteConnection清理详见下文实现解析。输出对象PowerView.FoundFileFind-InterestingFile的输出类型为PowerView.FoundFile文档 OUTPUTS 章节由源码[OutputType(PowerView.FoundFile)]与$FoundFile.PSObject.TypeNames.Insert(0, PowerView.FoundFile)Recon/PowerView.ps1共同确认。每个命中文件输出一个对象包含以下属性属性来源Path文件完整路径FullNameOwner通过Get-Acl $_.FullName取得的文件所有者LastAccessTime上次访问时间LastWriteTime上次写入时间CreationTime创建时间Length文件大小字节字段构建逻辑位于 Recon/PowerView.ps1。该对象可直接通过Where-Object、Sort-Object或管道进一步处理例如筛选大文件或按路径排序。实战示例示例 1搜索本地备份目录默认关键词Find-InterestingFile -Path C:\Backup\返回本地路径C:\Backup\下文件名匹配默认搜索词集合的所有文件包括隐藏项。示例 2远程共享 访问时间过滤Find-InterestingFile -Path \\WINDOWS7\Users\ -LastAccessTime (Get-Date).AddDays(-7)返回远程路径\\WINDOWS7\Users\下命中默认搜索词、且最近 7 天内被访问过的文件。示例 3备用凭据枚举远程共享$SecPassword ConvertTo-SecureString Password123! -AsPlainText -Force $Cred New-Object System.Management.Automation.PSCredential(TESTLAB\dfm.a, $SecPassword) Find-InterestingFile -Credential $Cred -Path \\PRIMARY.testlab.local\C$\Temp\先用明文口令构造PSCredential再以该凭据枚举远程主机的C$\Temp\。由于路径是 UNC 且传入了凭据函数会自动挂载IPC$并在结束后卸载。扩展组合示例以下组合体现了各参数的实际搭配价值# 只找可写的配置文件便于进一步写入/篡改 Find-InterestingFile -Path \\FILESRV\Share\ -Include (*.config, *.ini, *.xml) -CheckWriteAccess # 找最近一周修改过的 Office 文档 Find-InterestingFile -Path D:\Docs\ -OfficeDocs -LastWriteTime (Get-Date).AddDays(-7) # 找 7 天内被访问过的可执行文件 Find-InterestingFile -Path C:\Program Files\ -FreshEXEs -ExcludeFolders # 排除隐藏项并排除文件夹只保留文件结果 Find-InterestingFile -Path \\SERVER\C$\ -ExcludeHidden -ExcludeFolders -Credential $Cred # 管道传入多个路径 C:\Backup\, D:\Temp\ | Find-InterestingFile -Include (*pass*, *key*)源码级实现解析整体流程函数的执行体分为BEGIN、PROCESS、END三个阶段Recon/PowerView.ps1BEGIN 阶段——构造搜索参数并准备辅助函数建立$SearcherArguments哈希表固定设置Recurse $True递归与ErrorAction SilentlyContinue静默跳过无权限目录避免刷屏报错并放入Include关键词数组Recon/PowerView.ps1。若指定-OfficeDocs覆盖Include为 Office 扩展名集合若指定-FreshEXEs覆盖为*.exe并设置 7 天前的 LastAccessTimeRecon/PowerView.ps1。通过Force参数决定是否显示隐藏文件。定义内部函数Test-WriteRecon/PowerView.ps1它尝试用[IO.File]::OpenWrite($Path)以写模式打开文件成功则返回$True抛异常则返回$False——这就是-CheckWriteAccess的判定依据。需要注意的是该检查会真实地尝试获取写句柄对目标文件会产生轻微副作用。PROCESS 阶段——按路径逐个枚举与过滤对每个目标路径若其为 UNC 路径正则\\\\.*\\.*匹配且传入了-Credential则解析出主机名并通过$MappedComputers哈希表去重对未挂载过的主机调用Add-RemoteConnection -ComputerName $HostComputer -Credential $Credential挂载IPC$Recon/PowerView.ps1。执行Get-ChildItem SearcherArguments参数展开获得全部命中项然后对每一项依次判定-ExcludeFolders$_.PSIsContainer为真则跳过写 Verbose 日志Excluding: ...-LastAccessTimeLastAccessTime小于阈值则跳过-LastWriteTimeLastWriteTime小于阈值则跳过-CreationTimeCreationTime小于阈值则跳过-CheckWriteAccessTest-Write失败则跳过。全部通过后构建PowerView.FoundFile对象并输出。END 阶段——清理远程映射遍历$MappedComputers.Keys对每个主机调用Remove-RemoteConnection卸载之前挂载的IPC$连接Recon/PowerView.ps1保证侦察结束后不残留凭据映射。底层依赖Add-RemoteConnection / Remove-RemoteConnection当使用-Credential时真正承担网络连接任务的是 PowerView 的这两个辅助函数Recon/PowerView.ps1Add-RemoteConnection基于 PSReflect 动态调用 Win32 APIWNetAddConnection2W通过$Mpr::WNetAddConnection2W使用CONNECT_TEMPORARY 4标志建立临时不保存连接从而在不改动系统持久网络映射的前提下用备用凭据访问远程资源调用失败会抛出包含 Win32 错误信息的异常。Remove-RemoteConnection调用WNetCancelConnection2销毁对应连接。正因为挂载→枚举→卸载被封装在同一函数内即使脚本异常中断正常路径下的映射也会在 END 阶段被清理。默认关键词清单的覆盖逻辑默认搜索词覆盖了常见的敏感文件命名模式口令/凭据类*password*、*creds*、*credential*敏感/管理类*sensitive*、*secret*、*admin*、*login*系统/配置类unattend*.xml无人值守安装应答文件常含明文口令、*.config、*.vmdk虚拟机磁盘镜像这一默认集合并未涵盖所有场景例如.kdbx、.ppk、id_rsa等因此实战中强烈建议结合-Include按目标环境自定义关键词。与 Find-InterestingDomainShareFile 的联动Find-InterestingFile不只是独立命令它还是 PowerView 中另一个侦察函数Find-InterestingDomainShareFile的核心引擎。后者会先通过Get-DomainComputer枚举域内主机、Get-NetShare列出共享然后对每个共享调用Find-InterestingFile递归搜刮有趣文件见 docs/Recon/Find-InterestingDomainShareFile.md 中use Find-InterestingFile on each的描述及其依赖声明。因此掌握Find-InterestingFile的参数细节也就掌握了域共享文件搜刮链路的底层能力。测试与已知边界测试覆盖仓库的测试文件 Tests/Recon.tests.ps1 中为Find-InterestingFile保留了Describe块但注释为#TODO: implement即目前没有自动化测试实现——这一点在评估该函数可靠性时值得留意。静默容错Get-ChildItem使用ErrorAction SilentlyContinue无权限访问的目录会被静默跳过不会中断整个搜索但也意味着结果可能不完整应视为尽力而为的枚举。写权限检查的代价-CheckWriteAccess会对每个候选文件执行一次打开写句柄的操作在共享上枚举大量文件时会有一定的性能开销且可能触发文件系统审计日志。环境要求这是面向 Windows 环境的 PowerShell 脚本依赖Get-Acl、WNetAddConnection2W等 Windows 特性需要在可访问目标路径本地或内网共享的 Windows 主机上运行使用-Credential需要具备相应的域/本地凭据权限。合规提示PowerSploit 是一个后渗透利用Post-Exploitation框架Find-InterestingFile设计用于在已获授权的渗透测试、红队演练或安全评估中搜索敏感文件。请务必在取得书面授权的前提下使用并注意其输出可能包含高敏数据明文口令、凭据文件等妥善保管扫描结果。参考路径速查官方文档docs/Recon/Find-InterestingFile.md函数实现Recon/PowerView.ps1依赖函数远程连接Recon/PowerView.ps1模块导出声明Recon/Recon.psd1功能索引Recon/README.md测试占位Tests/Recon.tests.ps1联动函数文档docs/Recon/Find-InterestingDomainShareFile.md【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表