maruftak/reconsentry

GitHub: maruftak/reconsentry

ReconSentry 是一款持续攻击面变化监控工具,自动对比侦察快照差异并在目标出现新资产时即时告警,省去手动比对输出的繁琐工作。

Stars: 0 | Forks: 1

# ReconSentry [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/59157b5d14180920.svg)](https://github.com/maruftak/reconsentry/actions/workflows/ci.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/maruftak/reconsentry)](https://goreportcard.com/report/github.com/maruftak/reconsentry) [![Go Reference](https://pkg.go.dev/badge/github.com/maruftak/reconsentry.svg)](https://pkg.go.dev/github.com/maruftak/reconsentry) [![Release](https://img.shields.io/github/v/release/maruftak/reconsentry?sort=semver)](https://github.com/maruftak/reconsentry/releases) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) **第一时间掌握目标攻击面的变化。** `reconsentry` 是一款为漏洞赏金猎人和安全团队设计的持续攻击面变化监控工具。它会监控你已授权测试的目标,并在出现 **新子域名、新存活主机、状态变化、IP 变化或新技术** 的瞬间向你发出警报 —— 让你抢在所有人之前接触到最新资产。 现有的侦察工具在*发现*方面表现出色,但需要你手动对比输出差异。`reconsentry` 填补了这一空白:它会按计划对你的攻击面进行快照,计算差异,优先处理重要内容,并将清晰的警报推送到 Slack / Discord / 任意 webhook。 🌐 **[落地页与在线 HTML 报告演示 →](https://maruftak.github.io/reconsentry/)** ![reconsentry 检测到目标攻击面上出现的新主机](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/961b5ce8f1180926.gif) ## 工作原理 ``` targets ──> discover ──> probe ──> snapshot ──> diff vs last run ──> prioritize ──> alert (subfinder) (httpx) (SQLite) (NEW_HOST, …) (low/med/high) (webhook) ``` `reconsentry` 通过协调经过实战检验的工具,而不是重新发明侦察技术。它的核心价值在于其上层的 **差异对比 + 优先级划分 + 警报** 层。 ## 安装说明 `reconsentry` 是一个单一的 Go 二进制文件。它会调用 [`subfinder`][sf] 和 [`httpx`][hx](来自 ProjectDiscovery)进行发现和探测 —— 因此你也必须安装它们。子域名发现还通过 [crt.sh][crtsh] 证书透明度日志、[Wayback Machine][wb] URL 索引以及 [AlienVault OTX][otx] 基于普通 HTTP 的被动 DNS 进行增强,因此这些数据源无需额外安装。 ``` # reconsentry go install github.com/maruftak/reconsentry/cmd/reconsentry@latest # 必需的 recon 工具 go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest go install github.com/projectdiscovery/httpx/cmd/httpx@latest ``` 或者从源码构建: ``` git clone https://github.com/maruftak/reconsentry cd reconsentry go build -o reconsentry ./cmd/reconsentry ``` ## 快速开始 1. 生成范围(scope)配置文件并编辑你的目标: ``` reconsentry init # writes a commented scope.yaml ``` ``` name: my-program targets: - example.com exclude: - internal.example.com min_priority: medium # low | medium | high # 每个列表都是一组以该平台格式呈现的目标 URL, # 因此一个 scope 可以同时向这三个平台发送警报。 notify: slack: - https://hooks.slack.com/services/XXX/YYY/ZZZ discord: [] webhooks: [] # generic JSON POST telegram: # Telegram Bot API (sendMessage) - token: "123456:ABC-DEF" chat_id: "987654321" email: # SMTP - smtp_host: smtp.gmail.com smtp_port: 587 username: alerts@example.com password: "app-password" from: alerts@example.com to: [me@example.com] ``` 2. 记录基线,然后开始监控: ``` # 首次运行会记录基线(无 diff) reconsentry run --config scope.yaml # 稍后再次运行 — 仅报告更改内容 reconsentry run --config scope.yaml # 或每 6 小时持续监控一次 reconsentry run --config scope.yaml --interval 6h ``` ### 参数标志 | 标志 | 默认值 | 用途 | | ------------ | ---------------- | ------------------------------------------------- | | `--config` | _(必填)_ | 范围(scope)配置文件的路径 | | `--db` | `reconsentry.db` | SQLite 快照数据库 | | `--interval` | `0` (运行一次) | 按此间隔持续监控(例如 `6h`) | | `--timeout` | `10m` | 每次运行周期的最长持续时间(`0` = 无限制) | | `--keep` | `0` (全部保留) | 每个范围仅保留最近的 N 个快照 | | `--max-hosts`| `0` (无限制) | 每次运行最多探测 N 台主机;针对庞大范围的安全边界 | | `--dry-run` | `false` | 打印变化但不发送通知 | | `--json` | `false` | 以 JSON 格式输出结果(每个周期一个对象) | | `--sarif` | `""` | 将每个周期的变化写入 SARIF 文件 | `--json` 使运行过程可被脚本化,例如仅展示高优先级的变化: ``` reconsentry run --config scope.yaml --json \ | jq '.changes[] | select(.priority >= 3) | "\(.kind) \(.host)"' ``` `--sarif` 会写入一个 [SARIF 2.1.0](https://sarifweb.azurewebsites.net/) 文件(每个范围对应一个运行记录,每项变化即为一个结果),这样定时运行的任务就可以将其发现上传到 GitHub 代码扫描或任何支持 SARIF 的仪表板: ``` reconsentry run --config scope.yaml --sarif reconsentry.sarif ``` ### 你攻击面的 `git log` `reconsentry report` 将某个范围的快照历史转换为一个**单一、独立的 HTML 文件** —— 无需服务器,没有 JS 框架,也不依赖外部资源。你可以在本地打开它,将其提交到你的范围配置文件旁,或者发布在 GitHub Pages 上,作为你整个团队都能阅读的动态*攻击面更新日志*: ``` reconsentry report --config scope.yaml -o surface.html # 已写入 surface.html (3 次 run(s), 5 个 host(s)) ``` 它会将所有记录的运行记录通过警报所使用的相同差异对比引擎进行回放,因此报告会展示一个按优先级标记颜色的**自基线以来的所有变化时间线**(`NEW_HOST`、`STATUS_CHANGE` 等),一个带有 `NEW` 徽章的存活/下线攻击面表格,以及一目了然的 KPI。这是一个可截图、可分享或可进行版本控制的便携式文件。 它还会标记 **🌊 攻击面激增** —— 即某次运行相比该范围自身近期历史,异常新增了大量主机。这种激增意味着目标正在活跃地部署攻击面,而这正是你需要关注的关键时刻。 👉 **[查看渲染后的示例报告](docs/sample-report.html)**(直接打开原始文件 —— 完全支持离线浏览)。 ### 在 CI 中运行 (GitHub Action) `reconsentry` 提供了一个可复用的复合 action,因此你可以按计划进行监控而无需托管任何内容 —— 提交 SQLite 数据库以保留历史记录,并将 HTML 报告作为构建产物上传: ``` - uses: maruftak/reconsentry@v1 with: config: scope.yaml db: reconsentry.db args: --max-hosts 1000 report: surface.html env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} ``` 完整的定时任务示例位于 [`examples/github-action.yml`](examples/github-action.yml)。请仅在已授权的目标上使用,并将 notifier 的密钥保存在 Actions 密钥中(在范围配置文件中以 `${ENV_NAME}` 形式引用)。 ### 实时攻击面徽章 `reconsentry badge` 会渲染一个独立且可嵌入的 SVG,展示该范围的存活攻击面及其 **变化速率** —— 包括主机数、存活数以及特定时间窗口内的净变化(默认为 7 天)。当攻击面正在增长时(提示猎物目标正在部署更新),它会变成 **琥珀色**,否则保持绿色: ``` reconsentry badge --config scope.yaml -o badge.svg # 渲染:attack surface | 38/42 live ▲3 ``` ![示例攻击面徽章](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/3b70e56482180931.svg) 你可以将其放在 README 中,或通过 GitHub Pages 提供,让攻击面状态随时触手可及。 ### 检查当前攻击面 `run` 报告的是*变化*;而 `assets` 则直接从数据库中展示*最新快照*,无需重新探测 —— 这样你记录的攻击面就不再是一个黑盒: ``` reconsentry assets --config scope.yaml # my-program 的 1 个 asset(s)(最新快照): # app.example.com live 200 93.184.216.34 [HSTS, Next.js, Vercel] reconsentry assets --config scope.yaml --json | jq '.[] | select(.alive)' ``` `diff` 无需重新探测即可比较任意两次存储的运行结果 —— 传入两个运行 ID(来自 `history`),或者不传参数以比较最近两次: ``` reconsentry diff --config scope.yaml # latest run vs the previous one reconsentry diff --config scope.yaml 1 4 # what changed between run #1 and #4 reconsentry diff --config scope.yaml --json 1 4 | jq '.[] | select(.priority >= 3)' ``` 而 `history` 会列出过去的运行记录,让你能够查看监控节奏以及攻击面规模随时间的变化: ``` reconsentry history --config scope.yaml # my-program 的 2 次 run(s)(按时间倒序): # #2 2026-06-11 22:25:16 7 个 asset(s) # #1 2026-06-10 22:25:11 5 个 asset(s) ``` ### 监控多个项目 在顶层的 `scopes:` 列表下声明多个范围,`reconsentry run` 就可以在一个进程中监控所有目标 —— 每个范围都有各自的目标、优先级和通知目的地(参见 [`examples/multi-scope.yaml`](examples/multi-scope.yaml)): ``` scopes: - name: acme-public targets: [acme.com] notify: { slack: [https://hooks.slack.com/services/XXX] } - name: widgets-vdp targets: [widgets.example] min_priority: high ``` `assets` 和 `history` 随后可以通过 `--scope ` 来选择特定的范围。单范围配置文件无需任何修改即可继续使用。 ### 高价值主机高亮 某些新发现的子域名仿佛在尖叫着“看这里”:`admin`、`staging`、`dev`、`api`、`vpn`、`jenkins`、`grafana`、`gitlab`……任何名称中包含这些关键词的新发现主机都会在警报中**被提升为高优先级并打上星号**,这样那些极有可能带来赏金的关键资产就能在设置了较高 `min_priority` 的过滤中存活下来,并从常规的冗余信息中脱颖而出: ``` 🔴 NEW_HOST admin-beta.acme.com [200, Django] ⭐ interesting: admin ``` 系统内置了一套默认的关键词集合,开箱即用。你也可以按范围对其进行覆盖: ``` name: acme-public targets: [acme.com] interesting: - payments - admin - graphql ``` ### 被动模式 某些项目禁止主动扫描。在某个范围上设置 `passive: true` 即可仅基于发现进行监控 —— reconsentry 将跳过针对该范围的 `httpx` 探测、`--scan-new` 和 `--crawl`,仅报告 `NEW_HOST` / `HOST_GONE`。该设置是基于单个范围的,因此主动范围和被动范围可以在同一个进程中同时运行。 ``` name: scan-forbidding-vdp targets: [example.com] passive: true ``` ### Telegram 和邮件通知 Telegram 和邮件通知目的地位于与 Slack、Discord 和通用 webhook 相同的 `notify:` 块下。`reconsentry init` 脚手架生成的配置已包含这些空字段,而 [`examples/multi-scope.yaml`](examples/multi-scope.yaml) 展示了每个范围如何选择各自的通知目的地。 通过以 `${ENV_NAME}` 的形式引用环境变量,将 token 和 SMTP 密码排除在提交的 YAML 文件之外。`reconsentry` 在验证之前会展开这些值,因此如果缺少密钥,程序会快速报错,而不是发送一条损坏的警报。 对于 Telegram: 1. 使用 BotFather 创建一个机器人并复制 bot token。 2. 从目标聊天室向该机器人发送一条消息。 3. 从 Telegram Bot API 获取 chat ID。 ``` notify: telegram: - token: ${TG_TOKEN} chat_id: ${TG_CHAT_ID} ``` 对于邮件,请配置一个 SMTP 发送服务器和至少一个收件人。如果省略 `smtp_port`,通知器默认使用 `587`。 ``` notify: email: - smtp_host: smtp.example.com smtp_port: 587 username: ${SMTP_USER} password: ${SMTP_PASS} from: alerts@example.com to: - security@example.com ``` ## 检测内容 | 变化 | 优先级 | 含义 | | --------------- | -------- | ----------------------------------------- | | `NEW_HOST` | 高 | 之前不存在的子域名 | | `HOST_LIVE` | 高 | 已知主机刚刚开始响应 | | `STATUS_CHANGE` | 中 | HTTP 状态码发生变化 | | `IP_CHANGE` | 低 | 解析的 IP 发生变化(通过 `track_ip` 开启;默认关闭 —— 在 CDN 环境下噪音很大) | | `NEW_TECH` | 低 | 出现新的技术指纹 | | `HOST_GONE` | 低 | 主机停止解析/响应 | | `CERT_EXPIRING` | 高 | 主机的 TLS 证书即将到期(通过 `--cert-check` 开启) | ## 路线图 规划中的路线图已全部交付:多范围配置、`history` / `assets`、`--keep` 保留策略、Telegram + 邮件通知器、`--crawl`(katana 端点)、`--scan-new`(nuclei)、被动模式,以及最近推出的: - [x] 更丰富的通知器格式化 —— 优先级分组的 Slack blocks / Discord embeds,带有严重程度 emoji 和限制安全的分块 - [x] 更多被动发现源 —— crt.sh、Wayback、OTX 和 Anubis - [x] `report` —— 独立的 HTML 攻击面更新日志(无需服务器,单一文件) 欢迎为接下来的开发方向提供想法 —— 请提交 issue。 欢迎贡献代码 —— 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。适合新手的 issue 已打上 `good-first-issue` 标签。 ## 许可证 MIT —— 请参阅 [LICENSE](LICENSE)。
标签:EVTX分析, Go, Ruby工具, 动态插桩, 子域名监控, 实时处理, 密码管理, 日志审计, 自动化监控, 资产测绘, 运行时操纵