Hassan-Pouladi/Cisco-FMC-honeypot
GitHub: Hassan-Pouladi/Cisco-FMC-honeypot
一个模拟 Cisco FMC Web 界面的低交互蜜罐,用于安全捕获和分析未经身份验证的 Java 反序列化攻击流量。
Stars: 0 | Forks: 1
# FMC-Trap
一个**低交互蜜罐**,模拟 Cisco Secure Firewall Management Center (FMC) Web 表面并捕获**未经身份验证的 Java 序列化风格**攻击流量(CVE 风格的**不安全反序列化**探测)。
- **设计安全:** 该应用程序**不**反序列化 Java 对象;它检测 `\xac\xed\x00\x05`(和 Base64 `rO0AB…`)并使用正则表达式和启发式方法提取 shell 或 URL 字符串。
- **无命令执行:** 第二阶段 URL 仅通过 **Python `requests`** 检索到不可执行的下载卷中。
- **面向生产的堆栈:** **Docker Compose** 配合 **Gunicorn** 和可选的 **Caddy**(HTTPS、Let’s Encrypt)。
## 为什么要运行它?
单行 **JSON** 日志(兼容 Splunk 和 ELK),可选的 **Telegram** 告警,**哈希**处理后的第二阶段产物,以及**非 root** 容器用户。该项目旨在为需要专注于 FMC 风格陷阱且无需额外集成代码的**研究人员**提供服务。
## 要求
| 项目 | 备注 |
|------|--------|
| **Docker** 和 **Docker Compose** v2 | [安装 Docker](https://docs.docker.com/get-docker/) |
| **VPS 或主机** | 建议使用专用或隔离的网络段 |
| **域名(可选)** | 用于 HTTPS:配置 DNS 并允许入站 **TCP 80** 和 **TCP 443** 到主机 |
## 快速开始(大约五分钟)
### 1. 克隆
```
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
```
### 2. 配置环境
```
cp .env.example .env
```
根据需要编辑 `.env`(参见 [环境变量](#environment-variables))。对于部署在**捆绑的 Caddy 之后**的情况,请设置 **`TRUST_X_FORWARDED_FOR=1`**,以便日志中的客户端 IP 地址反映原始客户端。
### 3. 将 Caddy 指向您的域名
编辑 **`Caddyfile`**:将占位符主机名替换为**您的**域名(如果适用,还包括 `www`):
```
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
```
(可选)在 `Caddyfile` 中取消注释全局 `email you@example.com` 块,以接收 Let’s Encrypt 到期通知。
### 4. DNS 和防火墙(HTTPS)
- 创建 **A**(如果适用,还有 **AAAA**)记录:**`yourdomain.com`** 指向**您的服务器公网 IP**,如果使用,还包括 **`www`**。
- 在主机上允许入站 **TCP 80** 和 **TCP 443**(云安全组和主机防火墙,例如 `ufw allow 80,443/tcp`)。
### 5. 数据目录(必需)
应用程序在容器内以 UID **`10001`** 运行。bind 挂载的 `./data` 目录必须可写:
```
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
```
如果没有正确的所有权,利用 POST 请求可能会返回 **500**(写入日志或原始 blob 时出现 `Permission denied`)。
### 6. 启动
```
docker compose up -d --build
```
### 7. 验证
```
docker compose ps
curl -sI https://yourdomain.com/
```
预期返回 **`HTTP/2 200`**(或 **301** 或 **302**)以及 **`Via: Caddy`**。在浏览器中,**`https://yourdomain.com/`** 应显示模拟的 FMC 登录页面。
关于在哪里读取事件、payload 和 Docker 输出,请参阅 [查找日志、下载和服务输出](#finding-logs-downloads-and-service-output) 和 [常用操作](#common-operations)。
## 查找日志、下载和服务输出
以下所有内容均相对于您的项目目录(包含 `docker-compose.yml` 的文件夹,克隆后通常为 `FMC-Trap`)。路径位于**主机**上;Docker 将它们 bind 挂载到容器中。
| 内容 | 主机路径 | 如何打开或跟踪 |
|------|-----------|------------------------|
| **事件日志(JSON 行)** | `data/logs/fmc-trap.json` | `tail -f data/logs/fmc-trap.json`(实时流),或在编辑器中打开,或导入 Splunk 或 ELK |
| **下载的第二阶段 payload** | `data/downloads/` | 仅当收集器保存远程响应时才会出现文件;每个文件以其 **SHA256** 哈希(64 个十六进制字符)命名,**无扩展名**。使用 `ls -la data/downloads`(Linux 或 macOS)或 `Get-ChildItem data\downloads`(Windows PowerShell)列出 |
| **应用程序进程输出** | 不是文件;Docker | `docker compose logs -f fmc-trap` |
| **Caddy (TLS, 代理, ACME)** | 不是文件;Docker | `docker compose logs -f caddy` |
| **Telegram 告警(可选)** | 不存储在 `data/` 中 | 在 `.env` 中设置 `TELEGRAM_BOT_TOKEN` 和 `TELEGRAM_CHAT_ID`;记录事件时触发告警 |
**当日志文件中出现内容时:** 当请求匹配反序列化探测行为(POST 中的魔数字节)时,`fmc-trap.json` 每行接收**一个 JSON 对象**。默认情况下,对虚假登录页面的普通 **GET** 请求**不会**写入此文件。
**当下载文件夹中有文件时:** 仅当管道从探测中提取 URL 并且收集器在 `MAX_DOWNLOAD_MB` 内成功获取允许的远程内容时,才会出现条目。如果目录保持为空,可能还没有符合条件的 URL,或者获取可能被应用程序中的策略阻止。
**美化打印 JSON(可选):** 对于单行,通过管道传输给 `python -m json.tool` 或如果安装了 `jq` 则使用它。
## 常用操作
| 目标 | 命令或操作 |
|------|-------------------|
| 查看容器是否正在运行 | `docker compose ps` |
| 编辑 `.env` 或 `Caddyfile` 后重启 | `docker compose up -d --build`(如果仅更改了环境变量,则使用 `docker compose up -d --force-recreate`) |
| 停止堆栈 | `docker compose down` |
| 持续跟踪新的 JSON 事件 | `tail -f data/logs/fmc-trap.json` |
| 检查最后几个事件 | `tail -n 50 data/logs/fmc-trap.json` |
| 统计下载的产物 | 在文件管理器中打开 `data/downloads`,或在该目录上使用 shell 文件计数(文件以 SHA256 命名) |
| 确认蜜罐页面加载 | 在浏览器中打开 `https://yourdomain.com/` 或像验证步骤那样使用 `curl -sI` |
## 架构
```
Internet :443/:80 → Caddy (TLS, Let’s Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (bind mounts)
```
- **仅 Caddy** 将 **80** 和 **443** 发布到主机;应用程序容器**不**直接暴露(参见 Compose 中的 `expose: "5000"`)。
- **Caddy** 在容器内使用公共 DNS 解析器(**1.1.1.1**、**8.8.8.8**),以便在 VPS 解析器无法从 Docker 访问的主机上成功进行 Let’s Encrypt 操作(这是某些云提供商上的常见限制)。
## 环境变量
| 变量 | 用途 | 默认值 / 备注 |
|----------|---------|----------------|
| `TRUST_X_FORWARDED_FOR` | 使用第一个 `X-Forwarded-For` 跳跃作为 `src_ip` | 配合 Caddy 使用时建议设置为 **`1`** |
| `DECEPTION_STATUS` | `200` 返回 HTML 正文;`302` 返回重定向 | `200` |
| `DECEPTION_REDIRECT_URL` | 状态为 `302` 时的目标路径 | `/` |
| `MAX_DOWNLOAD_MB` | 每个 URL 的收集器限制 | `16` |
| `TELEGRAM_BOT_TOKEN` / `TELEGRAM_CHAT_ID` | 可选告警 | 留空则禁用告警 |
| `FMC_SERVER_HEADER` | `Server` 响应头 | `nginx` |
| `VT_API_KEY` | 保留 | 可选 |
Compose 将这些变量传递给 **`fmc-trap`** 服务;详情请参阅 `docker-compose.yml`。
## JSON 日志字段(参考)
`data/logs/fmc-trap.json` 中的每一行都是一个 JSON 对象。常见的键包括 `timestamp`、`event_type`、`src_ip`、`headers`、`raw_payload_hash`、`extracted_commands`,以及存储文件时的 `downloaded_file_hash`。保存在 `data/downloads/` 下的 blob 使用 **模式 0400**(所有者只读)。
## 故障排除
| 症状 | 解决方法 |
|--------|------------|
| 在 `data/` 下写入时出现 **`Permission denied`** | 运行 `sudo chown -R 10001:10001 data/logs data/downloads` |
| **`Bind for 0.0.0.0:80 failed: port is already allocated`** | 另一个服务或容器绑定到了 **80**。停止该服务或释放 **80**;每个主机上只能有一个进程监听 **80**。 |
| Caddy 日志中出现 **Let’s Encrypt 或 ACME 错误** | 确认 **DNS** 解析到此服务器,并且 **80** 和 **443** 可从互联网访问。当主机解析器在 Docker 内部失败时,Compose 为 **Caddy** 配置 **DNS 1.1.1.1** 和 **8.8.8.8**。 |
| **`curl` 访问 HTTPS 返回空输出或在第一次尝试时失败** | 等待直到 `docker compose logs caddy` 中出现 **certificate obtained successfully**。 |
| 日志中的客户端 IP 是 `172.x.x.x`** | 使用 Caddy 时,设置 **`TRUST_X_FORWARDED_FOR=1`**,然后重新创建容器:`docker compose up -d --force-recreate`。 |
## 可选:在本地主机上暴露应用程序(调试)
要在不使用 Caddy 的情况下直接访问 Gunicorn,请在 `docker-compose.yml` 中的 **`fmc-trap`** 下添加以下内容:
```
ports:
- "127.0.0.1:5000:5000"
```
当 Caddy 终止 TLS 时,**不要**在生产环境中将应用程序绑定到 `0.0.0.0`。
## 安全性
- 部署在**专用** VPS 或**隔离**网络上。该服务**处理恶意流量**并可能**下载恶意软件**进行分析。
- **仅**在主机上的 `.env` 中存储 **Telegram** 令牌和其他机密信息(切勿提交 `.env`)。
- 将防火墙限制为所需的最小端口(HTTPS 的 **80** 和 **443**)。
## 法律和道德使用
**仅**在您**拥有**或被**明确授权**部署检测工具的系统上部署。蜜罐可能会收集攻击流量和恶意软件;请遵守**适用法律**和**组织策略**。该软件旨在用于**安全研究**。
## 发布
当发布到 GitHub 时,添加一个 **`LICENSE`** 文件,并将克隆步骤中的 `` 替换为仓库克隆 URL。
标签:Caddy, CISA项目, Cisco FMC, CVE-2026-20131, Docker, Docker Compose, ELK, Gunicorn, HTTPS, Java反序列化, JSON日志, Let's Encrypt, RCE检测, Telegram告警, Web截图, 不安全反序列化, 低交互蜜罐, 威胁情报, 安全防御评估, 容器安全, 开发者工具, 攻击捕获, 红队对抗, 编程工具, 网络安全, 蜜罐, 证书利用, 请求拦截, 远程代码执行, 逆向工具, 防火墙管理中心, 隐私保护, 非Root容器