news 2026/9/23 1:57:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PowerSploit Privesc 模块 Get-ApplicationHost:从 IIS applicationHost.config 解密恢复应用池与虚拟目录密码

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 Sutherland(2014,NetSPI)
版本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压制了PSShouldProcessPSAvoidUsingInvokeExpression两条 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.usernameuserName
pass明文密码processmodel.passwordpassword
type记录类型Application PoolVirtual Directory
vdir虚拟目录名NAvdir.name
apppool应用池名池名称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.DataTableSystem.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):

  1. list apppools /text:name拿到所有应用池名称;
  2. 对每个池执行list apppool "<name>" /text:processmodel.username/text:processmodel.password,读取进程模型(process model)中配置的身份账号与密码;
  3. 过滤条件:$PoolPassword -ne ""$PoolPassword -isnot [system.array]——后者用于排除"该属性配置了多条值"的异常情形,确保只把单值密码加入结果;
  4. 写入 DataTable:Rows.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):

  1. list vdir /text:vdir.name枚举全部虚拟目录;
  2. 对每个目录执行list vdir "<name>" /text:userName/text:password
  3. 同样的空值与数组过滤后,写入 DataTable:Rows.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),仅供参考

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

PowerBI与FineBI全面对比:从数据建模到性能优化选型指南

简介&#xff1a;PowerBI与FineBI作为主流商业智能平台&#xff0c;各有适用边界。这份对比分析文档面向数据工程师、BI分析师及企业选型决策者&#xff0c;围绕数据连接、引擎架构、数据处理、前端展现、多维分析和集成应用等核心维度&#xff0c;逐一拆解两者差异。文档点明F…

作者头像 李华
网站建设 2026/9/23 1:51:57

Python图书推荐系统:协同过滤与文本相似度融合实践

简介&#xff1a;推荐系统是缓解信息过载的核心技术&#xff0c;其价值在于从海量物品中精准匹配用户需求。协同过滤通过挖掘用户行为模式实现个性化推荐&#xff0c;但面临新物品无行为记录的冷启动问题&#xff1b;文本相似度则利用物品内容特征构建画像&#xff0c;能有效弥…

作者头像 李华
网站建设 2026/9/23 1:51:52

本地部署DeepSeek全攻略:Ollama安装、Open WebUI集成与性能调优

简介&#xff1a;这份资源面向具备基础命令行与容器化概念、希望将预训练语言模型落地到本地环境的开发者与研究人员&#xff0c;提供DeepSeek-R1从零部署的完整技术流程。内容围绕Ollama安装、按显存容量适配1.5B至70B不同模型尺寸、Docker与Open WebUI扩展配置&#xff0c;以…

作者头像 李华
网站建设 2026/9/23 1:47:57

基于CLIP与向量检索实现跨模态图文搜索

简介&#xff1a;面向计算机相关专业学生的跨模态检索课程设计资源&#xff0c;基于Flickr30k数据集实现图像与文本的双向搜索。项目提供完整Python源码&#xff0c;覆盖数据预处理、模型训练、评估与可视化测试界面等核心环节&#xff0c;适合作为课设、毕设或入门进阶的参考项…

作者头像 李华
网站建设 2026/9/23 1:47:00

医学影像超分辨率重建:物理约束驱动的临床落地实践

简介&#xff1a;本资源是一份面向人工智能方向高校学生、医学影像研究者及深度学习实践者的完整项目实践包&#xff0c;聚焦图像超分辨率重建技术在医学CT影像中的落地应用。内容涵盖自然图像&#xff08;DIV2K&#xff09;与医学图像&#xff08;DeepLesion CT切片&#xff0…

作者头像 李华
网站建设 2026/9/23 1:46:43

ISO 18413-2015液压元件清洁度检测:从取样到报告全流程解析

简介&#xff1a;ISO 18413:2015《液压流体动力—组件的清洁度—检验文件及与污染物提取、分析和数据报告相关的原理》标准原文&#xff08;PDF版&#xff09;&#xff0c;面向液压系统设计、制造、质量检验及维护人员&#xff0c;用于统一组件清洁度的评估、检测与报告流程。资…

作者头像 李华