ThiagoFernandez/port-scanner
GitHub: ThiagoFernandez/port-scanner
基于 Python socket 和多线程的命令行端口扫描器,能够检测端口的开放、关闭与过滤状态,抓取服务 Banner 并将结果导出为 JSON。
Stars: 0 | Forks: 0
# portScanner
使用 Python 构建的命令行端口扫描器。可检测开放、关闭和过滤的端口,捕获服务 banner 并将结果导出为 JSON。
Python 网络安全路线图第一阶段项目 —— 专注于 `socket`、多线程和网络错误处理。
## 功能
- **三种端口状态:** `OPEN`、`CLOSED`、`FILTERED`
- **多线程** 使用 `ThreadPoolExecutor` —— 并行扫描数百个端口
- **Banner 抓取** —— 捕获每个开放端口上的服务响应
- **服务识别** —— 将端口号映射为服务名称(`ssh`、`http`、`ftp` 等)
- **彩色输出** —— 绿色表示开放,红色表示关闭,黄色表示过滤
- **导出为 JSON** —— 自动添加时间戳并保存结果
- **多目标支持** —— 接受一个包含主机的 `.txt` 文件(每行一个)
## 安装
```
git clone https://github.com/tu-usuario/portScanner.git
cd portScanner
pip install colorama
```
## 使用方法
```
python scanner.py
```
### 示例
```
# 按 hostname 扫描主机
python scanner.py scanme.nmap.org 1 1024
# 按 IP 扫描
python scanner.py 192.168.1.1 1 1024
# 扫描 localhost
python scanner.py 127.0.0.1 1 9999
# 从文件扫描多个主机
python scanner.py hosts.txt 1 1024
```
### 多主机文件 (`hosts.txt`)
```
scanme.nmap.org
192.168.1.1
192.168.1.254
```
## 输出
### 终端
```
Target: scanme.nmap.org
Rango: 1-1024
=== Escaneando scanme.nmap.org ===
[+] 22 OPEN
[-] 23 CLOSED
[?] 25 FILTERED
[+] 80 OPEN
...
--- RESULTADO ---
Host: scanme.nmap.org (45.33.32.156)
Puertos escaneados: 1024
Puertos abiertos: 2
Lista de puertos abiertos:
- 1) Port: 22 - Service: ssh - Banner: SSH-2.0-OpenSSH_6.6.1p1
- 2) Port: 80 - Service: http - Banner: HTTP/1.1 200 OK
[+] Resultados guardados en results_scanme.nmap.org_2026-04-24_21-00-00.json
```
### JSON 输出
```
{
"raw_host": "scanme.nmap.org",
"host": "45.33.32.156",
"starting_port": 1,
"ending_port": 1024,
"scanned_ports": 1024,
"open_ports": [
{
"port": 22,
"service": "ssh",
"banner": "SSH-2.0-OpenSSH_6.6.1p1"
},
{
"port": 80,
"service": "http",
"banner": "HTTP/1.1 200 OK\r\nServer: Apache..."
}
],
"time": 4.32
}
```
## 工作原理
### 状态检测
`socket.connect_ex()` 尝试建立 TCP 连接并解析响应:
| 主机响应 | 状态 | 含义 |
|--------------------|--------|-------------|
| SYN-ACK (代码 0) | `OPEN` | 有服务正在监听 |
| RST (`ECONNREFUSED`) | `CLOSED` | 端口存在但没有服务 |
| 无响应 (超时) | `FILTERED` | 防火墙正在阻止数据包 |
### Banner 抓取
对于每个开放的端口,扫描器会尝试两种策略:
1. 直接监听 —— 某些服务(如 SSH、FTP)在连接时会发送其 banner
2. 如果没有响应,则发送一个 `HEAD / HTTP/1.1` —— 促使服务做出响应(对 HTTP 很有用)
连接超时(0.5秒)与 banner 超时(1.0秒)是独立的,这允许捕获响应缓慢的 banner,而不会影响扫描速度。
### 线程
使用 `ThreadPoolExecutor(max_workers=200)` 结合 `as_completed()`,以便在每个线程完成时实时处理结果。
## 依赖项
| 库 | 安装 | 用途 |
|---------|------------|-----|
| `colorama` | `pip install colorama` | 跨平台终端颜色输出 |
| `socket` | stdlib | TCP 连接、DNS 解析、服务 |
| `concurrent.futures` | stdlib | ThreadPoolExecutor |
| `errno` | stdlib | 跨平台错误代码 |
| `json`, `os`, `sys`, `time`, `datetime` | stdlib | 通用工具 |
## 法律声明
仅在您拥有或获得明确授权的网络和系统上使用此扫描器。未经授权的端口扫描在某些司法管辖区可能是违法的。
如需合法练习:[scanme.nmap.org](http://scanme.nmap.org) 是由 Nmap 团队专门为此目的维护的服务器。
## 已知限制
- 不支持 IPv6
- `max_workers=200` 可能会使慢速网络饱和 —— 如果出现误报 FILTERED,请适当减少该值
- 文件中的主机是按顺序扫描的
- Banner 会被截断至 1KB
*Python 网络安全路线图的一部分*
标签:Banner Grabbing, colorama, DNS查询工具, JSON导出, Python, Python网络安全, Qt框架, socket编程, ThreadPoolExecutor, 开源安全工具, 插件系统, 无后门, 无线安全, 服务识别, 端口扫描器, 网络安全, 赛博安全, 逆向工具, 逆向工程平台, 隐私保护