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) 提供。
标签:计算机取证, 逆向工具