IntegSec/PortSnatcher

GitHub: IntegSec/PortSnatcher

专为捕获和利用瞬间开放的短暂 TCP 端口而设计的渗透测试工具,能持续监控、指纹识别并建立隧道,填补传统扫描器无法处理毫秒级闪烁服务的空白。

Stars: 0 | Forks: 0

# PortSnatcher **在短暂端口打开的瞬间捕获它们 —— 在时间窗口关闭之前,对其进行指纹识别、保持连接并移交给渗透测试人员。** [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Status](https://img.shields.io/badge/status-design_complete_%E2%80%94_implementation_in_progress-orange)](./docs/superpowers/specs/2026-04-22-portsnatcher-design.md) [![Platform](https://img.shields.io/badge/platform-linux_%7C_macOS_%7C_windows-lightgrey)]() [![Made by IntegSec](https://img.shields.io/badge/made_by-IntegSec-black)](https://integsec.com) ## 为什么会有 PortSnatcher 现代渗透测试的目标会在**短暂的、瞬时的 TCP 端口**上暴露服务 —— 云元数据辅助程序、自动扩缩容管理接口、闪烁的内部服务、重连窗口套接字、在部署期间仅开放几毫秒的调试监听器。传统的扫描器在应对这种情况时显得力不从心: - `nmap`, `masscan`, `zmap`, `unicornscan` —— 都是一次性的。一个在你扫描期间仅开放 200ms 的端口要么出现在结果中,要么被漏掉;当你看到它时,它已经消失了。 - `knockd` / 端口敲门工具 —— 只能检测,无法利用。 - Burp Collaborator / Interactsh —— 监听你自己的基础设施,而不是去目标上狩猎。 - `pwncat`, `responder` —— 属于连接后的工具,无法参与抢占。 PortSnatcher 是第一个专为这种**抢占**而构建的工具。它会持续监控设定范围内的目标,在端口开启的瞬间赢得 SYN/ACK 竞争,在新连接上对服务进行指纹识别(每次连接一个探测,除非获得授权否则不进行任何破坏性操作),建立一个本地的保持连接隧道,以便你可以在端口关闭前通过 Burp 或任何 TCP 工具发起攻击,并在捕获的瞬间通过桌面弹窗/webhook 通知你。 **这是当你用 `nmap` 什么都没扫出来,但你知道目标主机上确实有服务在快速闪烁开启时会用到的工具。** ## 30 秒演示(目标用户体验) ``` # 在渗透测试人员的笔记本电脑上 — 目标为 scope-file 定义的范围 $ portsnatcher --config engagement.toml [09:14:02] PortSnatcher v0.1.0 — engagement ENG-2026-0142 [09:14:02] Profile: internal | Engine: raw | Targets: 10.20.0.0/16 (256 hosts) [09:14:02] Ports: ephemeral-iana (49152-65535) | Rate cap: 50000 pps [09:14:02] Event bus: http://127.0.0.1:7177/events (token in ~/.config/portsnatcher/bus-token) [09:14:02] Scope file: ./scope.json (compatible with agentic-pentest-proxy) [09:14:02] Watching... [09:14:47] CATCH 10.20.5.17:54283 (window: 180ms) engine=raw syn_rtt=2ms └─ fingerprint: HTTP/1.1, Server: nginx/1.25.3, TLS: no └─ hold-open: localhost:7101 (dumb_tunnel, keepalive engaged) └─ desktop toast sent, webhook POST ok → attach Burp to 127.0.0.1:7101 to work the service ``` **从端口开启到可供 Burp 使用的实时隧道建立:通常只需约 2 秒。** 桌面通知会在指纹识别仍在运行时触发 —— 隧道在你屏幕上显示横幅信息之前就已经就绪了。 ## 工作原理 ``` targets.json ────┐ │ scope.json ────┐ │ ┌─────────────────────────────────────────┐ │ │ │ PortSnatcher │ config.toml ────┼─┴──────┤ │ │ │ ┌──────────┐ ┌──────────────┐ │ └────────┼──▶ Engine │──▶│ Fingerprinter│ │ │ │(raw|conn)│ │ (probe ladder│ │ │ └──────────┘ └──────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────────┐ │ │ │ Event Bus (v1) │ │ │ │ tokio::broadcast + │ │ │ │ SSE/WebSocket server │ │ │ └──────┬──────────────────┘ │ │ │ │ │ ┌───────┼────────┬───────────┐ │ │ ▼ ▼ ▼ ▼ │ │ TUI JSONL Toast/Webhook Hold-Open │ │ Proxy │ │ │ │ └────────────────────────────────┼────────┘ ▼ 127.0.0.1:71xx (attach here) ``` 所有组件都通过一个版本化的 JSON 事件总线进行通信。你在 TUI 中看到的流与 webhook 接收的流、`events.jsonl` 记录的流以及即将推出的 Burp 扩展 (v1.1) 将通过 HTTP 订阅的流是完全相同的。 ## 主要功能 | | | |---|---| | **双引擎,统一行为** | `raw`(通过 `smoltcp` 实现的用户态 TCP,并在 Linux/macOS/Windows 上针对各操作系统内核提供快速路径)用于实现极速和亚 100ms 的抢占;`connect`(非特权异步 `connect()`)用于受严格限制的跳板机和容器环境。产生相同的事件,流经相同的流水线。 | | **探测阶梯,而非探测列表** | 首先被动读取横幅(发送零字节),然后是 TLS ClientHello,接着是针对特定端口的协议探测 —— 每个新连接只进行一次探测。绝不会在良性探测之后链接破坏性探测。 | | **保持连接隧道** | 端口被捕获的瞬间,我们会启动 `localhost:71xx` 将字节流通过管道传输到目标。你可以在端口关闭前将 Burp / ncat / 你的自定义漏洞利用程序指向它。针对 HTTPS 捕获提供可选的 TLS MITM,使用可复用的磁盘 CA。 | | **感知范围的探测** | 探测被标记为[技术分类](https://github.com/IntegSec/agentic-pentest-proxy/blob/master/examples/scope-manifest.json) —— `recon`、`web_app`、`api_testing`、`ssl_tls`、`destructive`。未获授权覆盖的探测将被跳过并记录在审计日志中。 | | **稳定的事件模式** | `portsnatcher/v1` 事件是一个固定的 JSON 契约。永远只增不减。你的 Burp 扩展、SOC 流水线或自定义工具都可以依赖它。 | | **实时交接** | 桌面通知、Slack/Discord/ntfy/PagerDuty webhook、终端 TUI、SSE/WebSocket 总线 —— 均由同一个流进行馈送。 | | **安全第一** | 必须提供范围文件;严格拒绝回环地址/本地链路;全局 + 单目标的 pps 上限;明确目标规则;使用 `--i-know-what-im-doing` 标志进行覆盖(是的,字面意思就是这个名字)。每一个决定都会被记录到 `audit.log` 中。 | ## 跨工具范围兼容性 PortSnatcher 使用与 IntegSec 的 [`agentic-pentest-proxy`](https://github.com/IntegSec/agentic-pentest-proxy) **相同的 JSON 范围文件格式**。一个文件即可描述你的整个测试项目;两个工具都会严格遵守它。PortSnatcher 增加了一个带有命名空间的 `portsnatcher` 段落用于特定于端口的策略,而代理端会将其干净地忽略。 ``` { "engagement_id": "ENG-2026-0142", "client": "Acme Corp", "operator": "you@yourshop.com", "authorized_targets": { "ip_ranges": ["10.10.10.0/24"], "domains": ["*.acme.com"] }, "excluded_targets": ["10.10.10.99"], "authorized_techniques": ["recon", "web_app", "api_testing", "ssl_tls"], "excluded_techniques": ["dos", "destructive"], "engagement_window": { "start": "2026-04-22T08:00:00Z", "end": "2026-05-06T17:00:00Z" }, "portsnatcher": { "port_policy": { "include": ["ephemeral-iana", "22", "80", "443"] } } } ``` ## 配置文件 —— 三种姿态,一套代码库 | | **internal** | **external** | **ctf** | |---|---|---|---| | 默认引擎 | raw | raw | raw | | 全局 pps 上限 | 50,000 | 1,000 | 100,000 | | 单目标上限 | 2,000 | 200 | 10,000 | | 探测阶梯 | full | minimal | full + aggressive | | 捕获时弹窗通知 | yes | no | yes | | 必须提供范围文件 | yes | yes (strict) | no (lab) | `--profile` 是一个单标志位,用于选择一个一致的默认姿态。你可以在需要时覆盖任何单独的设置。 ## 路线图 ### v1 (目标:在未来几周内完成代码开发) - [x] 设计已锁定 ([spec](./docs/superpowers/specs/2026-04-22-portsnatcher-design.md)) - [ ] `ps-core` (范围、配置、事件类型) - [ ] `ps-engine` (raw + connect) - [ ] `ps-fingerprint` (探测阶梯 + v1 探测注册表) - [ ] `ps-proxy` (简单隧道 + TLS MITM) - [ ] `ps-bus` (SSE + WebSocket + 固定的 `portsnatcher/v1` 模式) - [ ] `ps-notify` (终端 + TUI + 通知 + webhooks) - [ ] 跨平台 CI (Linux / macOS / Windows) - [ ] 具有编码化捕获率阈值的抢占线束一致性测试 - [ ] 在 crates.io 和 GitHub Releases 上的首次公开发布 ### v1.1 - 第一方 **Burp Suite 扩展** (Montoya API),订阅事件总线并自动将捕获的隧道接入 Burp 的上游配置 - 遵循相同模式的 Caido / ZAP 插件 - 事件总线的 Web 仪表板 - IPv6 支持 ### v2+ - UDP 支持 - 更深度的特定协议探测模块 (LDAP、Kerberos、专有二进制协议) - 分布式模式 (多个 PortSnatcher 探测节点馈送一个总线) ## 安全与道德准则 PortSnatcher 是一款**专业的渗透测试工具**,绝非脚本小子的玩具。没有范围文件它会拒绝运行。它会拒绝进行全网扫描。它会记录每一个决定 —— 包括每一个它*选择不发送*的数据包 —— 记录到属于你客户报告一部分的审计追踪中。默认配置是保守的;绕过标志被故意设计得很麻烦以避免误用。 **请仅在您获得授权的测试项目中使用它。** 如果你的项目委托书中未涵盖 PortSnatcher 的行为,请勿运行。Apache-2.0 许可证赋予了你代码的使用权;但并未赋予你将其指向的网络的使用权。 ## 支持平台 | | Linux | macOS | Windows | |---|---|---|---| | `ConnectEngine` | yes | yes | yes | | `RawEngine` (用户态 `smoltcp`) | yes | yes | yes | | `RawEngine` 内核快速路径 | `nftables` | `pf` | `WinDivert` | | `RawEngine` 需要提权 | `CAP_NET_RAW` | root / `ChmodBPF` | admin | 在所有三种操作系统上实现完整的功能对等是 v1 的验收标准 —— 而不是 v1.1 的目标。 ## 从源码构建(预发布开发期间) ``` git clone https://github.com/IntegSec/PortSnatcher cd PortSnatcher cargo build --release ./target/release/portsnatcher --help ``` 正式发布后: ``` cargo install integsec-portsnatcher ``` 或者从 [Releases](https://github.com/IntegSec/PortSnatcher/releases) 获取签名的预编译版本。 ## 前期成果与灵感来源 PortSnatcher 站在以下巨人的肩膀上: - `nmap`, `masscan`, `zmap`, `unicornscan` —— 端口扫描领域的最前沿 - `smoltcp` —— 使 `RawEngine` 具备可移植性的用户态 TCP/IP 协议栈 - `rustls` —— 贯穿全项目的 TLS 实现 - `ratatui`, `tokio`, `axum` —— Rust 卓越的异步生态系统 - Burp Collaborator / Interactsh —— 带外交接模式的前期实践 - IntegSec 的 [`agentic-pentest-proxy`](https://github.com/IntegSec/agentic-pentest-proxy) —— 姊妹工具,也是范围文件格式的来源 我们尚未发现任何先前的工具能将持续的 SYN 级别抢占、在新连接上的短窗口指纹识别以及渗透测试人员在环的保持连接交接结合在一个封装中。如果你知道有这样的工具,请开启一个 issue —— 我们很乐意在这里鸣谢。 ## 许可证 Apache License 2.0 —— 参见 [`LICENSE`](./LICENSE) 和 [`NOTICE`](./NOTICE)。 由 [IntegSec](https://integsec.com) 构建 —— 我们的第一款开源 Rust 工具。发现了 Bug,想要一个新功能,或者知道我们没想到的用例?[提交一个 Issue](https://github.com/IntegSec/PortSnatcher/issues) 或[开启一个讨论](https://github.com/IntegSec/PortSnatcher/discussions) —— 我们希望渗透测试社区来塑造它。
标签:Race Condition, Scrypt密钥派生, TCP连接, 二进制发布, 可视化界面, 安全测试, 开源工具, 插件系统, 攻击性安全, 数据展示, 数据统计, 服务指纹识别, 短暂端口, 端口扫描, 端口转发, 红队, 网络安全, 网络隧道, 隐私保护