一个低交互蜜罐,模拟Cisco Secure Firewall Management Center (FMC) 的Web界面,并捕获未认证的Java序列化风格攻击流量(CVE风格的不安全反序列化探测)。
\xac\xed\x00\x05(以及Base64 rO0AB…)并使用正则表达式和启发式方法提取shell或URL字符串。requests 检索到不可执行的下载卷中。单行JSON日志(兼容Splunk和ELK),可选的Telegram告警,哈希化的第二阶段工件,以及非root容器用户。该项目面向需要专注的FMC风格陷阱且无需额外集成代码的研究人员。
| 项目 | 说明 |
|---|---|
| Docker 和 Docker Compose v2 | 安装Docker |
| VPS 或主机 | 建议使用专用或隔离的网络段 |
| 域名(可选) | 对于HTTPS:配置DNS并允许入站TCP 80和TCP 443到主机 |
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
cp .env.example .env
根据需要编辑 .env(参见环境变量)。对于位于捆绑Caddy后的部署,设置**TRUST_X_FORWARDED_FOR=1**,以便日志中的客户端IP地址反映原始客户端。
编辑**Caddyfile:将占位符主机名替换为您的**域名(如果适用,包括www):
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
可选地,取消注释Caddyfile中的全局email [email protected]块以接收Let's Encrypt到期通知。
yourdomain.com 指向您服务器的公共IP,如果使用www也创建。ufw allow 80,443/tcp)。应用程序在容器内以UID **10001**运行。绑定挂载的./data目录必须是可写的:
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
如果没有正确的所有权,利用POST请求可能会返回500(写入日志或原始blob时出现Permission denied)。
docker compose up -d --build
docker compose ps
curl -sI https://yourdomain.com/
预期会收到**HTTP/2 200(或301或302**)以及**Via: Caddy。在浏览器中,https://yourdomain.com/** 应显示模拟的FMC登录页面。
关于在哪里读取事件、有效载荷和Docker输出,请参见查找日志、下载和服务输出和常见操作。
以下所有内容都相对于您的项目目录(包含docker-compose.yml的文件夹,通常在克隆后为FMC-Trap)。路径位于主机上;Docker通过绑定挂载将它们映射到容器中。
当日志文件中出现内容时:fmc-trap.json在请求匹配反序列化探测行为(POST中的魔数)时,每行接收一个JSON对象。默认情况下,对假登录页面的普通GET请求不会写入此文件。
**当下载文件夹中有文件时:**只有当管道从探测中提取URL且harvester成功获取允许的远程内容(在MAX_DOWNLOAD_MB限制内)时,条目才会出现。如果目录保持为空,可能还没有合格的URL,或者获取被应用程序的策略阻止。
**美化打印JSON(可选):**对于单行,通过python -m json.tool管道输出,或如果安装了jq则使用它。
Internet :443/:80 → Caddy (TLS, Let’s Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (bind mounts)
expose: "5000")。Compose将这些变量传递到**fmc-trap**服务;详情请参阅docker-compose.yml。
data/logs/fmc-trap.json中的每一行都是一个JSON对象。常见键包括timestamp、event_type、src_ip、headers、raw_payload_hash、extracted_commands,以及当文件被存储时的downloaded_file_hash。保存在data/downloads/下的blob使用模式0400(所有者只读)。
要直接访问Gunicorn而无需Caddy,在docker-compose.yml中的**fmc-trap**下添加以下内容:
ports:
- "127.0.0.1:5000:5000"
在生产环境中当Caddy终止TLS时,不要将应用程序绑定到0.0.0.0。
.env中(切勿提交.env)。仅在您拥有的系统或您被明确授权部署仪器的系统上部署。蜜罐可能收集攻击流量和恶意软件;遵守适用法律和组织策略。此软件仅供安全研究使用。
| 内容 | 主机路径 | 如何打开或跟踪 |
|---|
| 事件日志(JSON行) | data/logs/fmc-trap.json | tail -f data/logs/fmc-trap.json(实时流),或在编辑器中打开,或导入Splunk或ELK |
| 下载的第二阶段有效载荷 | data/downloads/ | 只有当harvester保存远程响应时文件才会出现;每个文件以其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;事件日志记录时触发告警 |
| 目标 | 命令或操作 |
|---|
| 查看容器是否在运行 | 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 |
| 变量 | 用途 | 默认值/备注 |
|---|
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的Harvester限制 | 16 |
TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID | 可选告警 | 空值禁用告警 |
FMC_SERVER_HEADER | Server响应头 | nginx |
VT_API_KEY | 保留 | 可选 |
| 症状 | 解决方法 |
|---|
在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返回空输出或首次尝试失败 | 等待直到certificate obtained successfully出现在docker compose logs caddy中。 |
日志中的客户端IP为**172.x.x.x** | 使用Caddy时设置**TRUST_X_FORWARDED_FOR=1**,然后重新创建容器:docker compose up -d --force-recreate。 |