记一次启明星辰 PowerSDP(eTrust)密码找回案例
背景:公司使用启明星辰 PowerSDP(eTrust)作为远程办公 VPN 接入工具。某天同事忘记登录口令,管理员重置流程较长,于是尝试从本地数据入手恢复凭据。本文记录了完整的安全审计过程以及最终的工具化方案。
一、问题起源
同事忘记了自己的 eTrust VPN 登录密码,正常流程需要提交工单找 IT 管理员重置,周期较长。但该同事之前在客户端勾选了「记住密码」,说明凭据是保存在本地的。
于是我们思考:既然本地保存了密码,能否安全地恢复出来?
这本质上是一个本地凭据存储安全审计的问题。
二、审计过程 --- 密码存在哪?
2.1 系统钥匙串
首先检查 macOS 钥匙串(Keychain),这是系统级的凭据管理器:
bash
security find-generic-password -s "etrust" ~/Library/Keychains/login.keychain-db
# 结果:未找到相关条目
钥匙串中只存了设备 Token(fc_uuidForDevice),没有用户登录密码。
2.2 应用配置文件
接着查看应用 plist 配置,发现了一些元信息:
bash
defaults read ~/Library/Containers/E37A953A-.../Data/Library/Preferences/com.sdp.etrust.plist
输出中包含:
- 应用信息:启明星辰 ©2000-2023
- 密码策略:8位以上,需含大小写+数字+特殊字符
- 一个可疑字段:
simkey.default = "kema49cf6mEqprc76FYIOw=="(SIM 认证密钥,非登录密码)
配置里有密码策略,但没有密码本身。
2.3 应用数据目录 --- SQLite 数据库
在沙盒容器中发现了一个 SQLite 数据库:
~/Library/Containers/<UUID>/Data/Library/Application Support/SIMguard/Model.sqlite
打开看看:
bash
sqlite3 Model.sqlite ".tables"
# ZVSGADDRESSENTITY ZVSGUSERENTITY ...
sqlite3 Model.sqlite "SELECT ZUSERNAME, ZPASSWORD FROM ZVSGUSERENTITY;"
# chenzeyao|7s7JmSsc4xM9vcB+vIFHWQ==
找到了凭据存储位置! 用户名是明文,密码是一段编码后的数据。
2.4 数据库结构
sql
-- 用户凭据表
CREATE TABLE ZVSGUSERENTITY (
ZUSERNAME TEXT, -- 用户名
ZPASSWORD TEXT, -- 密码(编码存储)
ZRECORD INTEGER,
ZAUTOLOGIN INTEGER
);
-- 服务器地址表
CREATE TABLE ZVSGADDRESSENTITY (
ZADDRESS TEXT, -- VPN 服务器地址
ZPORT INTEGER -- 端口号
);
2.5 存储路径汇总
| 平台 | 可能的路径 |
|---|---|
| macOS(沙盒) | ~/Library/Containers/<UUID>/Data/Library/Application Support/SIMguard/Model.sqlite |
| macOS(非沙盒) | ~/Library/Application Support/eTrust/Model.sqlite |
| Windows | %APPDATA%\Venusense\Model.sqlite 或 %LOCALAPPDATA%\eTrust\Model.sqlite |
三、安全审计发现
通过对存储方式的分析,我们发现了几个值得关注的安全隐患:
| # | 问题 | 风险等级 | 说明 |
|---|---|---|---|
| 1 | 固定密钥硬编码 | 🔴 高 | 加密密钥写死在二进制中,可被提取 |
| 2 | 固定初始向量 | 🔴 高 | IV 固定,相同密码总产生相同密文 |
| 3 | 可逆加密存储 | 🟡 中 | 凭据以可逆方式保存,提取到密钥即可还原 |
| 4 | 无密钥派生 | 🟡 中 | 未使用 KDF,无法防御暴力枚举 |
如果您是企业安全工程师,建议对内部使用的 VPN 客户端进行类似的安全评估。
四、凭据恢复工具
基于审计结论,我开发了一个跨平台的凭据恢复工具,支持 macOS 和 Windows。
4.1 工具特性
| 特性 | 说明 |
|---|---|
| 🔍 自动搜索数据库 | 支持多种安装路径,无需手动指定 |
| 🔑 自动扫描密钥 | 从应用二进制中提取候选密钥并自动验证 |
| 🖥️ GUI + CLI 双模式 | 双击即用 GUI,也支持命令行 |
| 📦 零外部依赖 | 内嵌纯 Python AES 实现 |
| 📋 一键复制 | 恢复结果直接复制到剪贴板 |
| 💻 跨平台 | macOS / Windows / Linux |
4.2 macOS / Linux 使用方法
方式一:GUI 图形界面(推荐)
bash
python3 etrust_password_decryptor.py --gui
双击 .app 包也可以直接启动。
方式二:命令行模式
bash
# 自动搜索数据库并恢复
python3 etrust_password_decryptor.py
# 手动指定数据库路径
python3 etrust_password_decryptor.py -p /path/to/Model.sqlite
# 恢复单条密文
python3 etrust_password_decryptor.py -d "7s7JmSsc4xM9vcB+vIFHWQ=="
# 安静模式(只输出密码,适合脚本调用)
python3 etrust_password_decryptor.py -q
# 显示详细信息(含服务器地址)
python3 etrust_password_decryptor.py --all
命令行输出示例:
eTrust Password Decryptor v2.0
======================================
正在搜索 eTrust 数据库...
[√] /Users/xxx/Library/Containers/.../SIMguard/Model.sqlite
正在扫描密钥并解密...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
服务器: xxxxxxxx
用户名: xxxxxx
密 码: xxxxx
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
4.3 Windows 使用方法
方式一:双击 BAT 文件(零配置)
解压 eTrust密码解密-Windows版.zip,双击 eTrust密码解密.bat。
脚本会自动处理 Python 环境:
- 检测系统 Python --- PATH、py launcher、常见安装路径
- 未安装则自动下载 --- 下载 Python 便携版(约 8MB,仅首次)
- 启动 GUI 界面 --- 自动搜索并恢复凭据
整个过程无需任何手动配置。
方式二:命令行
cmd
REM 自动搜索
python etrust_password_decryptor.py
REM 指定路径
python etrust_password_decryptor.py -p C:\Users\xxx\AppData\Roaming\Venusense\Model.sqlite
4.4 自动密钥扫描
工具会从应用二进制中自动提取并验证加密密钥:
Step 1: 自动查找应用安装路径
Step 2: 提取候选密钥字符串
Step 3: 过滤干扰项(类名、函数名等)
Step 4: 逐个验证,找到有效密钥
Step 5: 缓存结果,后续直接使用
这意味着工具可以适配不同版本的应用,无需手动更新密钥。
4.5 GUI 界面说明
工具使用 tkinter 构建,界面简洁直观:
- 蓝色标题栏
- 可选的数据库路径输入框(留空则自动搜索)
- 「解密」按钮(或启动时自动执行)
- 结果以卡片形式展示:用户名 + 大号密码显示 + 复制按钮
- 解密操作在后台线程执行,不会卡住界面
五、改进建议
对厂商和开发者的安全建议:
- 使用系统密钥存储 --- 利用 Keychain(macOS)/ Keystore(Windows)管理加密密钥,绑定设备硬件
- 采用不可逆存储 --- 如果只做认证,应存储加盐哈希(bcrypt / Argon2),而非可逆加密
- 密钥派生函数 --- 使用 HKDF / PBKDF2 从用户输入派生密钥
- 随机初始向量 --- 每次加密使用随机 IV,防止密文模式分析
- 增加防护措施 --- 代码混淆、反调试等技术增加分析难度
对用户的建议:
- 不要过度依赖客户端的「记住密码」功能
- 重要密码应使用专业密码管理器(1Password、Bitwarden 等)
- 定期更换 VPN 密码
六、总结
通过对 eTrust(启明星辰 PowerSDP)VPN 客户端的本地凭据存储进行安全审计,我们发现了固定密钥硬编码、固定 IV 等安全隐患,并基于审计结论开发了一个跨平台的凭据恢复工具。
工具已成功帮助多位同事恢复了遗忘的 VPN 密码,避免了漫长的管理员重置流程。
核心文件
| 文件 | 说明 |
|---|---|
etrust_password_decryptor.py |
核心脚本(跨平台,零依赖) |
eTrust密码解密.bat |
Windows 启动器(自动下载 Python) |
eTrust密码解密-Windows版.zip |
Windows 打包版 |
相关工具可以在www.zaodao.tech工具箱中找到;gui虽然简陋,但是能解决问题就行
本文仅供网络安全研究与学习交流,请遵守相关法律法规。所有操作均在自有设备的本地环境中完成。