一个高交互蜜罐,伪装成存在漏洞的 Laravel/Livewire 应用程序。它能捕获针对已知 Livewire CVE 的漏洞利用尝试,存储上传的恶意文件(WebShell)和远程代码执行(RCE)负载,并通过 SHA-256 去重,还能选择性地在沙箱化的 Docker 容器中执行这些负载,以提取攻击指标(IOC)——即恶意软件试图联系的 URL、IP 和域名。
出于安全考虑,系统作为两个独立的进程运行:一个Web 服务器(负责捕获负载,无 Docker 访问权限)和一个沙箱工作者(负责在隔离容器中分析负载)。
攻击者 → Nginx → FastAPI → SQLite ← 沙箱工作者 (Docker)
(捕获) (轮询任务,写入IOC)
外观层 — 提供逼真的 Laravel 登录/注册页面,包含 Livewire 的 wire: 属性、XSRF 令牌以及 X-Powered-By: PHP/8.3.12 头。自动化扫描工具看到的将是一个看起来真实且存在漏洞的应用。
捕获层 — 每个 HTTP 请求都会通过 ASGI 中间件层透明地记录到 SQLite(IP、头信息、正文哈希、时间戳),在整个路由处理之前完成。
陷阱层 — Livewire 端点像真实框架一样接受文件上传和组件消息。负载会被分类(PHP 代码、序列化对象、shell 命令),并通过 SHA-256 去重存储。每个有趣的负载都会在 sandbox_jobs 队列中创建一个持久任务。
沙箱层 — 一个独立的工作者进程轮询待处理任务,并在临时 Docker 容器(只读文件系统、无网络、cap_drop=ALL)中执行每个负载。一个 LD_PRELOAD 垫片拦截 libc 网络调用,记录 C2(命令与控制)通信尝试。分析器提取 IOC,并使用启发式方法对潜在的 C2 端点进行评分。
一个 *.php 的兜底陷阱还会捕获后渗透阶段对常见 WebShell 文件名(如 accesson.php、wp-login.php、admin.php)的探测。
前置条件: Python 3.11+ 和 uv.
git clone https://github.com/HelgeSverre/livewire-honeypot.git
cd livewire-honeypot
# 安装依赖
uv sync
# 启动 Web 服务器(仅捕获,无需 Docker)
DATA_DIR=./data uv run uvicorn honeypot.main:app --reload --port 8000
# 在第二个终端中启动沙箱工作者(需要 Docker)
DATA_DIR=./data uv run python -m honeypot.worker
# 运行测试
uv run pytest tests/ -v
即使没有运行沙箱工作者,Web 服务器也能独立工作——它会捕获并存储所有数据。当你需要自动分析负载时,再启动工作者。
注意:
src/目录已通过pyproject.toml(源码布局)加入 Python 路径,因此honeypot.main:app对应src/honeypot/main.py。
你需要:
只要 VPS 存在,整个部署只需一条命令。该脚本处理从“裸机 droplet”到“带有 TLS 的服务运行”的所有步骤——apt 包、用户和组、Python venv、沙箱镜像、nginx、certbot 和防火墙规则。
# 1. 创建一个 $6/月的 droplet (Ubuntu 24.04, 1 GB 内存足够).
# 在 DigitalOcean 上:
doctl compute droplet create veritron-honeypot \
--size s-1vcpu-1gb \
--image ubuntu-24-04-x64 \
--region fra1 \
--ssh-keys "$(doctl compute ssh-key list --format ID --no-header | head -1)" \
--wait
# 2. 将域名的 A 记录指向 droplet 的 IP.
# 继续之前先等待 DNS 解析完成。
dig +short your-domain.example # 应返回 droplet IP
# 3. 将项目复制到 droplet 上。
rsync -az --exclude='.git' --exclude='.venv' --exclude='data' \
./ root@<droplet-ip>:/opt/honeypot/
# 4. 运行引导脚本。传入你的域名将启用 certbot 的 TLS。
ssh root@<droplet-ip> 'cd /opt/honeypot && [email protected] \
bash deploy/setup.sh your-domain.example'
这就完成了。蜜罐现在通过 HTTPS 提供一个伪造的 Laravel/Livewire 登录页面,捕获所有请求到 SQLite,并准备好在 Docker 沙箱中分析负载。
deploy/setup.sh 是幂等的——重复运行是安全的。按顺序:
honeypot(Web)和 sandbox(工作者)服务用户,以及共享的 honeypot-data 组。uv sync --python /usr/bin/python3.12。我们特意使用 apt 安装的 Python,而不是 uv 自带的解释器——uv 的 Python 位于 /root/.local/share/uv/,无特权的服务用户无法遍历该目录,如果让 uv 选择解释器,systemd 会报出令人困惑的 status=203/EXEC 错误。/var/honeypot/,设置 setgid 位和共享组所有权,使两个服务都能读取彼此的写入内容。ExecStart 以使用系统 Docker 守护进程(自带的单元假定是 rootless Docker,设置起来更麻烦)。docker build -t honeypot-sandbox sandbox/)。limit_req_zone 指令放入 /etc/nginx/conf.d/(它必须在 http {} 块中,而不是 块中)。如果你希望自己一步步操作,而不是运行 setup.sh,等效的 shell 历史记录以注释阶段的形式保存在 deploy/setup.sh 中。
| 服务 | 用户 | 用途 | Docker 访问权限 |
|---|---|---|---|
honeypot.service | honeypot | Web 服务器——捕获请求和负载 |
两个服务共享 /var/honeypot/,用于 SQLite 数据库和负载存储。Web 进程没有 Docker 套接字访问权限,因此即使通过攻击者流量被攻陷,也无法在主机上创建容器。
# 查看日志
journalctl -u honeypot -f
journalctl -u honeypot-worker -f
# 重启服务
systemctl restart honeypot honeypot-worker
# 升级
cd /opt/honeypot && git pull && uv sync
docker build -t honeypot-sandbox sandbox/
systemctl restart honeypot honeypot-worker
所有设置均通过环境变量控制(在 systemd 单元文件中设置,或在运行前导出):
所有数据位于单个 SQLite 数据库中(默认:/var/honeypot/captures.db)。
# 最近的请求
sqlite3 /var/honeypot/captures.db \
"SELECT timestamp, source_ip, method, path, matched_trap
FROM requests ORDER BY id DESC LIMIT 20;"
# 按频率排列的唯一负载
sqlite3 /var/honeypot/captures.db \
"SELECT sha256, filename, payload_type, times_seen, sandbox_status
FROM payloads ORDER BY times_seen DESC;"
# 最活跃的攻击者 IP
sqlite3 /var/honeypot/captures.db \
"SELECT ip, total_requests, first_seen, last_seen
FROM attackers ORDER BY total_requests DESC LIMIT 10;"
# 沙箱运行结果及提取的 IOC(JSON)
sqlite3 /var/honeypot/captures.db \
"SELECT payload_id, exit_code, duration_seconds, c2_urls_found, iocs
FROM sandbox_runs ORDER BY id DESC LIMIT 5;"
# 待处理的沙箱任务
sqlite3 /var/honeypot/captures.db \
"SELECT id, payload_sha256, status, created_at
FROM sandbox_jobs ORDER BY id DESC LIMIT 10;"
sandbox_runs.iocs 中的 IOC 数据以 JSON 存储,键包括:domains、ips、emails、urls、hashes。可按需提取并输入到你的威胁情报平台(MISP、OpenCTI 等)。
src/honeypot/
main.py # FastAPI Web 应用(仅捕获,无 Docker)
worker.py # 独立沙箱工作者(轮询 SQLite,需要 Docker)
config.py # 从环境变量读取设置
capture/
database.py # 异步 SQLite——请求、负载、sandbox_jobs 队列
logger.py # ASGI 中间件——记录每个请求
payloads.py # SHA-256 去重存储 + 负载分类
facade/
routes.py # 具有 Laravel 特征的页面(登录、注册等)
templates/ # 包含 Livewire wire: 属性的 Jinja2 HTML
static/ # 假冒的 livewire.js(v3.5.1 指纹)
traps/
livewire.py # POST /livewire/message, /upload-file, /preview-file
php_catchall.py # 针对 *.php 探测的兜底陷阱
sandbox/
orchestrator.py # Docker 容器生命周期 + 加固
analyzer.py # 工件解析 + IOC 提取 + C2 评分
deploy/
nginx.conf # 带速率限制的反向代理
honeypot.service # systemd 单元(Web)
honeypot-worker.service # systemd 单元(沙箱工作者)
setup.sh # VPS 引导脚本
sandbox/
Dockerfile # 沙箱容器镜像(PHP 8.3 + 攻击者工具)
entrypoint.sh # 容器入口点,带有 LD_PRELOAD 网络垫片
这是一个研究工具,用于在你拥有的基础设施上收集恶意软件样本并观察攻击者行为。它不是生产安全产品。仅在你控制的系统上部署,并注意捕获和执行攻击者负载可能在你所在司法管辖区产生法律影响。SQLite 数据库和负载文件会无限增长——请监控磁盘使用情况,并根据需要实施保留策略。
欢迎提交 Issue 和 Pull Request。
| CVE | CVSS | 摘要 | 陷阱端点 |
|---|
| CVE-2024-47823 | 9.8 严重 | Livewire 文件上传 RCE(通过 MIME 类型绕过)。 文件扩展名根据 MIME 类型猜测,而非通过文件名验证,导致 .php 文件可伪装成图片上传。影响 Livewire < 2.12.7 和 < 3.5.2。 | POST /livewire/upload-file |
| CVE-2025-54068 | 9.2 严重 | Livewire 属性填充 RCE。 属性填充过程未能对组件属性更新中的对象类型进行净化,允许注入的负载在服务端执行。影响 Livewire 3.0.0-beta.1 至 3.6.3。 | POST /livewire/message |
| CVE-2025-14894 | 严重 | Livewire Filemanager 无限制上传 RCE。 缺少文件类型和 MIME 验证,允许未认证用户上传可执行的 PHP 文件。 | POST /livewire/upload-file |
server {}certbot --nginx。| 否 |
honeypot-worker.service | sandbox | 沙箱工作者——在 Docker 中分析负载 | 是 |
| 变量 | 默认值 | 描述 |
|---|
DATA_DIR | /var/honeypot | 所有数据的基础目录 |
DB_PATH | $DATA_DIR/captures.db | SQLite 数据库路径 |
SANDBOX_TIMEOUT | 60 | 每次沙箱运行的最大秒数 |
SANDBOX_MEMORY | 128m | 容器内存限制 |
SANDBOX_CPUS | 0.5 | 容器 CPU 限制 |
SANDBOX_MAX_CONCURRENT | 3 | 最大并发沙箱容器数 |
SANDBOX_IMAGE | honeypot-sandbox | 沙箱的 Docker 镜像 |
WORKER_POLL_INTERVAL | 2.0 | 任务轮询间隔(秒) |