PowerSploit PowerView Find-DomainShare 使用指南:域共享枚举与访问权限检测
发布时间:2026/9/23 2:31:52 作者:尧图编辑部 阅读量:1,286

渗透测试网络安全【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址https://gitcode.com/gh_mirrors/po/PowerSploit点击查看免费下载导读Find-DomainShare是 PowerSploit 仓库 Recon 模块 中 PowerView 工具集提供的线程化Threadedmeta函数用于在 Windows 域环境中批量枚举各台计算机上开放的共享share并可进一步校验当前用户对这些共享的实际读取权限。本文以 Find-DomainShare 官方文档 为主体结合 Recon/PowerView.ps1 源码与 Tests/Recon.tests.ps1 测试用例展开讲解。读完本文你将掌握该函数的全部参数语义、典型调用方式、底层 Win32 API 调用链以及如何结合-CheckShareAccess、-Credential、-Threads、-Delay等参数在真实内网渗透/红队场景中高效、低噪声地完成共享资产盘点。功能定位域共享资产盘点在域内信息收集阶段有哪些机器开放了共享、哪些共享可读直接关系到后续横向移动与敏感文件收集的路径选择。Find-DomainShare正是为此设计输入当前域或指定域内的计算机集合输出每台计算机上枚举到的共享对象类型为PowerView.ShareInfo核心能力先通过Get-DomainComputer拿到域内所有计算机再对每台机器调用Get-NetShare枚举共享若指定-CheckShareAccess则进一步验证当前用户对这些共享是否拥有读取权限。从源码结构看Recon/PowerView.ps1它是 PowerView 文档中归类的Threaded Meta-Functions之一见 docs/Recon/index.md与Find-DomainUserLocation、Find-InterestingDomainShareFile、Find-LocalAdminAccess等函数并列——这些函数的共同特征是接受主机数组输入、使用多 runspace 线程化执行、面向全域名主机批量枚举。工作原理与底层调用链Find-DomainShare的执行可抽象为如下调用链Find-DomainShare ├─ Get-DomainComputer # LDAP 查询域内计算机对象只取 dnshostname ├─ New-ThreadedFunction # 将主机列表分片RunspacePool 多线程并行 │ └─ HostEnumBlock │ ├─ Test-Connection # 探测主机是否存活 │ ├─ Get-NetShare # 对每台存活主机枚举共享 │ │ └─ Netapi32::NetShareEnum # Win32 APIquery level 1 │ └─ [IO.Directory]::GetFiles() # 可选-CheckShareAccess 校验读取权限 └─ Invoke-UserImpersonation / Invoke-RevertToSelf # 可选-Credential 凭据模拟关键环节说明计算机发现BEGIN块中把ComputerDomain、ComputerLDAPFilter、ComputerSearchBase、ComputerOperatingSystem等参数组装成哈希表$ComputerSearcherArguments调用Get-DomainComputer并仅取dnshostname属性作为枚举目标。若未传入-ComputerName默认枚举域内全部机器若一个主机都没找到函数会直接throw [Find-DomainShare] No hosts found to enumerate见 Recon/PowerView.ps1。共享枚举对每个存活主机调用Get-NetShare。Get-NetShare本身是NetShareEnumWin32 API 的封装见 Recon/PowerView.ps1使用查询级别 1$QueryLevel 1将返回的内存缓冲区按$SHARE_INFO_1结构解析——该结构包含Name共享名、Type共享类型、Remark备注三个字段见 Recon/PowerView.ps1。解析完成后函数为每个共享对象附加ComputerName属性并把类型名置为PowerView.ShareInfo。该 API 调用即是对传统net share \\hostname命令的 PowerShell 化替代。读取权限校验可选当指定-CheckShareAccess时对拼接出的 UNC 路径\\主机名\共享名调用[IO.Directory]::GetFiles($Path)能成功列出文件即视为可读并输出该共享否则捕获异常并仅以Write-Verbose记录错误见 Recon/PowerView.ps1。凭据模拟可选指定-Credential时先调用Invoke-UserImpersonation获得模拟令牌$LogonToken枚举结束后在END块中调用Invoke-RevertToSelf -TokenHandle $LogonToken还原上下文见 Recon/PowerView.ps1 与 L18383-L18387。Invoke-UserImpersonation本质是创建类 runas /netonly 的登录会话并模拟其令牌见 docs/Recon/index.md。线程化并行默认通过New-ThreadedFunction把主机列表按-Threads数量分片交给基于RunspacePool的多个并行 runspace 执行达到显著加速效果见 Recon/PowerView.ps1。参数详解以下参数定义与 Find-DomainShare 官方文档 一致并补充了源码中可见的校验约束[ValidateRange]、[ValidateSet]等主机与计算机筛选参数参数类型默认值说明-ComputerNameString[]无指定一个或多个主机进行枚举支持管道输入别名DNSHostName位置参数Position 1。不指定时默认枚举Get-DomainComputer返回的域内全部机器-ComputerDomainString无查询计算机的域默认当前域别名Domain-ComputerLDAPFilterString无用于搜索计算机对象的 LDAP 查询字符串例如(operatingSystem*Server*)-ComputerSearchBaseString无搜索计算机的 LDAP 起始点例如LDAP://OUsecret,DCtestlab,DClocal适用于 OU 定向查询-ComputerOperatingSystemString无按操作系统过滤计算机支持通配符别名OperatingSystem-ComputerServicePackString无按 Service Pack 版本过滤计算机支持通配符别名ServicePack-ComputerSiteNameString无按 AD Site 名称过滤计算机支持通配符别名SiteName行为控制参数参数类型默认值说明-CheckShareAccessSwitchParameterFalse仅返回当前用户可读取的共享别名CheckAccess。底层使用[IO.Directory]::GetFiles()做实际读取探测-CredentialPSCredential[Management.Automation.PSCredential]::Empty备用凭据对象用于连接目标域与目标系统指定后通过Invoke-UserImpersonation模拟该用户-ServerString无指定要绑定的 Active Directory 服务器域控制器别名DomainController-SearchScopeStringSubtreeLDAP 搜索范围可选Base/OneLevel/Subtree源码中由[ValidateSet(Base,OneLevel,Subtree)]约束-ResultPageSizeInt32200LDAP 搜索器对象的 PageSize源码约束[ValidateRange(1, 10000)]-ServerTimeLimitInt320源码默认不设值文档描述为 120 秒服务器端搜索耗时上限秒超过即截断返回-TombstoneSwitchParameterFalse搜索器同时返回已删除/墓碑化的对象执行节奏与并发参数参数类型默认值说明-DelayInt320相邻主机枚举之间的延迟秒用于降低枚举噪声、规避检测源码约束[ValidateRange(1, 10000)]。指定后自动切换为串行模式见下文-JitterDouble0.3对-Delay施加的抖动比例0–1.0实际睡眠时间随机落在(1-Jitter)*Delay到(1Jitter)*Delay之间源码约束[ValidateRange(0.0, 1.0)]-ThreadsInt3220并行枚举使用的线程runspace数源码约束[ValidateRange(1, 100)]且实际线程数不会超过主机总数输入与输出输入管道-ComputerName支持ByPropertyName与ByValue管道绑定因此Get-DomainComputer | Find-DomainShare这类链式写法可直接生效。输出PowerView.ShareInfo类型对象[OutputType(PowerView.ShareInfo)]每个对象包含共享名Name、类型Type、备注Remark及附加的ComputerName字段。实战示例示例 1枚举当前域全部共享Find-DomainShare枚举当前域中所有计算机上开放的共享。这是最基础的用法不校验读取权限速度快、覆盖面广适合先做整体资产摸底。示例 2只返回当前用户可读的共享Find-DomainShare -CheckShareAccess在枚举基础上追加读取权限校验仅输出当前用户能够读取文件列表的共享。该模式结合后续的Find-InterestingDomainShareFile使用可以直接定位可读共享中是否有敏感文件的路径。示例 3使用备用凭据枚举指定域$SecPassword ConvertTo-SecureString Password123! -AsPlainText -Force $Cred New-Object System.Management.Automation.PSCredential(TESTLAB\dfm.a, $SecPassword) Find-DomainShare -Domain testlab.local -Credential $Cred在testlab.local域中使用TESTLAB\dfm.a的备用凭据进行枚举。注意-Domain是-ComputerDomain的别名见 Recon/PowerView.ps1因此该写法等价于-ComputerDomain testlab.local。传入-Credential后函数会先执行Invoke-UserImpersonation模拟该用户使后续对每台主机的 SMB 共享枚举都携带该用户的身份上下文并在结束前自动Invoke-RevertToSelf还原。进阶定向枚举与管道组合# 只枚举指定主机 Find-DomainShare -ComputerName dc01, sql01, file01 # 与 Get-DomainComputer 管道组合只查 Windows Server 2016 且属于指定 Site 的机器 Get-DomainComputer -OperatingSystem *Windows Server 2016* -SiteName Default-First-Site-Name | Find-DomainShare -CheckShareAccess # 定向 OU 查询枚举指定 OU 内计算机的共享 Find-DomainShare -ComputerSearchBase LDAP://OUservers,DCtestlab,DClocal -CheckShareAccess源码级执行流程剖析BEGIN构造查询并准备令牌BEGIN块Recon/PowerView.ps1完成三件事把-ComputerDomain、-ComputerLDAPFilter、-ComputerSearchBase等参数动态组装进$ComputerSearcherArguments仅显式传入的参数才会被透传给Get-DomainComputer通过$PSBoundParameters判断避免默认值污染查询若未提供-ComputerName则执行Get-DomainComputer ComputerSearcherArguments | Select-Object -ExpandProperty dnshostname取回全部主机名主机为空时抛出终止性错误若提供了-Credential调用Invoke-UserImpersonation获取$LogonToken。PROCESS串行 vs 线程化两条路径PROCESS块Recon/PowerView.ps1根据是否指定-Delay或-StopOnSuccess选择执行模式串行模式指定-Delay放弃线程化逐台主机枚举。每轮先用System.Random生成(1-Jitter)*Delay到(1Jitter)*Delay之间的随机秒数执行Start-Sleep再通过Invoke-Command -ScriptBlock $HostEnumBlock处理单台主机。这样枚举节奏不可预测适合在 IDS/EDR 敏感的对抗环境中降低被发现概率。线程化模式默认调用New-ThreadedFunction将主机列表切分为-Threads个分区并行执行。New-ThreadedFunctionRecon/PowerView.ps1内部创建RunspacePool(1, $Threads, $SessionState, $Host)并把当前会话的变量与函数导入新 runspace确保HostEnumBlock内可以继续调用Get-NetShare、Invoke-UserImpersonation等 PowerView 函数同时强制 STA 单元状态以支持令牌模拟。主机枚举脚本块存活探测 → 共享枚举 → 权限校验$HostEnumBlockRecon/PowerView.ps1是核心执行单元对每个目标执行$Up Test-Connection -Count 1 -Quiet -ComputerName $TargetComputer if ($Up) { $Shares Get-NetShare -ComputerName $TargetComputer ForEach ($Share in $Shares) { $ShareName $Share.Name $Path \\ $TargetComputer \ $ShareName if (($ShareName) -and ($ShareName.trim() -ne )) { if ($CheckShareAccess) { try { $Null [IO.Directory]::GetFiles($Path) $Share } catch { Write-Verbose Error accessing share path $Path : $_ } } else { $Share } } } }要点先做单次Test-Connection存活探测跳过离线主机以节省时间共享名为空/纯空格的记录被过滤-CheckShareAccess通过真实尝试[IO.Directory]::GetFiles()来验证读取能力而非仅检查共享 ACL 静态信息——对于需要能否真正列出内容的评估场景这是更贴近实战的判定方式令牌模拟模式下块开头Invoke-UserImpersonation -TokenHandle $TokenHandle -Quiet块结尾Invoke-RevertToSelf保证每台主机的探测身份一致且及时还原。END清理令牌END块Recon/PowerView.ps1在存在$LogonToken时调用Invoke-RevertToSelf -TokenHandle $LogonToken确保模拟身份在函数返回前被彻底还原。测试验证仓库测试 Tests/Recon.tests.ps1 对底层依赖Get-NetShare进行了覆盖验证了以下行为本机无参数调用可枚举出至少 1 个共享-ComputerName $env:computername与-ComputerName $LocalIP两种目标写法均可返回共享支持$env:computername | Get-NetShare管道输入。这些测试间接印证了Find-DomainShare所依赖的共享枚举能力在本地与远程、IP 与主机名、管道输入等场景下的正确性。与其他 PowerView 功能的衔接Find-DomainShare通常是内网共享资产发现链路的起点可自然衔接以下 Recon 模块函数均见 docs/Recon/index.mdFind-InterestingDomainShareFile在域内可读共享中按条件搜索文件与-CheckShareAccess的输出高度互补Find-LocalAdminAccess进一步定位当前用户具备本地管理员权限的机器为共享枚举结果增加权限维度Get-NetShare单机级共享枚举原语Find-DomainShare的底层依赖也可单独使用如Get-NetShare -ComputerName sqlserver。注意事项与适用前提环境前提本函数面向 Windows 域环境需要能够通过 LDAP 查询 ADGet-DomainComputer依赖 PowerShell 的 AD 钩子与 Win32 API并具备到目标主机 SMB139/445端口的网络可达性对目标主机的共享查询需要相应网络共享枚举权限普通域用户通常可列出默认共享外的开放共享。凭据安全-Credential传参时建议像示例中一样先构造PSCredential对象并妥善保管明文口令避免在命令行中直接暴露。噪声控制大规模默认线程化枚举可能在短时间内产生大量 SMB 连接与 LDAP 查询流量在对抗性场景中建议使用-Delay/-Jitter串行慢速模式并结合-ComputerLDAPFilter、-ComputerSearchBase、-ComputerSiteName等参数缩小目标范围。结果解读输出中的Type字段为SHARE_INFO_1结构中的共享类型数值如磁盘共享、打印队列、IPC 等可据此过滤出真正感兴趣的磁盘共享类资源。参考资料官方函数文档docs/Recon/Find-DomainShare.md源码实现Recon/PowerView.ps1底层依赖Get-NetShareRecon/PowerView.ps1线程化助手New-ThreadedFunctionRecon/PowerView.ps1共享结果结构$SHARE_INFO_1Recon/PowerView.ps1测试用例Tests/Recon.tests.ps1赞分享渗透测试网络安全【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址https://gitcode.com/gh_mirrors/po/PowerSploit点击查看免费下载相关推荐PowerSploit PowerView 域共享文件侦查Find-InterestingDomainShareFile 实战指南PowerSploit PowerView 域共享文件侦查Find InterestingDomainShareFile 实战指南 导读 Find Inter渗透测试网络安全PowerSploit Recon 模块 Get-DomainGroup 使用指南PowerView 域组枚举与成员关系查询PowerSploit Recon 模块 Get DomainGroup 使用指南PowerView 域组枚举与成员关系查询 导读 Get DomainGro渗透测试网络安全PowerSploit PowerView 实战用 Find-InterestingDomainAcl 挖掘域内可利用的 ACL 修改权限PowerSploit PowerView 实战用 Find InterestingDomainAcl 挖掘域内可利用的 ACL 修改权限 导读 Find I渗透测试网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考