JakobBartoschek/porthawk
GitHub: JakobBartoschek/porthawk
一款纯 Python 异步端口扫描器,集成 CVE 关联查询、操作系统指纹识别、蜜罐检测和红队规避技术,支持 Web 仪表盘和 CI/CD 集成。
Stars: 3 | Forks: 0
```
██████╗ ██████╗ ██████╗ ████████╗██╗ ██╗ █████╗ ██╗ ██╗██╗ ██╗
██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝██║ ██║██╔══██╗██║ ██║██║ ██╔╝
██████╔╝██║ ██║██████╔╝ ██║ ███████║███████║██║ █╗ ██║█████╔╝
██╔═══╝ ██║ ██║██╔══██╗ ██║ ██╔══██║██╔══██║██║███╗██║██╔═██╗
██║ ╚██████╔╝██║ ██║ ██║ ██║ ██║██║ ██║╚███╔███╔╝██║ ██╗
╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝
Async port scanner. Authorized targets only.
```
[](https://github.com/JakobBartoschek/porthawk/actions/workflows/ci.yml)
[](https://codecov.io/gh/JakobBartoschek/porthawk)
[](https://www.python.org/)
[](LICENSE)
[](DISCLAIMER.md)
PortHawk 是一个纯 Python 编写的异步 TCP/UDP 端口扫描器。它可以扫描端口,从 Banner 中提取服务版本,查询相关 CVE,并以实时终端 UI、JSON、CSV 或独立的 HTML 报告形式输出结果。无需 nmap,无需外部二进制文件。
## 功能特性
- **Web 仪表盘** — 面向非技术用户的 Streamlit UI。侧边栏设置、实时扫描、Altair 图表、PyVis 网络图、差异对比视图、一键下载报告。无需 CLI。(`pip install porthawk[dashboard]`,然后 `python start_dashboard.py`)
- **通过 `asyncio` 的异步 TCP 扫描** — 默认 500 个并发连接,可配置
- **UDP 扫描** — 针对 DNS、NTP、SNMP、SSDP、NetBIOS、mDNS、IKE、TFTP 的特定协议 Payload。验证响应,提取 Banner。通过 ICMP 不可达检测关闭的端口。默认扫描前 20 个 UDP 端口。
- **Nmap XML 导入 + 差异对比** — 加载任何 Nmap `-oX` 输出并比较两次扫描以查看变化:新开放的端口、消失的服务、版本升级。也适用于 PortHawk JSON。
- **GitHub Action** — 在任何工作流中添加 `uses: jakobbartoschek/porthawk@v1.0.0`。扫描主机,在 Security 标签页中获取作为 SARIF 警报的开放端口,下载作为构件的报告。
- **SARIF 输出** — `-o sarif` 写入 SARIF 2.1.0 文件。开放端口变为 Security 标签页警报,风险严重程度映射到 SARIF 级别。
- **来自 TTL 值的 OS 指纹识别** — Linux/Unix、Windows、网络设备
- **服务检测** — 具有版本提取功能的协议感知 Banner 抓取,支持 SSH、FTP、SMTP、POP3、IMAP、VNC、MySQL、Redis、Memcached
- **通过 NVD API 的 CVE 查询** — 版本感知: "OpenSSH 8.9" 返回相关 CVE,而不仅仅是所有标记为 "ssh" 的内容。双层缓存(内存 + 磁盘,24 小时 TTL)以保持在速率限制内
- **ML 端口优先级排序** — 基于互联网范围扫描频率训练的逻辑回归,针对私有 IP 范围和 OS 提示进行调整(`pip install porthawk[ml]`)
- **蜜罐检测** — 基于 Banner 签名、ICS 端口模式、端口数量、延迟均匀性等,对主机的蜜罐可能性进行 0.0–1.0 评分
- **自适应扫描速度** — AIMD 并发控制:起步保守,在稳定网络上加速,在超时激增时回退。RFC 6298 SRTT/RTTVAR 用于抖动检测。
- **SYN 扫描 (半开)** — 发送原始 SYN 数据包而不完成 TCP 握手。可用时使用 Scapy,回退到 Linux 原始套接字。需要 root/管理员权限。(`pip install porthawk[syn]`)
- **IDS/IPS 规避** — 针对红队场景的 "Slow & Low" 模式:IP 分片、指数级时间抖动、诱饵源 IP、自定义 TCP 标志组合(FIN、NULL、XMAS、ACK、Maimon)
- **被动 OS 指纹识别** — 来自 SYN-ACK 响应的 TCP/IP 协议栈分析:TTL、窗口大小、MSS、TCP 选项、DF 位。基于规则的评分 + KNN 分类器,16 条签名字典。OS 系族准确率 >80%。
- **Webhook 警报** — `--slack-webhook` / `--discord-webhook` CLI 标志(或环境变量)在发现高风险端口时发送消息。仪表盘有一个通知面板用于相同目的。无需额外依赖。
- **IPv6 支持** — 传递 `2001:db8::1`、`[::1]` 或 `2001:db8::/64` 作为目标。TCP、UDP、Banner 抓取、CVE 查询和 OS 指纹识别均通过 IPv6 工作。接受方括号表示法以便从浏览器 URL 复制粘贴。
- **服务数据库** — 约 200 个常见端口及其名称和描述
- **风险评分** — 基于现实世界暴露风险对每个开放端口进行 HIGH / MEDIUM / LOW 评级
- **实时终端 UI** — 进度条 + 实时更新的开放端口表 + 扫描期间的事件日志
- **多格式输出** — Rich 终端表格、JSON、CSV、独立 HTML
- **CIDR 支持** — 扫描 `192.168.1.0/24`,自动展开
- **隐蔽模式** — 单线程,3 秒超时,减少线路上的噪声
- **Top N 端口** — 跳过 65535 全端口扫描,专注于重要端口
- **Python API** — `await porthawk.scan(...)` 用于编程使用
## 架构
```
flowchart TD
CLI["cli.py"]
API["api.py"]
SCAN["scanner.py"]
FP["fingerprint.py"]
PRED["predictor.py"]
SDB["service_db.py"]
CVE["cve.py"]
HP["honeypot.py"]
TH["throttle.py"]
SYN["syn_scan.py"]
EXC["exceptions.py"]
REP["reporter.py"]
OUT_JSON["JSON"]
OUT_CSV["CSV"]
OUT_HTML["HTML"]
OUT_TERM["Terminal"]
CLI --> PRED
CLI --> SCAN
CLI --> CVE
CLI --> HP
CLI --> TH
CLI --> SYN
API --> SCAN
SCAN --> TH
API --> CVE
API --> EXC
SCAN --> FP
SCAN --> SDB
FP --> REP
SDB --> REP
CVE --> REP
HP --> REP
REP --> OUT_JSON
REP --> OUT_CSV
REP --> OUT_HTML
REP --> OUT_TERM
```
## 安装
```
pip install porthawk
```
带 ML 端口优先级排序:
```
pip install porthawk[ml]
```
带 SYN 扫描支持:
```
pip install porthawk[syn]
```
或从源码安装:
```
git clone https://github.com/JakobBartoschek/porthawk
cd porthawk
pip install .
```
**Docker:**
```
docker build -t porthawk .
docker run --rm porthawk scan -t 192.168.1.1 --common
# SYN scan 需要 NET_RAW capability
docker run --rm --cap-add=NET_RAW porthawk scan -t 192.168.1.1 --common --syn
```
## 使用方法
**扫描单个主机的前 100 个端口:**
```
porthawk -t 192.168.1.1 --common
```
**服务版本检测 + OS 指纹识别:**
```
porthawk -t 192.168.1.1 --common --banners --os
```
**CVE 查询 — 开放端口上实际可利用的内容:**
```
porthawk -t 192.168.1.1 --common --banners --cve
```
**保存为 JSON 和 HTML:**
```
porthawk -t 192.168.1.1 -p 1-1024 --banners --cve -o json,html
```
**扫描 /24 网络,前 50 个端口:**
```
porthawk -t 192.168.1.0/24 --top-ports 50
```
**带自定义超时的全端口扫描:**
```
porthawk -t scanme.nmap.org --full --timeout 2.0 --threads 200
```
**带 ML 端口排序的隐蔽模式 — 可能开放的端口优先:**
```
porthawk -t 10.0.0.1 --common --stealth --smart-order
```
**检查目标是否看起来像蜜罐:**
```
porthawk -t 10.0.0.1 --common --banners --honeypot
```
**自适应扫描 — 自动提升并发:**
```
porthawk -t 192.168.1.1 -p 1-1024 --adaptive
```
**半开 SYN 扫描(需要 admin/root + Scapy 或 Linux):**
```
sudo porthawk -t 192.168.1.1 --common --syn
```
**Slow & Low — 红队规避模式:**
```
sudo porthawk -t 192.168.1.1 --common --slow-low
```
**带 5 秒抖动的 XMAS 扫描:**
```
sudo porthawk -t 192.168.1.1 -p 80,443 --evasion-type xmas --jitter 5.0
```
**诱饵扫描 — 隐藏在虚假源 IP 中:**
```
sudo porthawk -t 192.168.1.1 --common --slow-low --decoys "1.2.3.4,5.6.7.8"
```
**被动 OS 指纹识别 — 来自 SYN-ACK 的 TCP 协议栈分析:**
```
sudo porthawk -t 192.168.1.1 --common --passive-os
```
**UDP 扫描 — 协议感知,默认为前 20 个 UDP 端口:**
```
# 带协议特定 payloads 的 Top 20 UDP ports
porthawk -t 192.168.1.1 --udp
# 仅限特定 ports
porthawk -t 192.168.1.1 --udp -p 53,123,161,1900
# 较慢网络 —— 增加 timeout
porthawk -t 192.168.1.1 --udp --timeout 3.0
```
**比较两次扫描 — 查看 Monday 和 Friday 之间的变化:**
```
# PortHawk JSON 和 Nmap XML 均可
porthawk diff scan_monday.json scan_friday.json
# Include 未发生变化的 ports(默认 omitted —— 通常是 noise)
porthawk diff scan_a.json scan_b.json --show-stable
# 如果出现任何新 open ports 则以 code 1 Exit(在 CI 中有用)
porthawk diff baseline.json current.json --exit-on-new
# 仅显示新 ports
porthawk diff baseline.json current.json --only-new
# 将 diff 保存为 JSON
porthawk diff scan_a.json nmap_output.xml -o diff_report.json
# 混合 formats —— 比较旧的 PortHawk scan 和新的 Nmap run
porthawk diff last_month.json nmap -oX current.xml 192.168.1.1; porthawk diff last_month.json current.xml
```
**直接加载 Nmap XML(编程方式):**
```
from porthawk import load_results, compute_diff
old = load_results("baseline.json") # PortHawk JSON
new = load_results("nmap_output.xml") # Nmap -oX
diff = compute_diff(old, new, label_a="baseline", label_b="current")
print(f"New open ports: {len(diff.new_ports)}")
for change in diff.new_ports:
print(change.describe())
```
**Web 仪表盘 — 无需 CLI,适用于 Windows/macOS/Linux:**
```
pip install porthawk[dashboard]
# Windows —— 双击 start_dashboard.bat,或:
python start_dashboard.py
# macOS / Linux:
./start_dashboard.sh
# 或:porthawk-dashboard
```
在 `http://localhost:8501` 打开。输入目标,点击 **⚡ Quick Scan — Start!**,结果会在几秒钟内出现。开放端口在发现时立即显示在表格中 — 无需等待完整扫描完成。
**您可以在仪表盘中执行的操作(完整 CLI 同等功能):**
- **⚡ Quick Scan 预设** — 一键设置常用端口、0.5 秒超时、300 线程、关闭所有丰富功能。如果已输入目标,扫描立即开始。无需第二次点击。
- **实时结果** — 开放端口在发现时立即出现在表格中,进度条显示已检查 X/Y 端口。适用于所有扫描持续时间。
- **5 种扫描模式** — TCP、UDP、Stealth、SYN (root)、Evasion (root)
- **Evasion 设置** — TCP 标志类型(SYN/FIN/NULL/XMAS/ACK/Maimon)、抖动、数据包分片、诱饵 IP
- **丰富功能** — Banner、OS 检测、CVE 查询、自适应速度、蜜罐检测、被动 OS 指纹识别
- **智能端口排序** — 基于 ML 的重新排序,将可能开放的端口放在首位
- **结果标签页** — OS Banner、蜜罐徽章、每个端口的 CVE 展开器、TTL 列
- **图表标签页** — 风险分布、热门服务、主机×风险热力图、延迟图表
- **图谱标签页** — PyVis 网络图(`pip install pyvis`),按风险颜色编码
- **Diff 标签页** — 比较两个扫描文件(PortHawk JSON 或 Nmap XML)
- **导出标签页** — 下载 JSON、CSV、HTML 或 SARIF 报告
**针对高风险端口的 Slack/Discord 警报:**
```
# 一次性
porthawk scan -t 10.0.0.1 --common --slack-webhook https://hooks.slack.com/services/…
# 通过 env vars(添加到 .bashrc / CI secrets)
export PORTHAWK_SLACK_WEBHOOK=https://hooks.slack.com/services/…
export PORTHAWK_DISCORD_WEBHOOK=https://discord.com/api/webhooks/…
porthawk scan -t 10.0.0.1 --common
```
如果没有高风险发现,则不会触发任何操作。每次扫描一条消息。
**禁用实时 UI(用于脚本、管道、CI):**
```
porthawk -t 192.168.1.1 --common --no-live
```
**设置 NVD_API_KEY 以消除速率限制(在 nvd.nist.gov 免费获取):**
```
NVD_API_KEY=your-key porthawk -t 192.168.1.1 --common --cve --banners
```
**终端输出示例(带 `--banners --cve`):**
```
PortHawk — scanning 192.168.1.1 (1 host, 100 ports, TCP)
┏━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Port ┃ State ┃ Service ┃ Risk ┃ Banner ┃ Top CVE ┃
┡━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 22/tcp │ open │ ssh │ MEDIUM │ SSH OpenSSH_8.9p1 │ CVE-2023-38408 (9.8) │
│ 80/tcp │ open │ http │ LOW │ server: nginx/1.24 │ CVE-2023-44487 (7.5) │
│ 443/tcp │ open │ https │ LOW │ HTTP 200 │ — │
│ 3306/tcp │ open │ mysql │ MEDIUM │ MySQL 8.0.33 │ CVE-2023-22005 (4.9) │
│ 6379/tcp │ open │ redis │ HIGH │ Redis 7.0.11 │ CVE-2022-0543 (10.0) │
└───────────┴──────────┴────────────┴──────────┴────────────────────┴──────────────────────────┘
Open: 5 / 100 scanned
```
## Python API
PortHawk 可作为库使用。无需 CLI。
```
import asyncio
import porthawk
# 带 banners 和 CVE lookup 的 Full scan
results = asyncio.run(porthawk.scan(
"192.168.1.1",
ports="common",
banners=True,
cve_lookup=True,
))
for r in results:
version = r.service_version or "unknown version"
top_cve = r.cves[0]["cve_id"] if r.cves else "—"
print(f"{r.port}/{r.protocol} {r.service_name} {version} {top_cve}")
```
```
# Context manager —— 同一 target,多次 scans
async with porthawk.Scanner("192.168.1.1", timeout=2.0) as scanner:
web = await scanner.scan(ports="80,443,8080,8443", banners=True)
infra = await scanner.scan(ports="22,3306,5432,6379", cve_lookup=True)
```
```
# 生成 report 并 export
report = porthawk.build_report("192.168.1.1", results)
html_path = porthawk.reporter.save_html(report)
```
```
# 检查 host 是否像 honeypot
hp = porthawk.score_honeypot(results)
print(f"{hp.verdict} score={hp.score:.2f} confidence={hp.confidence}")
for ind in hp.indicators:
print(f" [{ind.weight:.2f}] {ind.name}: {ind.description}")
```
```
# Half-open SYN scan(需要 root/admin)
results = asyncio.run(porthawk.syn_scan_host("192.168.1.1", [22, 80, 443], timeout=1.0))
print(porthawk.get_syn_backend()) # e.g. "scapy 2.5.0" or "raw socket (Linux)"
```
```
# Slow & Low evasion scan —— red-team preset(需要 root/admin)
cfg = porthawk.slow_low_config()
cfg.decoys = ["1.2.3.4", "5.6.7.8"] # optional: add decoy IPs
results = asyncio.run(
porthawk.evasion_scan_host("192.168.1.1", [22, 80, 443], config=cfg, max_concurrent=2)
)
# custom config —— 带有 10s max jitter 和 IP fragmentation 的 XMAS scan
cfg = porthawk.EvasionConfig(scan_type="xmas", max_delay=10.0, fragment=True)
results = asyncio.run(porthawk.evasion_scan_host("192.168.1.1", [80, 443], config=cfg))
```
```
# Passive OS fingerprinting —— 分析一个 SYN-ACK response(需要 root/admin 或 Scapy)
match = porthawk.passive_os_scan("192.168.1.1")
if match:
print(f"{match.os_family} {match.os_detail} confidence={match.confidence}")
# e.g. "Windows Windows 10 / 11 / Server 2019+ confidence=HIGH"
# 从 raw packet bytes 分类 OS(例如来自你自己的 capture)
raw_pkt = bytes(...) # raw IP+TCP bytes
match = porthawk.fingerprint_os(raw_pkt)
# 仅 TTL fallback —— 无需 privileges,始终为 LOW confidence
match = porthawk.ttl_only_os(64) # → "Linux/Unix"
```
```
# UDP scan —— 协议特定 payloads,ICMP unreachable 检测
results = asyncio.run(
porthawk.udp_scan_host("192.168.1.1", ports=[53, 123, 161, 1900], timeout=2.0)
)
for r in results:
print(r.port, r.state, r.banner)
# e.g. 53 OPEN "DNS"
# e.g. 123 OPEN "NTP stratum=2 refid=GPS"
# 默认 top 20 UDP ports(DNS, NTP, SNMP, NetBIOS, SSDP, IKE, mDNS, ...)
ports = porthawk.get_udp_top_ports()
results = asyncio.run(porthawk.udp_scan_host("192.168.1.1", ports=ports))
```
完整 API 参考:[`docs/api.md`](docs/api.md)
## GitHub Action
[](https://github.com/marketplace/actions/porthawk-security-scan)
在任何 GitHub Actions 工作流中运行 PortHawk。开放端口作为代码扫描警报出现在 **Security 标签页** 中。
```
# .github/workflows/port-scan.yml
name: Port Scan
on:
schedule:
- cron: '0 6 * * 1' # every Monday at 06:00
workflow_dispatch:
permissions:
security-events: write # needed for SARIF upload
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Scan staging server
uses: jakobbartoschek/porthawk@v1.4.0
with:
target: ${{ secrets.STAGING_HOST }}
ports: common
fail-on-ports: '21,23,3389' # fail if FTP, Telnet, or RDP is open
- name: Scan with UDP
uses: jakobbartoschek/porthawk@v1.4.0
with:
target: ${{ secrets.STAGING_HOST }}
scan-mode: udp
timeout: '2.0'
output-formats: html
```
该操作自动将扫描报告上传为工作流构件,并将 SARIF 文件推送到 Security 标签页。无需额外步骤。
**输入:**
| Input | Default | Description |
|-------|---------|-------------|
| `target` | — | IP、主机名或 CIDR(必填) |
| `ports` | `common` | `common`、`full`、范围或列表 |
| `scan-mode` | `tcp` | `tcp`、`udp`、`syn`、`stealth` |
| `timeout` | `1.0` | 每端口超时(秒) |
| `threads` | `100` | 最大并发连接数 |
| `output-formats` | — | `html`、`csv` 或 `html,csv` |
| `upload-sarif` | `true` | 推送到 GitHub Security 标签页 |
| `upload-artifacts` | `true` | 上传报告作为构件 |
| `fail-on-ports` | — | 如果开放则导致工作流失败的端口 |
**输出:** `open-ports`、`open-count`、`report-path`、`sarif-path`
## 输出示例 (JSON)
```
{
"metadata": {
"target": "192.168.1.1",
"scan_time": "2026-03-26T14:30:00",
"total_ports": 100,
"open_ports": 5,
"protocol": "tcp",
"version": "0.9.0",
"timeout": 1.0,
"max_concurrent": 500
},
"results": [
{
"host": "192.168.1.1",
"port": 22,
"protocol": "tcp",
"state": "open",
"banner": "SSH OpenSSH_8.9p1",
"service_name": "ssh",
"service_version": "OpenSSH_8.9p1",
"risk_level": "MEDIUM",
"os_guess": "Linux/Unix",
"ttl": 64,
"latency_ms": 0.8,
"cves": [
{
"cve_id": "CVE-2023-38408",
"cvss_score": 9.8,
"severity": "CRITICAL",
"description": "Remote code execution in ssh-agent...",
"published": "2023-07-19",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2023-38408"
}
]
}
]
}
```
## MITRE ATT&CK 映射
| Technique | ID | Description |
|-----------|-----|-------------|
| Network Service Discovery | [T1046](https://attack.mitre.org/techniques/T1046/) | TCP/UDP 端口扫描以识别开放服务 |
| Active Scanning: Scanning IP Blocks | [T1595.001](https://attack.mitre.org/techniques/T1595/001/) | 跨 IP 块的 CIDR 范围扫描 |
| Gather Victim Host Info: Client Configurations | [T1592.004](https://attack.mitre.org/techniques/T1592/004/) | 通过 TTL 进行 OS 指纹识别,基于 Banner 的版本检测 |
## 测试
```
# 安装 test dependencies
pip install -r requirements-dev.txt
# 带 coverage 运行 tests
pytest tests/ --cov=porthawk --cov-report=term-missing
# 运行特定 test file
pytest tests/test_scanner.py -v
# 以 short output 运行
pytest tests/ --tb=short
```
覆盖率目标:所有模块 **>90%**。
所有网络调用均为模拟 — 测试在没有任何真实连接的情况下运行。
## 路线图
- [x] 通过 NVD API 对检测到的服务/版本进行 CVE 查询
- [x] 版本感知的服务检测(SSH、FTP、MySQL、Redis 等)
- [x] 通过逻辑回归进行 ML 端口优先级排序
- [x] 带 TTL 的持久化 CVE 磁盘缓存
- [x] 蜜罐检测 — 针对 Cowrie、Dionaea、Conpot、T-Pot 的基于评分的检测
- [x] 自适应扫描速度 — AIMD 并发控制与 RFC 6298 RTT 平滑
- [x] SYN 扫描 — 通过 Scapy 或原始套接字的半开 TCP
- [x] IDS/IPS 规避 — Slow & Low 模式:IP 分片、抖动、诱饵、自定义 TCP 标志- [x] 被动 OS 指纹识别 — 来自 SYN-ACK 的 TCP 协议栈分析,基于规则 + KNN 分类器
- [x] UDP 扫描 — 特定协议 Payload、ICMP 不可达检测、8 种协议
- [x] GitHub Action — `uses: jakobbartoschek/porthawk@v1.0.0`,SARIF 到 Security 标签页,构件上传
- [x] Nmap XML 导入和差异/比较模式 — `porthawk diff a.json b.xml`,新增/消失/变更检测
- [x] Web 仪表盘 — Streamlit,`pip install porthawk[dashboard]`,适用于所有平台的一键启动器
- [x] 针对高风险开放端口的 Slack 和 Discord webhook 警报 — `--slack-webhook`、`--discord-webhook`、环境变量、仪表盘面板
- [x] IPv6 支持 — 通过 IPv6 的 TCP/UDP/Banner/CVE/OS、方括号表示法、CIDR 前缀展开
## 贡献
有关设置说明、分支命名、代码风格以及如何编写优秀的 PR,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 法律声明
PortHawk 仅用于 **授权渗透测试**。
在扫描之前,您必须获得目标所有者的书面许可。
未经授权的端口扫描可能违反 CFAA(美国)、Computer Misuse Act(英国)、§202a StGB(德国)以及您所在司法管辖区的同等法律。
有关完整的法律免责声明,请参阅 [DISCLAIMER.md](DISCLAIMER.md)。
## 许可证
MIT 许可证 — 详见 [LICENSE](LICENSE) 文件。
标签:Apex, Banner抓取, Claude, CVE检测, HTML报告, Kubernetes, Python, Qt框架, TCP扫描, 只读文件系统, 密码管理, 异步扫描器, 插件系统, 操作系统指纹识别, 数据统计, 无后门, 服务识别, 机器学习, 端口扫描, 纯Python, 网络安全, 计算机取证, 请求拦截, 逆向工具, 隐私保护