news 2026/9/23 13:40:38

PowerSploit 特权提升实战:Get-WebConfig 从 web.config 恢复并解密数据库连接字符串

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PowerSploit 特权提升实战:Get-WebConfig 从 web.config 恢复并解密数据库连接字符串

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.BooleanSystem.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/pwdIntegrated Security=TrueInitial 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-CsvOut-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):

  1. %SystemRoot%\Microsoft.NET\Framework\下递归查找aspnet_regiis.exe,按版本降序排序取最新版(旧版工具同样能处理新版配置,故取最新);
  2. 将原始web.config复制到当前用户临时目录$Env:temp\web.config),避免直接修改生产配置;
  3. 执行解密命令:
    aspnet_regiis.exe -pdf "connectionStrings" (get-item $Env:temp).FullName

    其中-pdf表示"providers/decrypt/feature"——对指定配置节(此处为connectionStrings)执行解密;

  4. 重新读取临时文件中的connectionStrings,按同一解析逻辑提取凭据,标记encr = 'Yes'
  5. 若解密后仍未出现可解析的连接字符串,输出 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 13:40:25

3个坑让你学会开源客服系统源码,保姆级教程实战

3个坑让你学会开源客服系统源码,保姆级教程实战 看了一堆视频,对着文档敲代码,结果一上手写业务就懵?别慌,这是90%开发者的通病。你缺的不是语法知识,而是把散乱知识点串成完整项目的逻辑。今天这篇 保姆级教程 ,不玩虚的,直接拆 开源客服系统…

作者头像 李华
网站建设 2026/9/23 13:40:14

慧耕思的博客源码解析:3个实战技巧解决环境配置卡顿

慧耕思的博客源码解析:3个实战技巧解决环境配置卡顿 刚接手新项目,或者从别的岗位转过来,最怕什么?不是写不出逻辑,而是 配置环境就卡半天 。 明明照着教程敲了半小时,报错信息像天书一样滚过屏幕。你盯着那个红色的 ModuleNotFoundError 或者 Version Conflict…

作者头像 李华
网站建设 2026/9/23 13:40:01

3个真实案例讲透nssd:从入门到实战的完整示例

3个真实案例讲透nssd:从入门到实战的完整示例 官方文档翻了三遍还是云里雾里?别急,这种时候直接看 完整示例 才是正道。 我带过不少新入职的开发,很多人卡在nssd配置上,不是代码写不对,是根本不知道哪个字段对应什么业务场景。CSDN上那些零散的笔记,东拼西凑反而更乱。今天这篇,把nssd的核心用…

作者头像 李华
网站建设 2026/9/23 13:39:53

手机电源键坏了咋开机?3招最佳实践救急指南

手机电源键坏了咋开机?3招最佳实践救急指南 面试被问原理答不上来,是不是当场就慌了?别急,今天咱们不聊虚的,直接上手。手机电源键坏了咋开机这个场景,看似简单,实则涉及硬件逻辑、系统机制甚至底层驱动。很多应届生觉得这是常识,真到实操或者技术面试深挖时,往往卡在“为什么能开”和“怎么安全地开”这两个点上…

作者头像 李华
网站建设 2026/9/23 13:39:44

3个致命坑搞垮设备巡更巡检系统,这份完整示例救了你

3个致命坑搞垮设备巡更巡检系统,这份完整示例救了你 学会 Python 或 Java 语法,却卡在“怎么把巡更点、设备状态、人员定位串起来”? 别急,大多数中小施工企业负责人都踩过这个坑:买了硬件,写了代码,结果系统上线三天就崩。 今天直接上 完整示例…

作者头像 李华
网站建设 2026/9/23 13:39:41

3步搞定手机不见了怎么办:从入门到精通的排查实录

3步搞定手机不见了怎么办:从入门到精通的排查实录 刚下班,掏出兜里的手机,空的。心跳瞬间漏了一拍。这种恐慌感,比面试时盯着屏幕上那一串红色的 StackTrace 报错还要让人窒息。很多人遇到这种情况,第一反应是疯狂拨打自己的号码,直到停机或者被标记为骚扰电话,反而加速了被重置的风险。…

作者头像 李华