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)的工作机制。
功能概述(SYNOPSIS)
Get-WebConfig的核心能力可以概括为两点:
- 全面收集:识别系统上所有
web.config文件,恢复其中用于支持后端数据库认证的连接字符串(connection strings); - 按需解密:如果连接字符串被 IIS 的配置保护机制加密(encrypted),脚本会在内存中调用
aspnet_regiis.exe实时解密,输出明文凭据。
该函数不依赖任何外部模块,内置实现,作者为 Scott Sutherland 与 Antti Rantasaari(NetSPI),采用 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 McAfee's 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.psd1) |
| IIS | 已安装且配置过站点/虚拟目录,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.DataTable(L3831-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 Security=True或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 ... -Unique,L3953),因此同一凭据不会重复出现。
示例 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 | 返回$False,Verbose:Appcmd.exe does not exist in the default location. |
| 无 aspnet_regiis.exe | 返回$False,Verbose:aspnet_regiis.exe does not exist in the default location. |
| 解密失败(密钥不可用等) | 返回$False,Verbose:Decryption of <path> failed. |
| 扫描完成但无连接字符串 | 返回$False,Verbose:No 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.ps1:PowerUp 系列函数的 Pester 测试(Privesc 测试套件),可了解模块的整体验证方式。
适用前提与注意事项
- 适用环境:本文描述的是 2014 年起由 NetSPI 作者提供的经典实现,其解析逻辑与 IIS 7+ / .NET Framework 环境(含
aspnet_regiis.exe -pdf机制)相匹配。在现代 Windows 中appcmd.exe依然随 IIS 安装,但不同版本 IIS 的配置结构细节可能略有差异; - 只读提取:脚本仅读取配置与在临时目录复制解密,不会修改原始
web.config; - 授权边界:该工具属于后渗透/提权检查范畴,请在获得明确授权的渗透测试或安全审计环境中使用;
- 解密能力:
aspnet_regiis.exe -pdf能否解密取决于运行上下文是否有权访问配置加密所用的 RSA 密钥容器,这一点决定了encr=Yes的记录能否成功转为明文。
【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考