ArtinDoroudi/port-scanner

GitHub: ArtinDoroudi/port-scanner

这是一个基于Python标准库构建的多线程TCP端口扫描器,具备Banner抓取与服务指纹识别功能。

Stars: 0 | Forks: 0

# 端口扫描器 ![Port Scanner Demo](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/76bbc3c503152544.gif) ![Tests](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/327d4b7993152545.svg) 一个支持 banner 抓取和服务指纹识别的多线程 TCP 端口扫描器, 使用 Python 构建,仅依赖标准库。 我构建这个工具是为了深入理解服务如何在网络上暴露自身—— 包括 socket 层面的 TCP 握手是什么样的、像 Nmap 这样的工具如何识别运行中的服务, 以及线程如何改变 I/O 密集型任务的性能表现。 ## 演示 ``` ██████╗ ██████╗ ██████╗ ████████╗ ███████╗ ██████╗ █████╗ ███╗ ██╗ ██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝ ██╔════╝██╔════╝██╔══██╗████╗ ██║ ██████╔╝██║ ██║██████╔╝ ██║ ███████╗██║ ███████║██╔██╗██║ ██╔═══╝ ██║ ██║██╔══██╗ ██║ ╚════██║██║ ██╔══██║██║╚████║ ██║ ╚██████╔╝██║ ██║ ██║ ███████║╚██████╗██║ ██║██║ ╚███║ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚══╝ TCP Connect Scanner with Banner Grabbing Only scan hosts you own or have explicit permission to scan. Target : scanme.nmap.org Ports : 1-1024 (1024 ports) Threads : 100 [OPEN] 22 [OPEN] 80 Scan complete in 1.44s Grabbing banners from open ports... ============================================================ Port Scanner Report ============================================================ Target : scanme.nmap.org Scanned at : 2026-04-06T08:11:28.195875+00:00 Ports scanned: 1024 Duration : 1.44s Open ports : 2 ============================================================ PORT STATE SERVICE BANNER -------------------------------------------------------- 22 open SSH SSH-2.0-OpenSSH_6.6.1p1 Ubuntu 80 open HTTP HTTP/1.1 200 OK ============================================================ ``` ## 安装 ``` git clone https://github.com/ArtinDoroudi/port-scanner.git cd port-scanner pip install -r requirements.txt ``` 需要 Python 3.11+。除了用于终端颜色的 `colorama` 外,没有第三方依赖。 ## 使用方法 ``` # 扫描最常用端口 python -m scanner --target 127.0.0.1 # 使用 JSON 输出扫描自定义范围 python -m scanner --target 192.168.1.1 --ports 1-1024 --output json # 仅扫描特定端口 python -m scanner --target example.com --ports 22,80,443 # 将结果保存到文件 python -m scanner --target 10.0.0.1 --ports 1-1024 --save results.json # 使用更多线程进行更快的扫描 python -m scanner --target 192.168.1.1 --ports 1-65535 --threads 500 # 使用速率限制进行更安静的扫描(20 次/秒) python -m scanner --target 192.168.1.1 --rate-limit 0.05 # 仅显示开放端口,跳过 banner 抓取 python -m scanner --target 192.168.1.1 --open-only --no-banner ``` ### 所有选项 | Flag | 默认值 | 描述 | |---|---|---| | `--target`, `-t` | 必填 | 要扫描的主机名或 IP | | `--ports`, `-p` | `1-1024` | 端口范围:`1-1024`、`80` 或 `22,80,443` | | `--threads`, `-n` | `100` | 并发线程数 | | `--timeout` | `1.0` | 每个端口的超时时间(秒) | | `--rate-limit` | `0` | 线程间的延迟(秒) | | `--output`, `-o` | `text` | 输出格式:`text` 或 `json` | | `--save`, `-s` | — | 将报告写入文件而非 stdout | | `--open-only` | — | 仅显示开放端口 | | `--no-banner` | — | 跳过 banner 抓取 | ## 工作原理 该扫描器执行 **TCP connect 扫描**。对于每个端口,它会尝试完成完整的三次握手——SYN、SYN-ACK、ACK。握手完成表示端口开放。收到 RST 回复表示端口关闭。无响应表示被过滤(防火墙正在丢弃数据包)。 多线程使其速度很快。端口扫描属于 I/O 密集型任务:CPU 几乎所有时间都在等待网络回复。Python 的 GIL 会在阻塞 I/O 期间释放,因此 100 个线程可以同时各自等待响应——扫描 1,024 个端口只需约 1.5 秒,而非约 17 分钟。 一旦识别出开放端口,扫描器会再次连接并读取服务首先发送的内容——即其 banner。SSH 会立即自我声明(`SSH-2.0-OpenSSH_8.9`)。HTTP 需要发送探测请求(`HEAD / HTTP/1.0`)来获取响应。Banner 内容会与已知签名进行匹配;如果没有匹配项,则会在 IANA 注册表中查找该端口号。 **包含图表的完整技术深度解析:** [artindoroudi.github.io/port-scanner](https://ArtinDoroudi.github.io/port-scanner) ## 项目结构 ``` port-scanner/ ├── scanner/ │ ├── __main__.py # CLI interface (argparse) │ ├── core.py # TCP scanning + threading │ ├── banner.py # Banner grabbing + service fingerprinting │ └── reporter.py # JSON and text output ├── tests/ │ └── test_scanner.py ├── docs/ │ └── index.html # Technical explainer (GitHub Pages) ├── examples/ │ └── sample_output.json └── .github/ └── workflows/ └── tests.yml ``` ## 局限性 - 仅支持 TCP connect 扫描——不支持 UDP,不支持 SYN(半开)扫描 - 不支持 IPv6 - Banner 抓取仅读取前 1024 字节 - 服务指纹识别使用的是小型签名列表,而非 Nmap 的完整探测数据库 ## 道德声明 仅扫描您拥有或已获得明确书面许可的主机。 未经授权的端口扫描在您的司法管辖区可能属于违法行为。 本工具仅供学习和授权的安全评估使用。 ## 参考资料 - [RFC 793](https://www.rfc-editor.org/rfc/rfc793) — TCP 规范 - [Nmap 参考指南](https://nmap.org/book/man.html) - [IANA 端口注册表](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
标签:Banner抓取, DNS解析, Nmap, Python, Scrypt密钥派生, Socket, Socket编程, TCP Connect, 云存储安全, 子域名枚举, 并发扫描, 开源项目, 插件系统, 数据统计, 无后门, 服务器安全, 服务指纹识别, 标准库, 端口扫描, 系统安全, 网络安全, 网络工具, 网络扫描, 虚拟驱动器, 逆向工具, 隐私保护