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, 开源安全工具, 插件系统, 无后门, 无线安全, 服务识别, 端口扫描器, 网络安全, 赛博安全, 逆向工具, 逆向工程平台, 隐私保护