kocaemre/recon-deck
GitHub: kocaemre/recon-deck
一个面向渗透测试者的离线侦察工作流追踪器,将 nmap 扫描输出自动转换为端口感知的可操作检查清单,帮助安全研究者系统化管理侦察进度。
Stars: 29 | Forks: 0
# 🛰️ recon-deck
**在 30 秒内,将 `nmap` 输出转换为可执行的、端口感知的侦察清单。**
离线。自托管。每次任务导出均为 Markdown 格式。
[](LICENSE)
[](CHANGELOG.md)
[](src/lib/db/migrations/)
[](https://github.com/kocaemre/recon-deck/pkgs/container/recon-deck)
[](https://nextjs.org)
[](SECURITY.md)
粘贴 nmap 的 text / XML / greppable 输出——或者拖入 AutoRecon 的 `results/` 压缩包——每一个开放端口都会变成一张卡片,包含预填充的命令(已插入 IP)、HackTricks 链接、可勾选的检查项、证据截图和备注字段。
专为 **OSCP / HTB 学生和单人渗透测试者**打造,他们目前通常需要为每台机器应付 8 个浏览器标签页和一个临时的 Obsidian 记录文件。
[](https://youtu.be/bZP_6gsokFQ)
▶ 观看 50 秒演示 — 粘贴 nmap → 深入某个端口 → 勾选检查项 → 切换端口。
An engagement view: 28 open ports, KB-matched risk colors, per-port check completion. More screenshots →
```
# 30秒 冒烟测试 — 拉取镜像,在 http://localhost:13337 上启动
curl -sSL https://raw.githubusercontent.com/kocaemre/recon-deck/main/install.sh | sh
```
## 为什么选择 recon-deck
| 没有它时 | 有了它之后 |
|---|---|
| 每台机器打开 8 个浏览器标签页(HackTricks, payloadsallthethings, gtfobins, …) | 每个端口独立一个页面,预填充的命令可直接复制 |
| 手动为每个服务敲击 `nmap -p- -sV` 模板 | 由 KB 驱动的命令,包含 `{IP}` / `{HOST}` / `{PORT}` / `{WORDLIST_*}` 占位符 |
| 忘记了在第 7 台机器上做过哪些检查 | 可勾选的清单 + 每个端口的注释保存在 SQLite 中 |
| Markdown 报告 = 从笔记中手动复制粘贴 | 一键导出:Markdown / HTML / JSON / SysReptor / PwnDoc / PDF |
| AutoRecon 输出 → 只能靠翻文件夹查找 | 拖入压缩包,每个端口对应的文件会自动路由到正确的卡片中 |
## 核心功能亮点
📥 输入解析 — nmap text / XML / greppable + AutoRecon zip + 手动添加端口
- **多格式 nmap 解析器** — `-oN`, `-oX`, `-oG`。多主机扫描会在页眉生成一个主机选择器标签
- **AutoRecon zip 导入** — 拖入压缩后的 `results/` 文件夹;每个端口的服务文件、`_manual_commands.txt`、gowitness 截图、patterns / errors 日志都会被自动路由
- **重新导入 + 差异对比** — 重新粘贴一份新的 nmap 输出,热力图会在新端口上标记 `NEW`,在之前开放的端口上标记 `CLOSED`。页眉的 `scans: N` 标签会记录你进行了多少次导入
- **手动端口** — 热力图上的 `+ Add port` 用于添加 nmap 遗漏的服务(DNS 区域传送、备用 banners 等)
🎯 分类筛选 — KB 驱动的端口卡片、已知漏洞、searchsploit、发现目录
- **KB 驱动的卡片** — 端口 + 服务 + 产品/版本 匹配内置的 YAML KB → 可勾选的检查项、预填充的命令、HackTricks 链接
- **Active Directory 工具包** — `nxc` (netexec)、impacket (`GetNPUsers`, `GetUserSPNs`, `secretsdump`)、kerbrute、bloodhound-python、PetitPotam、pyWhisker — 全部连接到正确的 DC 端口 (88/135/389/445/464/636/3268/3389/5985)
- **已知漏洞自动匹配** — `vsFTPd 2.3.4` 及类似项目 → 漏洞 + CVE + 参考链接会直接显示在端口卡片上
- **searchsploit 查询** — 针对每个端口可一键 `searchsploit -t ""`,并带有缓存
- **发现目录** — 严重程度 / 标题 / 描述 / CVE / 证据参考。KB 行上的 `+ finding` 按钮可一键预填充该弹窗
🖼️ 证据 — 每个端口的截图、AutoRecon gowitness 导入、原生标注
- **拖放 / 剪贴板粘贴** 截图到每个端口的证据面板中
- **原生 HTML5 canvas 标注** — 矩形 / 箭头 / 画笔 / 文本工具,5色调色板,撤销栈。保存时会通过 `parent_evidence_id` 链接到一条新的证据记录,因此原始文件始终得以保留
- **AutoRecon gowitness / aquatone PNGs** 会自动导入到匹配端口的证据列表中
📤 导出 — Markdown, JSON, HTML, CSV, SysReptor, PwnDoc, 打印为 PDF
- **六种导出格式** 外加一条打印优化的 PDF 路径
- **Markdown** 附带兼容 Obsidian 的 frontmatter
- **SysReptor JSON** + **PwnDoc YAML** 用于向报告工具提供数据
- **Findings CSV** 用于电子表格分类审查
- **多主机感知** — SysReptor 范围和 PwnDoc 范围会列出每个主机;markdown / HTML 会为每个主机渲染一个单独的部分
⌨️ 工作流 — 命令面板、FTS5 搜索、快捷键、侧边栏操作
- **命令面板** (`⌘K`) — 每个 UI 操作都在面板中:添加发现、重新导入、设置、删除、导出、打印
- **跨任务搜索** (`⌃⇧F`) — FTS5 + BM25,命中的行会显示主机上下文
- **侧边栏任务操作** — 悬停 kebab 菜单包含重命名 / 复制 (深拷贝) / 删除 (shadcn AlertDialog)
- **自定义命令** + **字典覆盖** 位于 `/settings/commands` 和 `/settings/wordlists` — 你的代码片段会显示在 KB 命令旁边
📚 知识库 — YAML KB、应用内编辑器、热重载
- **YAML KB** — 在 `/kb`(或你指定的 `kb_user_dir` 路径)中放入条目;内置的 KB 位于 `knowledge/` 目录下
- **应用内编辑器** 位于 `/settings/kb` — 粘贴,使用 Zod `KbEntrySchema` 进行验证,并保存在严格的文件名白名单下
- **热重载** — `fs.watch` 监控内置和用户目录,触发修改标志后,下一次请求时重新构建。在你的编辑器中编辑 YAML,刷新页面即可看到更改
- **应用内编辑器** 位于 `/settings/kb` — 粘贴,验证,保存(在严格的 `[A-Za-z0-9_-]` 文件名白名单下进行原子写入)
🛡️ 安全性 — 迁移备份、Host-header 白名单、限流器、默认离线
- **迁移前快照** 通过 `VACUUM INTO` 实现 — 启动时会在任何新迁移运行之前写入 `data/recon-deck.db.backup-pre-NNNN`。失败日志会提供一条可复制粘贴的 `cp` 回滚命令
- **迁移后 `PRAGMA integrity_check` + `foreign_key_check`** — 其中任何一个失败都会中止启动
- **Host-header 白名单中间件** — 当应用在 `0.0.0.0` 上可访问时,防御 DNS-rebinding 攻击
- **针对每个 IP 的限流器** 应用于 `/api/*` — 为局域网暴露情况提供纵深防御
- **默认离线** — 除非操作者选择启用 GitHub 发布检查,否则零外部 HTTP 请求
🚀 首次运行 (v2.1.0) — 引导流程、示例任务、更新提示
- **`/welcome` 4 步引导** — 范围 · 教程 · 本地路径 · 更新。使用你的 `local_export_dir`、`kb_user_dir`、`wordlist_base` 和发布检查开关来初始化 `app_state` 单例
- **从 `/settings → First-run` 重放引导** — 路径会被保留
- **示例任务** — 粘贴面板上的 "Try sample" 会插入一个预设的 10 端口 HTB-easy 靶机,标记为 `is_sample = true`。页眉会显示一个 `SAMPLE` 标签,支持一键丢弃
- **仅通知的更新检查** (选择启用) — 每次会话 ping 一次 `api.github.com/repos/kocaemre/recon-deck/releases/latest`,如果存在更新的 tag 则弹出 "Release notes" 链接提示。安装仍需手动进行
- **桌面端视口限制** — `< 1280px` 时会显示清晰的 "需要更宽的屏幕" 说明
## 快速入门
有三种运行方式,任选其一。全部绑定到 `127.0.0.1:13337`(选择此端口是为了避开 3000/8080 上的开发服务器人群),因此默认情况下不会向局域网泄露任何信息;如果你有其他需求,请参阅 [暴露到局域网](#exposing-to-lan)。
**1. 一行命令运行 (自动拉取 + 启动 + 打开浏览器):**
```
curl -sSL https://raw.githubusercontent.com/kocaemre/recon-deck/main/install.sh | sh
```
**2. Docker Compose (推荐用于持久化设置):**
```
curl -O https://raw.githubusercontent.com/kocaemre/recon-deck/main/docker-compose.yml
docker compose up -d
```
**3. 手动 `docker run`:**
```
docker run -d --name recon-deck -p 127.0.0.1:13337:13337 \
-v recondeck-data:/data \
-v recondeck-kb:/kb \
-e HOSTNAME=0.0.0.0 \
ghcr.io/kocaemre/recon-deck
```
打开
,粘贴 nmap 输出,查看卡片。主机端的 `-p 127.0.0.1:13337:13337` 前缀将应用限制为仅本地回环可用 — 请参阅 [暴露到局域网](#exposing-to-lan) 了解局域网访问方式。
## 项目定位 / 非项目定位
**面向 OSCP/HTB 学生和单人渗透测试者。** 离线运行。无 LLM。不执行扫描 — 它是 AutoRecon 和 HackTricks 的补充。可以把它看作是侦察阶段的 OSCP 风格 Obsidian:与 Obsidian 同类,但专注于扫描后的工作流。
**它不是** 报告平台、团队协作工具、扫描器、AI 助手或移动应用。其意图是刻意且狭义的 — 请参阅 [ROADMAP.md](ROADMAP.md) 了解超出范围的功能列表。
## 暴露到局域网
默认情况下,快速入门指南将应用绑定到主机端的 `127.0.0.1` — 只有你的本地机器可以访问该应用。要使局域网中的其他机器能够访问 recon-deck:
```
docker run -p 13337:13337 \
-v recondeck-data:/data \
-v recondeck-kb:/kb \
-e HOSTNAME=0.0.0.0 \
-e RECON_DECK_TRUSTED_HOSTS=192.168.1.10:13337 \
ghcr.io/kocaemre/recon-deck
```
将 `192.168.1.10:13337` 替换为你的局域网客户端将使用的主机:端口。`RECON_DECK_TRUSTED_HOSTS` 是逗号分隔的 — 为你希望能访问该应用的每个额外主机名扩展此列表。
这将激活 Host-header 白名单(缓解 DNS 重绑定攻击)。其 `Host:` header 不在白名单中的请求将被拒绝并返回 HTTP 421 Misdirected Request。有关完整的威胁模型,请参阅 [SECURITY.md](SECURITY.md)。
## 自定义知识库
将 YAML 文件放入 `/kb/ports/*.yaml`(通过卷挂载)— 它们会在启动时覆盖具有相同端口/服务的内置条目。Schema、黑名单和占位符语法详见 [CONTRIBUTING.md](CONTRIBUTING.md)。
绑定挂载主机目录?容器以 UID 1000 运行 — 请先执行 `chown 1000:1000 /path/to/my-kb`,或者使用命名卷(`-v recondeck-kb:/kb`)它会自动继承所有权。
## AutoRecon 导入
1. `autorecontarget>` → 生成 `results//`
2. `cd results && zip -r my-target.zip /`
3. 将 zip 文件拖放到导入面板
服务端解压会路由所有内容:每个端口的文件(`tcp80/…`, `tcp_22_ssh_*`)到正确的卡片,`_manual_commands.txt` 到手动命令,gowitness/aquatone 的 PNG 图片到端口证据,日志文件(`_patterns`, `_errors`, `_commands`)到任务警告面板。多 IP 的 zip 包会变成多主机任务(主机会继承完整的 AR 数据,从机会获取端口和脚本)。
## 多主机任务
一个任务,N 个主机(DC + 工作站、相关机器等)。主机通过页眉中的标签进行切换;热力图 + 命令 + 调色板全部重新限定范围。多主机是通过 XML `` 块、text/greppable 的 `Nmap scan report for ...` 边界以及 AutoRecon 的多 IP zip 包检测出来的。
## 重新导入 + 扫描差异
点击任务页眉的 **Re-import** 并粘贴一份新的 nmap 输出。调和器会:
- 添加新端口(热力图上显示 `NEW` 标签)
- 为再次观察到的端口刷新 `last_seen_scan_id`
- 将新扫描未观察到的端口标记为 `closed`(`CLOSED` 标签,变暗的色块)
- 在页眉显示 `scans: N` 标签,让你知道已应用了多导入差异上下文
- 导入后弹出提示:`1 new · 1 closed · 2 unchanged`
## 设置
`/settings`(侧边栏页脚的链接)涵盖:
- **任务列表** — 带有级联确认的内联删除
- **字典** (`/settings/wordlists`) — 覆盖 `{WORDLIST_*}` 占位符
- **自定义命令** (`/settings/commands`) — 与 KB 命令并列的个人代码片段,可按服务/端口限定范围
- **KB 编辑器** (`/settings/kb`) — 粘贴,验证,保存到你的用户目录;缓存会立即使其失效
任务重命名可以在页眉(目标标识)内联进行,或通过侧边栏的 kebab 菜单(显示标签)进行。kebab 菜单还提供复制(深拷贝事务)和删除(带确认的级联删除)。
## 导出
六种格式 + 一条打印路径。均支持多主机。
| 格式 | 用途 |
|---|---|
| **Markdown** | 兼容 Obsidian 的 frontmatter,可直接粘贴到你的 vault 中 |
| **JSON** | 结构化数据导出,用于脚本处理 |
| **HTML** | 独立的单文件报告,可离线打开 |
| **Findings CSV** | 包含 严重程度 / 主机 / 端口 / CVE 行的表格,适用于电子表格 |
| **SysReptor JSON** | 带有 `scope[]` 的 `projects/v1` 结构 |
| **PwnDoc YAML** | 发现 + 范围,支持多主机 |
| **Print-to-PDF** | `/report` 路由,Ctrl+P → 另存为 PDF |
## 备份与还原
状态存在于两个卷中 — 请同时备份两者:
- `recondeck-data` → SQLite DB(历史记录、证据、发现、备注)
- `recondeck-kb` → 你在 `/kb` 下的 YAML 覆盖配置
**打包为 tarball 进行快照:**
```
docker stop recon-deck
docker run --rm -v recondeck-data:/data -v recondeck-kb:/kb -v "$(pwd)":/out \
alpine sh -c 'tar -C / -czf /out/recon-deck-$(date +%F).tar.gz data kb'
docker start recon-deck
```
**还原:** 停止并删除容器,重新创建卷,在 alpine 容器内执行 `tar -xzf` 解压,然后重启。迁移会在启动时重新应用。为生产环境还原固定特定的 image tag(`ghcr.io/kocaemre/recon-deck:v2.1`),这样 `:latest` 的跳跃就不会让你措手不及。
启动时还会在运行待处理的迁移之前执行 `VACUUM INTO 'data/recon-deck.db.backup-pre-NNNN'` 快照;如果失败,日志会打印一条可复制粘贴的回滚命令。Schema 仅向前兼容 — 完整流程请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) › "Migration safety and recovery"。
## 升级
仅作通知 — 无自动更新,无遥测。可选的发布检查在 `/settings → First-run` 中开启。
**Docker (简单方法):** 安装的一行命令是幂等的 — 重新运行它即可升级。它会拉取新镜像,移除之前的容器(命名卷会保留),并重新启动:
```
curl -sSL https://raw.githubusercontent.com/kocaemre/recon-deck/main/install.sh | sh
```
**Docker (手动方法):**
```
docker pull ghcr.io/kocaemre/recon-deck:latest
docker stop recon-deck && docker rm recon-deck
# 从 Quick Start 重新运行 docker run;named volumes 会保留
```
**本地开发:** `git pull && npm install && npm run dev`。迁移在启动时应用。
## 技术栈
| 层级 | 技术 |
| ------------- | ------------------------------------------ |
| 框架 | Next.js 15.5 (App Router) |
| UI | React 19, Tailwind 4, shadcn/ui |
| 持久化 | SQLite via Drizzle + better-sqlite3 |
| 解析器 | fast-xml-parser (XML), custom regex (text) |
| KB 格式 | YAML via js-yaml, validated by Zod |
| 容器 | node:22-alpine, multi-stage build |
| 许可证 | MIT |
完整的版本固定信息请见 `package.json`。该镜像是一个单一的多阶段 `node:22-alpine` 构建 — 拉取后的典型大小不到 ~200 MB。
## 开发
用于在容器之外进行本地开发:
```
git clone https://github.com/kocaemre/recon-deck
cd recon-deck
npm install
npm run dev
# → http://localhost:13337
```
实用脚本:
```
npm test # vitest unit tests (parsers + KB schema)
npm run lint:kb # YAML lint (schema + denylist + URL scheme)
npm run typecheck # tsc --noEmit
npm run build # production build (output: "standalone")
```
## 配置参考
| 环境变量 | 默认值 | 用途 |
| --------------------------- | ----------------------- | ------------------------------------------------------------------------------ |
| `HOSTNAME` | `127.0.0.1` | 容器内的绑定地址。覆盖为 `0.0.0.0` 以通过端口映射访问。 |
| `PORT` | `13337` | 应用监听的端口(同时也会驱动 Host-header 白名单的默认值)。 |
| `RECON_DB_PATH` | `/data/recon-deck.db` | SQLite 文件位置。请保持在挂载卷上以实现持久化。 |
| `RECON_KB_USER_DIR` | `/kb` | 用户 KB 目录。引导流程会将其写入优先级更高的 `app_state.kb_user_dir` 中;环境变量作为回退。 |
| `RECON_LOCAL_EXPORT_DIR` | _(空)_ | 任务页眉的 `vscode://file/…` 链接。优先使用 `app_state.local_export_dir`;此变量和 `NEXT_PUBLIC_RECON_LOCAL_EXPORT_DIR` 作为回退。 |
| `RECON_DECK_TRUSTED_HOSTS` | _(空)_ | 由 Host-header 中间件允许的逗号分隔的额外主机。 |
| `NEXT_TELEMETRY_DISABLED` | `1` | 禁用 Next.js 遥测。保留离线保证。 |
## 贡献
有关 KB 规则、PR 规范以及范围内/范围外的内容,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 安全性
有关威胁模型、离线保证和默认拒绝策略,请参阅 [SECURITY.md](SECURITY.md)。
## 致谢
有关上游的署名,请参阅 [CREDITS.md](CREDITS.md) — HackTricks, AutoRecon, PayloadsAllTheThings, SecLists。
## 路线图
有关即将推出的候选功能、v2.x 未来发展方向以及严格的超出范围项目,请参阅 [ROADMAP.md](ROADMAP.md)。
## 许可证
MIT。标签:AutoRecon, Docker, HackTheBox, Markdown, OSCP, Web安全, 侦查, 安全防御评估, 开源, 插件系统, 攻击路径可视化, 数据展示, 数据统计, 测试工作流, 清单, 离线, 端口扫描, 红队, 网络安全, 网络安全审计, 网络调试, 自动化, 自动化攻击, 自托管, 蓝队分析, 请求拦截, 防御绕过, 隐私, 隐私保护, 黑客工具