
PowerSploit 特权提升实战Get-WebConfig 从 web.config 恢复并解密数据库连接字符串【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit导读Get-WebConfig是 PowerSploit 框架 Privesc特权提升模块中的一员用于遍历系统中所有 IIS 虚拟目录下的web.config文件批量恢复其中用于后端数据库认证的明文或加密连接字符串并在需要时自动完成解密。本文以 Get-WebConfig 官方文档 为主线结合其源码实现 Privesc/PowerUp.ps1完整讲解该命令的用途、输出格式、实现原理与实战用法。读完本文你将掌握在 Windows 内网环境中快速定位并提取web.config数据库凭据的完整流程也能理解其底层依赖appcmd.exe 与 aspnet_regiis.exe的工作机制。功能概述SYNOPSISGet-WebConfig的核心能力可以概括为两点全面收集识别系统上所有web.config文件恢复其中用于支持后端数据库认证的连接字符串connection strings按需解密如果连接字符串被 IIS 的配置保护机制加密encrypted脚本会在内存中调用aspnet_regiis.exe实时解密输出明文凭据。该函数不依赖任何外部模块内置实现作者为 Scott Sutherland 与 Antti RantasaariNetSPI采用 BSD 3-Clause 许可证。它被列入 Privesc 模块的导出函数清单见 Privesc/Privesc.psd1同时作为独立脚本存在于 Privesc/PowerUp.ps1 中可单独运行。在 Privesc 模块中的定位PowerSploit 的 Privesc 模块Privesc/README.md是一个 Windows 常见提权向量misconfiguration的检查集散地。Get-WebConfig属于其中的杂项检查Miscellaneous Checks类别Get-Webconfig - checks for any encrypted web.config strings Get-ApplicationHost - checks for encrypted application pool and virtual directory passwords Get-SiteListPassword - retrieves the plaintext passwords for any found McAfees SiteList.xml files Get-CachedGPPPassword - checks for passwords in cached Group Policy Preferences files与其同类的还有Get-ApplicationHost恢复 applicationHost.config 中的应用程序池/虚拟目录密码二者常被一起用于 IIS 凭据枚举。语法与使用前提Get-WebConfig的语法极其简单——它不接受任何参数Get-WebConfig从源码看函数声明为[CmdletBinding()] Param()即无参数 cmdlet。这意味着不需要指定目标路径、用户名或过滤条件运行时自动枚举整个系统中的相关位置唯一的硬性前提是目标机器安装了 IIS 且存在appcmd.exe默认位于C:\Windows\System32\InetSRV\appcmd.exe。函数开头会将$ErrorActionPreference临时切换为SilentlyContinue并在结束时恢复源码 L3836-L3837因此遇到无权限访问的目录、损坏的 XML 或缺失组件时不会中断整个扫描而是静默跳过。实际运行环境要求条件说明操作系统Windows需具备 PowerShell 环境模块最低要求 PowerShell 2.0见 Privesc.psd1IIS已安装且配置过站点/虚拟目录appcmd.exe存在解密能力需要aspnet_regiis.exe随 .NET Framework 安装位于%SystemRoot%\Microsoft.NET\Framework\下权限对目标目录及 web.config 具有读取权限解密通常需要能访问机器级 RSA 密钥容器的上下文输出字段说明每次命中一个包含密码的连接字符串Get-WebConfig就会产出一条记录包含 6 个字段由源码中 DataTable 的列定义 L3846-L3851 确定字段含义user连接字符串中的数据库用户名pass连接字符串中的数据库密码解密后为明文dbserv数据库服务器实例vdir对应的 IIS 虚拟目录物理路径path实际找到的web.config完整路径encr该连接字符串是否为加密存储No/Yes函数的声明输出类型为System.Boolean与System.Data.DataTableL3831-L3832成功时输出DataTable行对象失败/无结果时输出$False并以Write-Verbose说明原因。解析逻辑的边界需要特别说明的是源码中的解析方式对每条连接字符串脚本用Split()按位置拆分字段取第 2 个等号后的值为服务器Split()[1]、第 4 个为用户名Split()[3]、第 5 个为密码Split()[4]并以分号截断L3884-L3887。这意味着它专门针对形如Server...;User ID...;Password...的标准 ADO.NET 连接字符串并且只有在字符串包含password关键字时才提取-like *password*匹配不区分键位置大小写敏感性在此处取决于字符串实际内容。因此使用uid/pwd、Integrated SecurityTrue或Initial Catalog等其他键名组合的连接字符串可能无法被完整拆分该脚本刻意只关注带密码的连接字符串这是后渗透场景下最有价值的凭据类型。实战示例示例 1直接列出明文与解密后的连接字符串Get-WebConfig输出列表视图user : s1admin pass : s1password dbserv : 192.168.1.103\server1 vdir : C:\test2 path : C:\test2\web.config encr : No user : s1user pass : s1password dbserv : 192.168.1.103\server1 vdir : C:\inetpub\wwwroot path : C:\inetpub\wwwroot\web.config encr : Yes注意encr字段的语义第一个配置是明文存储No第二个配置原本是加密存储脚本在输出前已完成解密因此pass显示为明文密码。示例 2管道输出格式化表格Get-WebConfig | Format-Table -Autosize输出user pass dbserv vdir path encr ---- ---- ------ ---- ---- ---- s1admin s1password 192.168.1.101\server1 C:\App1 C:\App1\web.config No s1user s1password 192.168.1.101\server1 C:\inetpub\wwwroot C:\inetpub\wwwroot\web.config No s2user s2password 192.168.1.102\server2 C:\App2 C:\App2\test\web.config No s2user s2password 192.168.1.102\server2 C:\App2 C:\App2\web.config Yes s3user s3password 192.168.1.103\server3 D:\App3 D:\App3\web.config No结果支持 PowerShell 管道可继续传给Export-Csv、Out-GridView等做后续处理。最终输出前源码还会执行一次排序与去重Sort-Object user,pass,dbserv,vdir,path,encr | Select-Object ... -UniqueL3953因此同一凭据不会重复出现。示例 3结合 Invoke-PrivescAudit 批量审计Get-WebConfig也被 PowerUp 的聚合审计函数Invoke-PrivescAudit纳入检查范围可在一次审计中与其他提权检查一并执行。由于该函数内部通过Get-Command Get-WebConfig等方式动态调用详见 Privesc/PowerUp.ps1 中Invoke-PrivescAudit的实现单独运行本命令即可对 IIS 凭据进行聚焦排查。工作原理两条并行的提取路径Get-WebConfig的实现Privesc/PowerUp.ps1#L3753-L3965可以分解为以下关键步骤理解这些步骤有助于判断它在真实环境中的行为与限制。1. 通过 appcmd.exe 枚举虚拟目录函数首先检查appcmd.exe是否存在L3840若不存在则输出$False并给出 Verbose 提示Appcmd.exe does not exist in the default location.。随后执行appcmd.exe list vdir /text:physicalpath该命令返回 IIS 中所有虚拟目录的物理路径作为扫描起点。2. 处理 CMD 风格环境变量路径虚拟目录的物理路径可能包含%SystemDrive%之类的 CMD 环境变量写法。脚本检测路径中是否含%若是则解析出变量名并转换为 PowerShell 的$Env:形式求值L3859-L3865再拼回剩余路径确保后续文件枚举使用可解析的绝对路径。3. 递归查找 web.config 并解析明文对每个虚拟目录执行$CurrentVdir | Get-ChildItem -Recurse -Filter web.config找到的每个web.config都会被读取为 XML[xml]$ConfigFile Get-Content ...L3874检查configuration/connectionStrings/add节点。若存在则按上文所述的位置拆分法提取 user/pass/server 并标记encr No。4. 解密加密连接字符串若connectionStrings节点被加密则走解密分支L3894-L3946在%SystemRoot%\Microsoft.NET\Framework\下递归查找aspnet_regiis.exe按版本降序排序取最新版旧版工具同样能处理新版配置故取最新将原始web.config复制到当前用户临时目录$Env:temp\web.config避免直接修改生产配置执行解密命令aspnet_regiis.exe -pdf connectionStrings (get-item $Env:temp).FullName其中-pdf表示providers/decrypt/feature——对指定配置节此处为connectionStrings执行解密重新读取临时文件中的connectionStrings按同一解析逻辑提取凭据标记encr Yes若解密后仍未出现可解析的连接字符串输出 Verbose 提示Decryption of path failed.并返回$False。5. 汇总输出所有结果汇总到System.Data.DataTable排序去重后输出若完全没有命中则输出 VerboseNo connection strings found.并返回$False。失败与降级场景汇总场景行为未安装 IIS / 无 appcmd.exe返回$FalseVerboseAppcmd.exe does not exist in the default location.无 aspnet_regiis.exe返回$FalseVerboseaspnet_regiis.exe does not exist in the default location.解密失败密钥不可用等返回$FalseVerboseDecryption of path failed.扫描完成但无连接字符串返回$FalseVerboseNo connection strings found.未使用-Verbose上述失败信息默认不可见仅返回$False官方备注的替代方法不支持解密文档 NOTES 部分提供了一个不依赖脚本、但不支持解密的替代方法可直接在 CMD 中运行for /f tokens* %i in (%systemroot%\system32\inetsrv\appcmd.exe list sites /text:name) do %systemroot%\system32\inetsrv\appcmd.exe list config %i -section:connectionstrings该命令遍历所有 IIS 站点并列出每个站点的connectionStrings配置节。它只适合快速浏览明文配置遇到加密连接字符串时无法解密——这正是Get-WebConfig的核心价值所在。关联工具与进一步阅读Get-ApplicationHost 文档恢复 applicationHost.config 中加密的应用程序池与虚拟目录密码与本文命令互补Invoke-PrivescAudit 文档PowerUp 的聚合审计入口可一次性执行包含本命令在内的全部提权检查Privesc 模块说明模块安装方式与全部函数清单模块清单 Privesc/Privesc.psd1确认Get-WebConfig为模块导出函数测试用例 Tests/Privesc.tests.ps1PowerUp 系列函数的 Pester 测试Privesc 测试套件可了解模块的整体验证方式。适用前提与注意事项适用环境本文描述的是 2014 年起由 NetSPI 作者提供的经典实现其解析逻辑与 IIS 7 / .NET Framework 环境含aspnet_regiis.exe -pdf机制相匹配。在现代 Windows 中appcmd.exe依然随 IIS 安装但不同版本 IIS 的配置结构细节可能略有差异只读提取脚本仅读取配置与在临时目录复制解密不会修改原始web.config授权边界该工具属于后渗透/提权检查范畴请在获得明确授权的渗透测试或安全审计环境中使用解密能力aspnet_regiis.exe -pdf能否解密取决于运行上下文是否有权访问配置加密所用的 RSA 密钥容器这一点决定了encrYes的记录能否成功转为明文。【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考