jaattanisha09/port-scanner-and-banner-grabber

GitHub: jaattanisha09/port-scanner-and-banner-grabber

基于 Python asyncio 的零依赖异步端口扫描器,支持高并发端口检测与服务 banner 抓取。

Stars: 0 | Forks: 0

# 高速异步 Python 端口扫描器与 Banner 抓取工具 一个使用 Python 编写的轻量级、零依赖且极速的端口扫描器与服务 banner 抓取工具。它利用 Python 原生的 `asyncio` 框架来执行数千个并发端口检查,并高效地检索服务器/服务签名。 由于它仅使用 Python 的标准库,**任何人都可以复制/克隆它,并在任何操作系统(Windows、macOS、Linux)上立即运行,无需安装外部依赖**(无需 `pip install`)。 ## 功能 - **异步与并发**:使用 Python `asyncio` 实现极速,利用工作队列模式来控制最大并发量。 - **服务 Banner 抓取**:不仅限于检查端口是否开放;还会尝试获取服务标头和 banner。 - **零依赖**:仅使用标准库模块(`asyncio`、`socket`、`argparse`、`sys`)。 - **健壮的客户端与服务端安全性**: - 优雅地处理超时情况。 - 从突然的 socket 终止(EOF / 连接关闭)中恢复,避免出现空白输出或崩溃。 - 保证在意外网络错误下也能执行完毕。 - **目标与端口的灵活性**:支持单个目标主机或 IP、端口范围(例如 `1-1024`)或逗号分隔的列表(例如 `80,443,8080`)。 ## 工作原理 脚本对每个端口的操作分为两个主要的异步阶段: 1. **连接**:尝试在指定端口上打开与主机的 TCP 连接。 2. **Banner 抓取**: - 如果端口匹配需要客户端主动发起的常见服务(如 HTTP、FTP 或 Telnet),扫描器会发送一个 probe payload。 - 随后在严格的超时限制下等待响应。如果 socket 立即关闭或保持静默,它会将该端口报告为 `Open (No banner retrieved)`。 ## 快速开始 ### 前置条件 您只需在系统上安装 **Python 3.8 或更高版本**。 ### 复制 / 克隆 您可以克隆此仓库,或者直接将 `scanner.py` 文件下载到您的计算机上。 ``` git clone https://github.com/YOUR_USERNAME/YOUR_REPO_NAME.git cd YOUR_REPO_NAME ``` ## 运行扫描器 通过命令行调用此脚本: ``` python scanner.py [options] ``` ### 选项 | 标志 | 长选项 | 默认值 | 描述 | |------|-------------|---------|-------------| | `-p` | `--ports` | `1-1024`| 要扫描的端口范围(例如 `1-1024`)或逗号分隔的列表(例如 `80,443,8080`)。 | | `-t` | `--timeout` | `1.0` | 连接尝试的超时限制(以秒为单位)。 | | `-c` | `--concurrency`| `200` | 并发连接工作线程的数量。 | ### 示例 **扫描目标的默认端口 (1-1024):** ``` python scanner.py 127.0.0.1 ``` **扫描特定的端口列表:** ``` python scanner.py scanme.nmap.org -p 22,80,443 ``` **以自定义超时和更高并发扫描大范围端口:** ``` python scanner.py 192.168.1.1 -p 1-8000 -t 0.5 -c 500 ``` ## 验证与测试(本地) 您可以运行本地测试服务器来验证 banner 抓取功能。测试库中包含一个模拟服务器 `test_server.py`。 ### 1. 启动模拟服务器 模拟服务器会在端口 `9011`(自动发送问候语)和 `9012`(需要客户端发送数据,然后关闭连接)上启动服务。 ``` python test_server.py ``` ### 2. 运行扫描器(在另一个终端中) 针对 localhost 的模拟端口运行扫描器: ``` python scanner.py 127.0.0.1 -p 9011,9012,9013 -t 0.5 ``` ### 预期输出: ``` [*] Scanning target: 127.0.0.1 (127.0.0.1) [*] Starting async scan across 3 ports using 200 concurrent workers... [+] Port 9011 is OPEN --> Banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5 [+] Port 9012 is OPEN --> Banner: Open (No banner retrieved) [*] Scan complete. ``` *(端口 9013 将被识别为已关闭,因此它不会出现在输出中)* ## 操作系统兼容性说明 - **Windows**:在 Windows 上,Python 的 asyncio 实现默认使用 `ProactorEventLoop`,它支持可扩展的 I/O。 - **macOS & Linux**:在 unix-like 循环上完美运行。在 Linux 上,如果您大幅增加并发量(例如超过 1000),请确保系统的文件描述符限制允许此操作(`ulimit -n`)。 ## 许可证 本项目是开源的,基于 [MIT License](LICENSE) 提供。
标签:计算机取证, 逆向工具