prane-jay/port-scanner
GitHub: prane-jay/port-scanner
基于 Python 和 Scapy 的多线程 TCP 端口扫描器,支持 SYN 隐秘扫描、Banner 抓取与 JSON 结果导出。
Stars: 0 | Forks: 0
# Python 端口扫描器
一个轻量级、多线程的 CLI TCP 端口扫描器,支持 SYN 隐秘扫描、banner 抓取和 JSON 导出。使用 Python 和 Scapy 构建。
## 功能
* Connect Scan:使用 socket 进行完整的 TCP 握手,并包含 banner 抓取和服务检测
* SYN Scan:使用 Scapy 进行半开扫描,永远不完成 TCP 握手,从而降低隐秘扫描时的噪音
* 多线程:在 connect 模式下使用 ThreadPoolExecutor 进行快速并发扫描
* Banner 抓取:尝试在开放端口上检索服务 banner
* 服务检测:将常见端口号解析为服务名称
* JSON 导出:将扫描结果保存到 JSON 文件
* 清晰的输出:以有组织的彩色格式将结果显示在终端上,包括实时进度条
## 演示

## 要求
- Python 3.8+
- [Scapy](https://scapy.net/) — 用于 SYN 扫描模式
- [tqdm](https://github.com/tqdm/tqdm) — 进度条
- [colorama](https://github.com/tartley/colorama) — 彩色终端输出
安装依赖项:
```
pip install scapy tqdm colorama
```
## 操作系统说明
| 功能 | Linux | macOS | Windows |
|---|---|---|---|
| Connect scan | ✅ 无需特殊权限 | ✅ 无需特殊权限 | ✅ 无需特殊权限 |
| SYN scan | ✅ 需要 `sudo` | ✅ 需要 `sudo` | ✅ 需要管理员权限 |
**Linux / macOS:** 使用 `sudo python scanner.py ...` 运行 SYN 扫描
**macOS:** Scapy 需要 `libpcap`。大多数 macOS 版本都预装了它。如果 Scapy 报错,请通过 Homebrew 安装:`brew install libpcap`
**Windows:** 在管理员终端中运行 SYN 扫描。Windows 上的 Scapy 还需要安装 [Npcap](https://npcap.com/)。
## 用法
```
python scanner.py --target --ports [options]
```
### 参数
| 参数 | 必填 | 描述 |
|---|---|---|
| `--target` | 是 | 目标 IP 地址或主机名 |
| `--ports` | 是 | 端口范围,格式为 `START-END`(例如 `1-1024`) |
| `--mode` | 否 | 扫描模式:`connect`(默认)或 `syn` |
| `--threads` | 否 | connect 模式下的线程数(默认:100) |
| `--output` | 否 | 将 JSON 输出保存到文件名(例如 `results.json`) |
### 示例
**Connect scan(默认):**
```
python scanner.py --target 127.0.0.1 --ports 1-1024
```
**SYN 隐秘扫描:**
```
sudo python scanner.py --target 192.168.1.1 --ports 1-1024 --mode syn
```
**将结果保存为 JSON:**
```
python scanner.py --target 127.0.0.1 --ports 1-1024 --output results.json
```
**自定义线程数:**
```
python scanner.py --target 192.168.1.1 --ports 1-65535 --threads 200
```
## 输出
### 终端
```
Scanning ports on 192.168.1.1
Ports : 1-2048
Mode : syn
Scanning: 100%|████████████████████████| 2048/2048 [00:25<00:00, 78.00port/s]
53/TCP domain [OPEN]
80/TCP http [OPEN]
443/TCP https [OPEN]
---- Scan Complete ----
3 Open | 2045 Closed/Filtered
```
### JSON (`--output results.json`)
```
{
"target": "192.168.1.1",
"ports": "1-2048",
"mode": "syn",
"timestamp": "2025-01-15T14:32:10.123456",
"open_ports": [
{ "port": 53, "service": "domain", "banner": "" },
{ "port": 80, "service": "http", "banner": "" },
{ "port": 443, "service": "https", "banner": "" }
]
}
```
## 工作原理
### Connect Scan
使用 Python 的 `socket` 库在每个端口上尝试完整的 TCP 三次握手。如果连接成功,则该端口是开放的。为了提高速度,使用 `ThreadPoolExecutor` 并发执行。尝试通过发送 HTTP HEAD 请求并读取响应来进行 banner 抓取。
### SYN Scan
使用 Scapy 发送原始 TCP SYN 数据包并检查响应:
- **SYN-ACK** → 端口开放,回复 RST 以避免完成握手
- **RST-ACK** → 端口关闭
- **无响应** → 端口被过滤
-
端口顺序是随机的,以降低被检测的可能性。访问原始 socket 需要 root/管理员权限。
## 法律免责声明
本端口扫描器仅供授权的安全测试和教育目的使用。在扫描任何网络、主机或设备之前,您有全责确保已获得系统所有者的明确许可。未经授权的端口扫描可能违反地方、州、联邦或国际法律。本工具的作者对因使用本工具而引起的任何滥用、损害或法律后果不承担任何责任。使用本软件即表示您同意仅扫描您拥有的或已获得适当授权进行测试的系统。
请负责任地使用。遵守道德规范。
标签:Python, Scapy, 域名侦查, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 逆向工具, 隐私保护