资讯动态

PowerSploit Privesc 模块 Get-ApplicationHost:从 IIS applicationHost.config 解密恢复应用池与虚拟目录密码

发布时间:2026/9/23 1:57:45 来源:尧图企业网站定制
PowerSploit Privesc 模块 Get-ApplicationHost从 IIS applicationHost.config 解密恢复应用池与虚拟目录密码【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit导读Get-ApplicationHost是 PowerSploit 项目 Privesc 模块 中提供的一个无参数 PowerShell 函数用于从目标系统的 IISapplicationHost.config配置文件中恢复解密应用程序池Application Pool与虚拟目录Virtual Directory中存储的加密凭据。它面向 Windows 上 IIS 6 及以上版本利用 IIS 自带的appcmd.exe命令行工具读取并解密配置项并把结果输出为可直接流入管道的结构化数据便于后续格式化与审计。读完本文你将掌握该函数的调用方式、输出结构、底层实现原理包括 DataTable 构建与 appcmd.exe 调用链以及它在提权/凭据收集场景中的定位与适用边界。函数概览Get-ApplicationHost的完整实现位于 Privesc/PowerUp.ps1其注释文档comment-based help与独立文档 docs/Privesc/Get-ApplicationHost.md 完全对应是 PowerUp 中杂项检查Miscellaneous Checks的一员。核心元信息如下项目内容功能从系统上的applicationHost.config恢复加密的应用池与虚拟目录密码作者Scott Sutherland2014NetSPI版本Get-ApplicationHost v1.0许可证BSD 3-Clause依赖无Required Dependencies: None兼容性IIS 6 及以上Should work on IIS 6 and Above输出类型System.Data.DataTable/System.Boolean参数无Param()为空[CmdletBinding()]函数通过 Privesc/Privesc.psd1 的FunctionsToExport导出同时也在顶层 PowerSploit.psd1 的导出清单中模块加载时由 Privesc/Privesc.psm1 以点源dot-source方式引入PowerUp.ps1等脚本文件。使用场景与威胁模型在 Windows 服务器提权与横向移动评估中IIS 站点管理员常常在applicationHost.config中为应用池进程身份process model identity和虚拟目录访问配置独立的域账号/本地账号。这些凭据会被 IIS 以机器级密钥加密保存普通文本查看applicationHost.config只能看到密文。Get-ApplicationHost的价值在于它借用 IIS 官方工具appcmd.exe的解密后输出能力把密文还原为明文从而让审计人员发现隐藏的高权限账号。该函数与 PowerUp 中的姊妹函数Get-WebConfig检查web.config中的加密连接字符串互补两者常配合用于完整收集 IIS 凭据面。语法与参数函数无参数语法极简Get-ApplicationHost从源码看Param()为空块仅声明了[CmdletBinding()]见 Privesc/PowerUp.ps1因此函数本身不接受位置参数或命名参数同时通过SuppressMessageAttribute压制了PSShouldProcess与PSAvoidUsingInvokeExpression两条 PSScriptAnalyzer 规则警告因为实现中使用了Invoke-Expression来构造 appcmd 命令见 Privesc/PowerUp.ps1。环境前提目标系统必须存在%SystemRoot%\System32\inetsrv\appcmd.exe即安装了 IIS 管理工具。源码在函数入口处用Test-Path检查该文件是否存在见 Privesc/PowerUp.ps1不存在时输出Write-Verbose Appcmd.exe does not exist in the default location.并返回$False。函数内部将$ErrorActionPreference临时设为SilentlyContinue并在结尾恢复见 Privesc/PowerUp.ps1因此即使某个池/目录读取失败也不会中断整体执行。输出结构详解函数将所有结果汇总到一张System.Data.DataTable中表结构在源码中通过$DataTable.Columns.Add(...)显式创建见 Privesc/PowerUp.ps1共 5 列列名含义应用池记录取值虚拟目录记录取值user凭据用户名processmodel.usernameuserNamepass明文密码processmodel.passwordpasswordtype记录类型Application PoolVirtual Directoryvdir虚拟目录名NAvdir.nameapppool应用池名池名称NA结果在返回前会经过Sort-Object type,user,pass,vdir,apppool排序并用Select-Object ... -Unique去重见 Privesc/PowerUp.ps1。若解析到至少一条凭据输出 DataTable 记录管道友好若未发现任何密码输出Write-Verbose No application pool or virtual directory passwords were found.并返回布尔值$False见 Privesc/PowerUp.ps1若appcmd.exe不存在返回$False。这也是文档中OUTPUTS同时列出System.Data.DataTable与System.Boolean两种类型的原因。使用示例示例 1默认列表视图输出直接运行即可返回所有应用池与虚拟目录凭据Get-ApplicationHost文档给出的典型输出如下字段以冒号分隔的列表形式呈现user : PoolUser1 pass : PoolParty1! type : Application Pool vdir : NA apppool : ApplicationPool1 user : PoolUser2 pass : PoolParty2! type : Application Pool vdir : NA apppool : ApplicationPool2 user : VdirUser1 pass : VdirPassword1! type : Virtual Directory vdir : site1/vdir1/ apppool : NA user : VdirUser2 pass : VdirPassword2! type : Virtual Directory vdir : site2/ apppool : NA示例 2管道 Format-Table 美化由于输出支持管道可将其导入Format-Table生成对齐表格Get-ApplicationHost | Format-Table -Autosize输出形如user pass type vdir apppool ---- ---- ---- ---- ------- PoolUser1 PoolParty1! Application Pool NA ApplicationPool1 PoolUser2 PoolParty2! Application Pool NA ApplicationPool2 VdirUser1 VdirPassword1! Virtual Directory site1/vdir1/ NA VdirUser2 VdirPassword2! Virtual Directory site2/ NA示例 3与 Web 配置检查组合使用Get-ApplicationHost专注于applicationHost.config中的应用池/虚拟目录凭据而Get-WebConfig负责扫描各站点的web.config连接字符串两者结果均为表格型数据可一并导出用于审计报告$AppHost Get-ApplicationHost $WebConfigs Get-WebConfig $AppHost $WebConfigs | Format-Table -Autosize底层实现原理第一步定位并调用 appcmd.exe函数首先检查%SystemRoot%\System32\inetsrv\appcmd.exe是否存在。appcmd.exe是 IIS 7 自带的命令行管理工具支持以/text:参数直接输出指定配置项的解密后值——这正是本函数能够恢复明文密码的关键能力来源。第二步枚举应用池并提取凭据Invoke-Expression $Env:SystemRoot\System32\inetsrv\appcmd.exe list apppools /text:name | ForEach-Object { $PoolName $_ $PoolUserCmd $Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool $PoolName /text:processmodel.username $PoolUser Invoke-Expression $PoolUserCmd $PoolPasswordCmd $Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool $PoolName /text:processmodel.password $PoolPassword Invoke-Expression $PoolPasswordCmd ... }实现细节见 Privesc/PowerUp.ps1用list apppools /text:name拿到所有应用池名称对每个池执行list apppool name /text:processmodel.username与/text:processmodel.password读取进程模型process model中配置的身份账号与密码过滤条件$PoolPassword -ne 且$PoolPassword -isnot [system.array]——后者用于排除该属性配置了多条值的异常情形确保只把单值密码加入结果写入 DataTableRows.Add($PoolUser, $PoolPassword, Application Pool, NA, $PoolName)。第三步枚举虚拟目录并提取凭据Invoke-Expression $Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir /text:vdir.name | ForEach-Object { $VdirName $_ $VdirUserCmd $Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir $VdirName /text:userName $VdirUser Invoke-Expression $VdirUserCmd $VdirPasswordCmd $Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir $VdirName /text:password $VdirPassword Invoke-Expression $VdirPasswordCmd ... }实现细节见 Privesc/PowerUp.ps1用list vdir /text:vdir.name枚举全部虚拟目录对每个目录执行list vdir name /text:userName与/text:password同样的空值与数组过滤后写入 DataTableRows.Add($VdirUser, $VdirPassword, Virtual Directory, $VdirName, NA)。第四步结果汇总与返回DataTable 记录数大于 0 时先按type,user,pass,vdir,apppool排序再-Unique去重后输出否则返回$False。测试验证仓库在 Tests/Privesc.tests.ps1 中为该函数提供了 Pester 测试用例Describe Get-ApplicationHost { It Should not throw. { {Get-ApplicationHost} | Should Not Throw } }该用例验证函数在任意环境即使appcmd.exe不存在下调用都不会抛出异常——得益于$ErrorActionPreference SilentlyContinue与Test-Path前置检查函数总能以优雅方式返回有数据返回 DataTable无环境/无数据返回$False。注意事项与适用边界权限要求读取并解密applicationHost.config中的凭据需要相应权限通常需管理员/高权限上下文。函数本身不包含提权逻辑它属于凭据收集而非漏洞利用工具。适用版本文档注释明确说明 Should work on IIS 6 and Above但appcmd.exe自 IIS 7 起才成为标准组件因此在较老的 IIS 6 环境中可能因缺少该工具而返回$False可加-Verbose查看具体原因。依赖系统工具函数强依赖appcmd.exe的存在与行为若 IIS 未安装或工具被加固移除将无法工作。脚本加载方式在 PowerSploit 环境中可通过导入模块使用Import-Module .\Privesc\Privesc.psd1由 Privesc/Privesc.psm1 点源加载PowerUp.ps1或直接点源脚本文件. .\Privesc\PowerUp.ps1后调用。输出语义DataTable 的-Unique去重基于排序后的全部五列理论上会消除完全重复的记录如只需用户/密码对可自行Select-Object user,pass -Unique进一步收敛。【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价