ankurdas-cyberphantom/python-port-scanner
GitHub: ankurdas-cyberphantom/python-port-scanner
一个基于 Python 的多线程端口扫描器,提供横幅抓取、服务检测与 CSV 导出,适用于安全教学与授权测试。
Stars: 1 | Forks: 0
# 🔍 高级端口扫描器
一个多线程 Python 端口扫描器,支持横幅抓取、服务检测、带颜色的输出和可选的 CSV 导出。适用于教育用途和授权渗透测试。
## ⚠️ 免责声明
## 📋 功能特性
- ⚡ 通过 `ThreadPoolExecutor` 实现多线程扫描
- 🎯 在开放端口上抓取横幅
- 🔎 服务检测(内置映射 + `socket.getservbyport` 回退)
- 🌈 彩色终端输出(通过 `colorama`)
- 📊 清晰的摘要表格(通过 `tabulate`)
- 💾 带表头的 CSV 导出
- 🖥️ 主机名解析(IP ↔ 主机名)
- 📈 扫描期间的实时进度条
## 🛠️ 环境要求
**Python 3.6+**
安装依赖:
```
pip install -r requirements.txt
```
或手动安装:
```
pip install colorama tabulate
```
| 包名 | 用途 | 是否必需 |
|---|---|---|
| `colorama` | 彩色终端输出 | 可选 |
| `tabulate` | 格式化摘要表格 | 可选 |
## 🚀 使用方法
### 交互模式(推荐初学者使用)
```
python advanced_port_scanner.py
```
系统会提示你输入:
```
Enter target IP (default 127.0.0.1): 192.168.1.1
Enter port range (e.g. 1-1000): 1-1000
Max threads (default 100): 100
Save to file? (leave blank to skip): results.csv
```
### CLI / Argparse 模式
```
python advanced_port_scanner.py -t -p - [--threads N] [-o output.csv]
```
**参数说明:**
| 标志 | 长形式 | 描述 | 默认值 | 是否必需 |
|---|---|---|---|---|
| `-t` | `--target` | 目标 IP 地址或主机名 | `127.0.0.1` | 否 |
| `-p` | `--ports` | 端口范围(`起始-结束` 格式) | — | **是** |
| `--threads` | `--threads` | 最大并发线程数 | `100` | 否 |
| `-o` | `--output` | 将结果保存为 `.csv` 文件 | — | 否 |
**示例:**
```
# 扫描本地主机端口 1–1000
python advanced_port_scanner.py -p 1-1000
# 使用自定义线程数扫描特定 IP
python advanced_port_scanner.py -t 192.168.1.1 -p 1-65535 --threads 200
# 扫描并保存结果到文件
python advanced_port_scanner.py -t 10.0.0.5 -p 20-445 -o results.csv
# 使用主机名扫描
python advanced_port_scanner.py -t scanme.nmap.org -p 1-100
```
## 📤 输出内容
### 扫描过程中的终端输出
```
=== Advanced Python Port Scanner ===
Target : 127.0.0.1 (localhost)
Range : 1 - 1000 (1000 ports)
Threads : 100
Started : 2025-01-15 22:34:01
[OPEN] Port 22 | Service: SSH | Banner: OpenSSH_9.0
[OPEN] Port 80 | Service: HTTP | Banner: No banner
[OPEN] Port 443 | Service: HTTPS | Banner: No banner
```
### 扫描完成后的摘要表格
```
--- Scan Summary ---
Port Service Banner
------ --------- ----------------
22 SSH OpenSSH_9.0
80 HTTP No banner
443 HTTPS No banner
3 open port(s) found.
Time taken: 0:00:04.213
```
### 使用 `-o` 参数时的 CSV 输出
```
port,service,banner
22,SSH,OpenSSH_9.0
80,HTTP,No banner
443,HTTPS,No banner
```
## 🗂️ 内置服务映射
扫描器默认识别以下常用端口。未知端口将回退到 `socket.getservbyport`。
| 端口 | 服务 |
|---|---|
| 21 | FTP |
| 22 | SSH |
| 23 | Telnet |
| 25 | SMTP |
| 53 | DNS |
| 80 | HTTP |
| 110 | POP3 |
| 135 | RPC |
| 139 | NetBIOS |
| 143 | IMAP |
| 443 | HTTPS |
| 445 | SMB |
| 3306 | MySQL |
| 3389 | RDP |
| 5432 | PostgreSQL |
| 6379 | Redis |
| 8080 | HTTP-Alt |
| 8443 | HTTPS-Alt |
| 27017 | MongoDB |
## 📁 项目结构
```
python-port-scanner/
│
├── advanced_port_scanner.py # Advanced multithreaded scanner
├── port_scanner.py # Original basic scanner
├── requirements.txt # Python dependencies
└── README.md # This file
```
## 🧠 工作原理
1. **解析** 目标主机名为 IP 地址(如果可能,进行反向解析)
2. **创建** 带有 `ThreadPoolExecutor` 的线程池 —— 避免无限制线程导致的操作系统级线程耗尽
3. **每个线程** 对分配的端口尝试 TCP `connect_ex()`
4. **成功时** —— 获取服务名称并发送 `Hello\r\n` 探针以捕获横幅
5. **进度条** 在终端中实时更新扫描进度
6. **结果** 通过 `Lock` 线程安全地收集,按端口排序,并以摘要表格形式打印
## 👤 作者
**CyberPhantom** — MCA 学生 | 网络安全爱好者 | 漏洞赏金猎人
- HackerOne / Intigriti: `inti_youknowwhoiam_`
- HTB: Active VIP Member
## 📜 许可证
本项目采用 MIT 许可证授权 —— 详见 [LICENSE](LICENSE)。
标签:Argparse, Banner抓取, Colorama, IP解析, Linux工具, Python, Qt框架, Socket编程, Tabulate, ThreadPoolExecutor, 主机名解析, 二进制发布, 云存储安全, 交互模式, 开源工具, 彩色输出, 情报分析, 教育用途, 数据统计, 无后门, 服务识别, 端口扫描, 端口探测, 终端美化, 网络扫描, 网络诊断, 表格输出, 进度条, 逆向工具