mayankpathania0/Port-Scanner
GitHub: mayankpathania0/Port-Scanner
一款基于 Python 多线程的零依赖 TCP 端口扫描器,可在数秒内完成上千端口的扫描并提供服务指纹识别。
Stars: 0 | Forks: 1
# 🔍 FastTCP 端口扫描器
## 🖥️ 在线演示(查看实际运行效果)**
在你自己的机器上**不到 5 秒**即可运行:
```
$ python3 port_scanner.py scanme.nmap.org -p 22,80,443 --banners
[*] Starting scan on target: scanme.nmap.org
[*] Scanning 3 ports using multi-threading (50 workers)...
--------------------------------------------------
[+] Port 22 is OPEN
└─ Service info: SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.13
[+] Port 80 is OPEN
└─ Service info: HTTP/1.1 200 OK Server: nginx/1.10.3
[+] Port 443 is OPEN
└─ Service info: HTTP/1.1 400 Bad Request Server: nginx/1.10.3
--------------------------------------------------
[✅] Scan Complete! Found 3 open ports: [22, 80, 443]
==================================================
```
## 📌 问题与解决方案
**问题:**
安全分析师和渗透测试人员需要快速映射攻击面。**按顺序**扫描 65,535 个端口是不切实际的——这需要 **30 多分钟**并会使工作停滞。
**解决方案:**
**FastTCP 端口扫描器**利用 Python 的并发性同时扫描 **50 个端口**。它将耗时 30 分钟的任务缩短至**不到 5 秒**,同时保持准确性,并增加了用于漏洞识别的智能 banner grabbing 功能。
## ✨ 主要功能
| 🚀 **性能** | 🧩 **灵活性** | 🏷️ **智能性** | 🛡️ **可靠性** |
| :--- | :--- | :--- | :--- |
| 50 线程并发扫描 | 扫描 `common` 端口、自定义 `ranges` 或特定 `lists` | 提取服务版本(Apache、OpenSSH、Nginx) | 0.5 秒超时以处理受防火墙保护的主机 |
| 将扫描时间缩短 **~99%** | 零硬编码限制 | 识别过时、易受攻击的软件 | 优雅的错误处理,不会崩溃 |
| 使用 `ThreadPoolExecutor` | 接受 IP 和主机名 | 特定协议探测(HTTP、通用) | **零外部依赖** |
## ⚡ 性能基准测试
以下是在标准家庭网络上的实际速度对比(扫描 1,000 个端口):
| 方法 | 耗时 | Worker 数 |
| :--- | :--- | :--- |
| **顺序扫描**(一次扫描 1 个端口) | ~8 分 20 秒 | 1 |
| **FastTCP 扫描器**(多线程) | **~4.5 秒** | 50 |
| **速度提升** | **快 99.1%** | — |
*此基准测试证明,并发是构建现实世界安全工具的关键。*
## 🛠️ 底层技术
| 组件 | 技术 | 选择原因 |
| :--- | :--- | :--- |
| **语言** | Python 3.7+ | 开发迅速,标准库庞大。 |
| **网络** | `socket`(标准库) | 底层 TCP 控制;精确的握手模拟。 |
| **并发** | `ThreadPoolExecutor` | 安全地管理线程池;避免竞态条件。 |
| **CLI 解析** | `argparse`(标准库) | 专业的标志解析;零第三方冗余。 |
## ⚙️ 安装(零步骤!)
因为该工具**仅使用 Python 的标准库**,所以完全不需要安装任何东西。
```
# 1. Clone the repository
git clone https://github.com/your-username/fast-tcp-scanner.git
cd fast-tcp-scanner
# 2. 立即运行
python3 port_scanner.py 127.0.0.1 -p common
```
## 🎮 命令参考(完整语法)
### 基础语法
```
python3 port_scanner.py
[OPTIONS]
```
### 完整选项表
| 标志 | 类型 | 接受的值 | 默认值 | 描述 |
| :--- | :--- | :--- | :--- | :--- |
| `target` | **参数** | IP(例如 `192.168.1.1`)或主机名(`example.com`) | **必填** | 你要扫描的系统。 |
| `-p, --ports` | 可选 | `common`
`1-1000`
`22,80,443` | `common` | 定义范围。`common` = 前 22 个高风险端口。 |
| `--banners` | 标志 | 无 | `False` | 切换服务指纹识别。显示确切的软件版本。 |
| `-h, --help` | 标志 | 无 | 无 | 显示包含所有选项的帮助菜单。 |
## 🧪 使用场景(实际应用)
以下是安全专业人员在不同环境中使用此工具的方式:
### 场景 1:CTF / 渗透测试
*快速查找目标机器上的易受攻击服务。*
```
python3 port_scanner.py 10.10.10.50 -p common --banners
```
### 场景 2:内部网络审计
*映射公司服务器上的所有开放端口以确保合规。*
```
python3 port_scanner.py 192.168.10.5 -p 1-5000
```
### 场景 3:快速外部侦察
*检查关键 Web 端口是否暴露在互联网上。*
```
python3 port_scanner.py example.com -p 80,443,8443 --banners
```
### 场景 4:本地主机安全基线
*确保你自己的机器没有意外暴露敏感端口。*
```
python3 port_scanner.py 127.0.0.1 -p 1-1024
```
**逐步分解:**
1. **Worker(`scan_single_port`):**
创建一个 TCP socket 并尝试使用 `connect_ex()` 进行连接。如果端口开放则返回 `0`;否则静默失败。
2. **管理器(`scan_ports`):**
使用 `ThreadPoolExecutor` 将所有连接尝试分派给 50 个并发线程。使用 `as_completed()` 在结果完成时进行处理。
3. **指纹识别器(`grab_banner`):**
对于 Web 端口(80、443),它会发送一个 `HTTP HEAD` 请求。
对于其他端口,它会发送一个通用的换行符。
读取响应以提取服务器名称和版本。
## 📋 错误处理与故障排除
| 错误 / 行为 | 原因 | 解决方案 |
| :--- | :--- | :--- |
| `[!] Error: Invalid hostname` | 目标无法通过 DNS 解析。 | 检查拼写。先使用 `ping `。 |
| 脚本在单个端口上挂起 | 防火墙正在静默丢弃数据包(Filtered)。 | 按 `Ctrl+C`。减少扫描范围或增加超时时间。 |
| `[No banner received]` | 服务在显示 banner 前需要身份验证(例如 MySQL)。 | 这是正常的。端口仍然是开放的;只是不够详细。 |
| macOS/Linux 上出现 `Permission denied` | 某些系统限制了对 1024 以下端口的原始 socket 访问。 | 此扫描器使用 TCP Connect,在 macOS 上通常不需要 `sudo`。如果发生这种情况,请尝试 `sudo python3`。 |
## 🗺️ 未来路线图
- [ ] **UDP 扫描** – 增加对 DNS、SNMP 和 NTP 端口发现的支持。
- [ ] **多目标文件输入** – 从 `.txt` 文件扫描整个子网。
- [ ] **导出为 JSON/CSV** – 生成报告以供专业文档记录。
- [ ] **Asyncio 引擎** – 从线程迁移到 async 以进一步降低开销。
## ⚠️ 法律与道德免责声明
## 📜 许可证
在 MIT 许可证下分发。有关更多信息,请参阅 `LICENSE`。
由 Mayank Pathania 用 🔥 构建
标签:Banner抓取, Python, 并发扫描, 插件系统, 数据统计, 无后门, 端口扫描, 逆向工具