Docker 启动的多引擎制品检测工作台:Next.js 静态前端 + Go API + YARA + Chainsaw/Sigma + Suricata。
当前版本:v0.1.1 · 开源许可证:MIT
- Docker Engine 或 Docker Desktop。
- Docker Compose v2(可执行
docker compose version验证)。 - Git;仅拉取可选社区规则时需要。
- 首次构建会在镜像内编译 Chainsaw 和 Suricata,耗时取决于机器与网络;后续构建会复用 Docker 缓存。
仅使用项目内置规则:
git clone https://github.com/din4e/c2-signal.git
cd c2-signal
cp .env.example .env
make up打开 http://127.0.0.1:8080,或检查服务状态:
./scripts/compose.sh ps
curl http://127.0.0.1:8080/api/v1/health以下命令会把固定版本的 YARA、Cobalt Strike 和 Sigma 仓库下载到 Git 忽略的 rulesets/ 目录,然后按只读方式挂载到容器:
make rules
make upscripts/compose.sh 会自动检测规则目录。未执行 make rules 时仍可使用内置 Cobalt Strike YARA 和 Suricata 协议事件规则,但无法执行完整的 Sigma EVTX 检测。
| 操作 | 命令 |
|---|---|
| 后台启动或应用配置变更 | make up |
| 查看容器状态 | ./scripts/compose.sh ps |
| 持续查看扫描器日志 | make logs |
| 重启扫描器 | ./scripts/compose.sh restart scanner |
| 构建镜像 | make build |
| 不使用缓存重新构建 | ./scripts/compose.sh build --no-cache scanner |
| 停止并删除容器和网络 | make down |
| 停止并同时删除历史与本地 YARA 卷 | ./scripts/compose.sh down -v |
make down 不会删除扫描历史和页面管理的本地 YARA。只有最后一条带 -v 的命令会永久删除这两个数据卷,执行前应确认数据不再需要。
编辑 .env:
C2_SIGNAL_BIND=127.0.0.1
C2_SIGNAL_PORT=8080修改后运行 make up 应用配置。也可以仅对当前命令临时覆盖:
C2_SIGNAL_PORT=18080 make up如需允许其他主机访问:
C2_SIGNAL_BIND=0.0.0.0 make up当前 API 没有身份认证,并包含规则管理接口。不要直接暴露到不可信网络;至少应配置防火墙来源限制,生产环境应在前方增加认证、TLS、请求大小限制和访问审计。
git pull --ff-only
make build
make up社区规则使用项目锁定的提交版本。项目更新了锁定版本时,脚本会拒绝覆盖现有的不同版本目录;确认不需要保留后,删除 rulesets/,再执行 make rules。
scanner-data卷:扫描历史与结果 JSON。yara-local卷:通过页面创建和编辑的本地 YARA。- 上传制品默认在扫描结束后删除,不写入持久化卷。
- 容器默认限制为 2 CPU、2 GB 内存、256 PID;最大上传 100 MB,并发扫描数为 2,单次扫描超时 180 秒。
- 如遇启动或扫描异常,先执行
./scripts/compose.sh ps和make logs;端口占用时修改C2_SIGNAL_PORT。
上传制品后展示检测器状态、SHA-256、命中分组、严重度与规则来源。
点击命中的 YARA 规则即可查看源文件,并自动定位到具体规则声明和行号。
支持新建、编辑、语法校验、启用和停用本地规则。
| 上传类型 | 检测器 | 规则来源 |
|---|---|---|
| 普通文件、二进制、文档、压缩包 | YARA | Yara-Rules、Elastic protections-artifacts、Cobalt Strike YARA、DIE YARA、本地规则 |
| Cobalt Strike Beacon / BOF / 解码配置 | YARA + CS 专用分类 | Te-k、Elastic 与 rules/yara/cobalt_strike_beacon.yar |
| NocturneLdr BYOUD / EAF bypass / Zilean Sleep 混淆 | YARA + 加载器分类 | rules/yara/nocturne.yar |
Windows .evtx |
Chainsaw | SigmaHQ Windows 规则 |
.pcap / .pcapng |
Suricata | rules/suricata/(含 nocturneldr-payload.rules)与 Suricata 内置协议事件规则 |
Elastic detection-rules、Splunk security_content 和 Sigma 不是同一种可执行规则格式。Elastic/Splunk 规则需要各自的事件字段和查询后端,因此不会错误地应用到普通二进制文件。当前平台对上传 EVTX 使用 SigmaHQ;对普通制品使用 YARA;对 PCAP 使用 Suricata。引擎不会跨格式叠加,以避免把网络载荷字符串当作文件恶意特征。
- 文件名、大小、媒体类型与 SHA-256。
- 实际运行的检测器、状态、规则文件数和耗时。
- 触发的规则名、检测器、严重度、分类和规则来源。
- 最近扫描历史、命中数与 CS Beacon / NocturneLdr 专项命中数;点击历史记录可恢复完整结果。
clean:所有适用检测器完整执行且无命中。matched:至少一条规则触发。inconclusive:检测器缺失、超时、跳过或出错;不能视为安全。
“无命中”只表示已加载规则没有匹配,不是安全判定。
- YARA:在页面“管理本地 YARA”中创建或编辑;保存前自动编译校验,保存后自动热重载。
- 本地 YARA 保存在 Docker 卷
yara-local;启用文件使用.yar/.yara,停用文件增加.disabled后缀。 - Suricata:放入
rules/suricata/,扩展名.rules。 - Sigma:运行
make rules后从仓库内忽略的rulesets/sigma/rules/只读挂载。
社区、Elastic、Cobalt Strike 和 DIE YARA 仓库由 scripts/fetch-rules.sh 拉取固定版本并保持只读,页面仅管理本地规则。Suricata 或外部仓库规则变更后需要重启:
./scripts/compose.sh restart scannerGET /api/v1/health
GET /api/v1/rules
GET /api/v1/scans?limit=30
POST /api/v1/scans multipart/form-data, field: file
GET /api/v1/scans/{id}
DELETE /api/v1/scans/{id}
GET /api/v1/scans/{id}/rule?name={yara_rule}
GET /api/v1/yara/rules
GET /api/v1/yara/rules/{name}
PUT /api/v1/yara/rules/{name}
PATCH /api/v1/yara/rules/{name}/enabled
上传返回 202 Accepted 和任务 ID。前端轮询任务直到 completed 或 failed。
- 不执行上传文件,不使用上传文件名构造存储路径。
- 默认限制 100 MB、2 个并发任务、每次扫描 180 秒。
- 默认扫描结束后删除上传文件;扫描元数据与结果以 JSON 保存在 Docker 数据卷
/data/history。 - 解析命令通过参数数组调用,不经过 shell。
- 容器只读、非 root、移除全部 capabilities、禁止提权并限制 PID/CPU/内存。
- Web 默认绑定宿主机
127.0.0.1:8080,容器使用独立 bridge 网络。若通过C2_SIGNAL_BIND=0.0.0.0 make up对外开放,必须通过防火墙限制来源或在前方增加身份认证与 TLS。扫描器不会根据制品内容发起网络请求;如需强制阻断出站流量,应使用宿主防火墙或独立 VM 的网络策略。
解析恶意文件仍可能触发第三方解析器漏洞。生产环境应在独立主机或虚拟机运行,不要挂载 Docker socket、宿主敏感目录或生产凭据。若需要多用户访问,应在前方增加身份认证、TLS、审计日志和配额。
| 环境变量 | 默认值 | 说明 |
|---|---|---|
C2_SIGNAL_BIND |
127.0.0.1 |
Compose 发布到宿主机的监听地址 |
C2_SIGNAL_PORT |
8080 |
Compose 发布到宿主机的端口 |
MAX_UPLOAD_BYTES |
104857600 |
最大上传字节数 |
SCAN_TIMEOUT_SECONDS |
180 |
单任务总超时 |
MAX_CONCURRENT_SCANS |
2 |
并发扫描任务数 |
KEEP_UPLOADS |
false |
是否保留上传文件 |
HISTORY_DIR |
/data/history |
持久化扫描结果目录 |
HISTORY_LIMIT |
200 |
最多保留的历史任务数 |
MANAGED_YARA_ROOT |
/rules/yara/local |
页面可编辑的本地 YARA 目录 |
YARA_ROOTS |
/rules/yara |
YARA 根目录,冒号分隔 |
SIGMA_ROOT |
/rules/sigma |
Sigma 根目录 |
SURICATA_RULE_ROOTS |
/rules/suricata:/opt/suricata/share/suricata/rules |
Suricata 规则根目录,冒号分隔 |
前端:
cd frontend
npm install
npm run devGo API(需要正确的 Go 1.24+ 工具链):
cd backend
go test ./...
go run ./cmd/serverNext.js 使用 output: 'export',生产构建生成的静态文件由 Go 服务直接提供,不需要额外 Node.js 运行时。
项目代码使用 MIT 许可证。版本记录见 CHANGELOG.md,公开发布前检查项见 发布检查清单。第三方规则仓库不进入本项目 Git 历史,各自许可证信息见 THIRD_PARTY.md。



