ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PowerSploit Recon 模块 Get-DomainDFSShare 深度解析:枚举域内分布式文件系统共享

PowerSploit Recon 模块 Get-DomainDFSShare 深度解析:枚举域内分布式文件系统共享 PowerSploit Recon 模块 Get-DomainDFSShare 深度解析枚举域内分布式文件系统共享【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit导读Get-DomainDFSShare是 PowerSploit 项目 Recon 模块核心实现位于 PowerView.ps1中用于发现域内分布式文件系统DFS共享的命令。它通过 LDAP 查询 Active Directory 中fTDfsDFS 命名空间版本 1与msDFS-Linkv2DFS 命名空间版本 2两类对象解析其中内嵌的服务器目标信息输出一份可直接用于横向移动与内网资产梳理的「域内共享服务器」清单。读完本文你将掌握该命令的全部参数语义、三种典型调用方式默认、指定域、备用凭据以及其背后二进制与 XML 解析的源码级原理。功能概览与适用场景Get-DomainDFSShare用于返回当前域或指定域中所有容错型分布式文件系统共享。在 PowerShell 渗透测试与内网侦察框架 PowerSploit 的语境下它的典型价值在于资产发现一次性枚举域内所有 DFS 根目录与链接link所指向的后端文件服务器信息收集为后续的共享探测、凭据抓取如 SYSVOL 中 GPP 密码或横向移动提供目标清单域拓扑测绘配合Get-DomainShare、Get-DomainComputer等命令还原文件服务分布。命令由 Ben Campbellmeatballs__编写遵循 BSD 3-Clause 许可唯一必需依赖是 Get-DomainSearcher用于构建自定义 AD 搜索器对象。该命令已在 Recon.psd1 中声明为模块导出函数因此导入 Recon 模块后即可直接调用。语法与参数详解命令的完整语法如下Get-DomainDFSShare [[-Domain] String[]] [[-SearchBase] String] [[-Server] String] [[-SearchScope] String] [[-ResultPageSize] Int32] [[-ServerTimeLimit] Int32] [-Tombstone] [[-Credential] PSCredential] [[-Version] String]参数类型位置默认值别名说明-DomainString[]1NoneDomainName、Name要查询的域默认当前域支持管道按属性名/按值传入可一次指定多个域-SearchBaseString2NoneADSPathLDAP 搜索起点如LDAP://OUsecret,DCtestlab,DClocal适合限定 OU 范围查询-ServerString3NoneDomainController指定要绑定的域控制器-SearchScopeString4Subtree—搜索范围合法值为Base/OneLevel/Subtree由ValidateSet约束见 PowerView.ps1-ResultPageSizeInt325200—LDAP 搜索器对象的分页大小取值范围 1–10000ValidateRange约束-ServerTimeLimitInt3260未指定则不传—服务器端搜索耗时上限秒在 Get-DomainSearcher 中该值默认 120 秒取值范围 1–10000-TombstoneSwitchParameterNamedFalse—是否让搜索器同时返回已删除tombstoned对象-CredentialPSCredential7[Management.Automation.PSCredential]::Empty—连接目标域的备用凭据对象-VersionString8All—指定枚举的 DFS 版本All/V1/1/V2/2ValidateSet约束说明-Version与-SearchScope等参数在实现中均有[ValidateSet(...)]校验见 PowerView.ps1传入非法值会直接被 PowerShell 拒绝这是防御参数误用的一道内置防线。典型用法示例示例 1枚举当前域全部 DFS 共享Get-DomainDFSShare默认-Version All同时枚举版本 1 与版本 2 的 DFS 对象并去重合并返回当前域中所有分布式文件系统共享。示例 2枚举指定域Get-DomainDFSShare -Domain testlab.local将搜索范围锁定到testlab.local域。-Domain是String[]类型因此也可以一次传入多个域Get-DomainDFSShare -Domain testlab.local, corp.local示例 3使用备用凭据$SecPassword ConvertTo-SecureString Password123! -AsPlainText -Force $Cred New-Object System.Management.Automation.PSCredential(TESTLAB\dfm.a, $SecPassword) Get-DomainDFSShare -Credential $Cred当当前会话令牌权限不足或需要以域内其他账户身份侦察时可显式构造PSCredential传入。源码中备用凭据会沿Get-DomainSearcher向下传递最终以DirectoryEntry($SearchString, $Credential.UserName, $Credential.GetNetworkCredential().Password)的方式绑定 LDAP 目录入口见 PowerView.ps1。组合用法限定 OU 与绑定指定域控Get-DomainDFSShare -SearchBase LDAP://OUsecret,DCtestlab,DClocal -Server dc01.testlab.local -SearchScope Subtree-SearchBase将查询锚定到指定 OU-Server指定绑定目标域控-SearchScope决定递归深度。输出对象结构命令输出类型为System.Management.Automation.PSCustomObject每个对象描述一个 DFS 目标核心属性为NameDFS 命名空间/链接名称V1 取对象name属性V2 由$DFSroot $ShareName拼接RemoteServerName目标后端服务器名即\\server\share中的server段。V1 与 V2 各自内部先按RemoteServerName去重排序最终统一按(RemoteServerName,Name)排序并去重后输出见 PowerView.ps1。因此结果中同一服务器即使挂载了多个 DFS 链接也会被合并归纳适合直接导出为服务器清单。源码级原理V1 与 V2 的双轨实现版本分派逻辑PROCESS块负责按域与版本分派PowerView.ps1if ($Version -match all|1) { $DFSshares Get-DomainDFSShareV1 SearcherArguments } if ($Version -match all|2) { $DFSshares Get-DomainDFSShareV2 SearcherArguments }由于-Version允许All/V1/1/V2/2这里用正则-match all|1与all|2做宽松匹配指定-Domain时则逐个目标域循环调用否则对当前域执行一次。BEGIN块会按$PSBoundParameters动态组装搜索器参数哈希表PowerView.ps1未显式传入的参数不会透传给底层搜索器。V1 路径fTDfs 对象 remoteservername/pkt 属性Get-DomainDFSShareV1PowerView.ps1先通过Get-DomainSearcher获取搜索器然后将 LDAP 过滤器设为$DFSsearcher.filter ((objectClassfTDfs))fTDfs是 Active Directory 中表示 DFS 命名空间根对象的类对应经典 DFS v1。随后读取每个结果对象的remoteservername属性将形如\\server\share的值切分后提取服务器名读取二进制pkt属性交给内部辅助函数Parse-Pkt解析对解析出的目标进行null过滤——注释明确指出未配置重定向的文件夹会给出\\null\TestNameSpace\folder\.DFSFolderLink之类的目标需要精确匹配字符串null而非$Null才能正确剔除PowerView.ps1。Parse-Pkt手工解码 DFS 二进制 Blobpkt属性是 DFS 命名空间打包的二进制结构Parse-PktPowerView.ps1用[BitConverter]按小端序逐字段手工解码参照的协议文档是 MS-DFSNM注释中引用了 msdn 的 cc227147 与 cc230324 条目头部 8 字节blob_versionUInt32blob_element_countUInt32随后遍历每个元素名称长度UInt16 Unicode 名称 数据长度UInt32 数据仅处理名称匹配\domainroot*的DFSNamespaceRootOrLinkBlob依次读出根/链接 GUID16 字节、前缀长度与前缀、短前缀长度与短前缀、类型UInt32、状态UInt32、注释长度与注释以及三个 FILETIME 时间戳各 8 字节和版本号UInt32继续解析DFSTargetListBlob目标计数UInt32每个目标条目由条目大小、时间戳、状态、类型、服务器名长度/名称、共享名长度/名称组成最终拼装为\\$server_name\$share_name形式的完整 UNC 路径最后从所有目标路径中提取第 3 段split(\)[2]作为服务器名集合返回。这部分纯字节级的解析是 V1 路径中最容易出现兼容性问题的环节源码中为此包了多层try/catch出错时输出Write-Verbose/Write-Warning前缀为[Get-DomainDFSShare]的诊断信息。V2 路径msDFS-Linkv2 对象 XML TargetListGet-DomainDFSShareV2PowerView.ps1面向 Windows Server 2008 引入的 DFS Namespaces v2LDAP 过滤器为$DFSsearcher.filter ((objectClassmsDFS-Linkv2))并显式加载两个属性$Null $DFSSearcher.PropertiesToLoad.AddRange((msdfs-linkpathv2,msDFS-TargetListv2))与 V1 的二进制解析不同V2 的目标列表以 XML 形式存储。代码将msDFS-TargetListv2取为字节数组跳过前两个字节UTF-16 BOM后按 Unicode 解码为 XML再遍历xml.targets的子节点读取每个目标的InnerText$xml [xml][System.Text.Encoding]::Unicode.GetString($target_list[2..($target_list.Length-1)]) $Target $_.InnerText其中$Target.split(\)[3]取出 DFS 根名与msdfs-linkpathv2拼接为输出对象的Name$Target.split(\)[2]取出后端服务器名作为RemoteServerName。底层依赖 Get-DomainSearcher两条路径都依赖Get-DomainSearcher构建System.DirectoryServices.DirectorySearcher。该函数PowerView.ps1按以下优先级决定搜索目标显式传入-Domain优先从$ENV:USERDNSDOMAIN/$ENV:LOGONSERVER推导绑定服务器未传域但传了-Credential调用Get-Domain解析当前域及其 PDC 角色所有者否则从环境变量或Get-Domain兜底取当前域。它会把域名转换为DCxxx,DCyyy形式的 distinguishedNamePowerView.ps1并支持GC://全局编录前缀。理解这一链路有助于排查「为什么-Server没生效」「为什么-Credential没带域时会多一次Get-Domain查询」之类的行为。注意事项与限制LDAP 权限枚举依赖对目录的读取权限fTDfs与msDFS-Linkv2对象通常对域内普通认证用户可读但跨域查询需要相应的信任关系与权限V1 兼容性pkt二进制解析依赖特定协议版本面对非标准实现或数据损坏时会被try/catch吞掉并跳过属预期行为去重语义输出按服务器名去重若需还原「服务器 ↔ 具体 DFS 链接」的完整映射可配合-Verbose观察中间解析过程或直接阅读 PowerView.ps1 中的拼接逻辑运行环境函数基于 .NET 的System.DirectoryServices需在可访问目标域控的 Windows 主机上的 PowerShellWindows PowerShell 5.x 或 PowerShell 7 均可加载脚本运行中执行版本选择对较老域环境Windows 2000/2003 传统 DFS建议-Version V1对现代域优先-Version V2以减少二进制解析带来的不确定性。延伸阅读命令在 Recon 模块中的导出声明Recon/Recon.psd1Recon 模块 README 中的功能索引Recon/README.md完整实现与内部辅助函数PowerView.ps1依赖的搜索器构建函数PowerView.ps1官方文档索引docs/Recon/index.md使用-Version V1/V2时建议先以Get-DomainDFSShare -Version V1 -Verbose观察解析告警再决定是否切换版本枚举。【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表