zuedev/NodeJS-PortScanner

GitHub: zuedev/NodeJS-PortScanner

一款轻量级的 Node.js 端口扫描器,支持 TCP/UDP 扫描、服务指纹识别及多种格式的报告导出,用于网络审计与安全学习。

Stars: 0 | Forks: 0

# 🔍 NodeJS-PortScanner 一个快速、轻量级的端口扫描器,带有服务指纹识别功能,使用 Node.js 构建。专为网络管理员和安全学习者设计,用于审计自己的系统。 ## ⚠️ 法律免责声明 **仅扫描您拥有或获得明确书面授权的系统。** 未经授权的端口扫描可能会违反《计算机欺诈和滥用法》(美国)、《滥用法案》(英国)以及您所在司法管辖区的同等法律。对于任何滥用行为,作者不承担任何责任。 ## ✨ 功能 - ⚡ **并发扫描**,带有可配置的连接限制 - 🌐 **TCP 和 UDP** 扫描 (`--protocol tcp|udp`) - 🎯 **支持端口范围** (例如 `1-1024`, `80,443,8080`) - 🔎 **服务指纹识别** — 通过 banner grabbing 识别常见服务 - ⏱️ **可配置的超时时间**,适用于响应缓慢或被过滤的主机 - 🛡️ **速率限制** 以减少网络噪音 (`--rate`) - 📊 **清晰的表格输出**,可选择导出为 JSON 或 HTML - 🪶 **零重型依赖** — 使用 Node 内置的 `net` 和 `dgram` 模块 ## 🐳 使用 Docker 运行(推荐) 运行 NodeJS-PortScanner 最快的方法是使用 GitHub Container Registry 上的预构建镜像 —— 无需安装 Node.js 或克隆仓库。镜像名称后面的任何参数都会直接传递给扫描器: ``` docker run --rm ghcr.io/zuedev/nodejs-portscanner --host example.com --ports 1-1024 docker run --rm ghcr.io/zuedev/nodejs-portscanner --help ``` ### 扫描宿主机自身的网络 默认情况下,容器从其自身隔离的网络命名空间进行扫描。在 **Linux** 上,共享宿主机网络可以访问宿主机自身的接口或 `localhost`: ``` docker run --rm --network host ghcr.io/zuedev/nodejs-portscanner --host 127.0.0.1 --ports 1-1024 ``` ### 保存 JSON 报告 挂载一个可写目录并将报告写入其中: ``` docker run --rm -v "${PWD}:/data" ghcr.io/zuedev/nodejs-portscanner -h example.com -p 1-1024 -o /data/results.json # 在 Linux 上,添加 --user "$(id -u):$(id -g)" 以便该文件归您所有。 ``` ### 自行构建镜像 在仓库的克隆副本中: ``` docker build -t nodejs-portscanner . docker run --rm nodejs-portscanner --host example.com --ports 1-1024 ``` ## 📦 从源码安装 ``` git clone https://github.com/zuedev/nodejs-portscanner.git cd nodejs-portscanner npm install ``` 或者全局安装: ``` npm install -g . ``` ## 🚀 用法 ### 基础扫描 ``` node scanner.js --host 192.168.1.1 --ports 1-1024 ``` ### 扫描特定端口 ``` node scanner.js --host example.com --ports 22,80,443,8080 ``` ### 扫描 UDP 端口 ``` node scanner.js --host 192.168.1.1 --protocol udp --ports 53,123,161 ``` UDP 是无连接的,因此对于从不回复的端口,将被报告为 `open|filtered` (开放或被防火墙过滤),而不是 `open`。对于常见服务(DNS、NTP)会发送特定的探测包 以促使它们做出响应。 ### 调整并发和超时 ``` node scanner.js --host 10.0.0.5 --ports 1-65535 --concurrency 200 --timeout 1500 ``` ### 限制扫描速率 ``` node scanner.js --host 192.168.1.1 --ports 1-1024 --rate 50 ``` 限制所有工作线程每秒启动的新探测数量,从而减少网络噪音和对目标的负载。默认无限制。 ### 将结果导出为 JSON ``` node scanner.js --host 192.168.1.1 --ports 1-1024 --output results.json ``` ### 将结果导出为 HTML 报告 ``` node scanner.js --host 192.168.1.1 --ports 1-1024 --output report.html ``` 格式将根据文件扩展名进行选择:`.html`(或 `.htm`)会写入一个独立且带有样式的 HTML 报告,您可以在任何浏览器中打开;任何其他扩展名则写入 JSON。Banner 文本经过了 HTML 转义,因此即使扫描了不受信任的主机,打开报告也是安全的。 ## ⚙️ 选项 | 标志 | 别名 | 描述 | 默认值 | | --------------- | ----- | ---------------------------------------------------------------- | --------- | | `--host` | `-h` | 目标主机名或 IP 地址(必填) | — | | `--ports` | `-p` | 端口范围或逗号分隔的列表 | `1-1024` | | `--protocol` | `-P` | 传输协议 (`tcp` 或 `udp`) | `tcp` | | `--concurrency` | `-c` | 最大并发连接数 | `100` | | `--timeout` | `-t` | 连接超时时间(毫秒) | `2000` | | `--rate` | `-r` | 每秒启动的最大新探测数 | unlimited | | `--output` | `-o` | 将结果导出到文件(`.html` → HTML 报告,否则为 JSON) | none | | `--help` | — | 显示帮助菜单 | — | ## 📋 示例输出 ``` Scanning 192.168.1.1 (ports 1-1024)... PORT STATE SERVICE 22/tcp open SSH (OpenSSH 8.9) 80/tcp open HTTP (nginx 1.18.0) 443/tcp open HTTPS 3306/tcp open MySQL Scan complete: 4 open ports found in 3.2s ``` ## 🛠️ 工作原理 NodeJS-PortScanner 使用 Node 内置的 `net.Socket` 尝试与目标端口建立 TCP 连接。对于每个开放的端口,它会: 1. 在配置的超时时间内建立连接。 2. 通过读取初始服务器响应数据来尝试 **banner grabbing**。 3. 将 banner 与指纹数据库进行匹配以识别服务。 并发通过连接池进行管理,以避免使目标或宿主机的文件描述符限制过载。 UDP 扫描 (`--protocol udp`) 使用 Node 的 `dgram` 模块。由于 UDP 没有握手过程,每个端口会根据目标的响应进行分类: - 一个 **数据报回复** → `open` - 一个 **ICMP 端口不可达** 错误 → `closed` - 直到超时都 **保持静默** → `open|filtered`(开放或被防火墙过滤) ## 🗺️ 路线图 - [x] 带有连接池的并发 TCP 扫描 - [x] 通过 banner grabbing 进行服务指纹识别 - [x] 端口范围和列表 (`1-1024`, `80,443,8080`) - [x] JSON 导出 - [x] 由本地 mock 服务器支持的测试套件 - [x] UDP 扫描支持 - [ ] 可配置的指纹数据库(基于 JSON) - [ ] CIDR 范围扫描(例如 `192.168.1.0/24`) - [x] 速率限制以减少网络噪音 - [x] HTML 报告生成 ## 🧪 测试 ``` npm test ``` 测试使用本地 mock 服务器来验证扫描逻辑,无需进行外部网络调用。 ## 📄 许可证 该项目基于 Unlicense 授权 —— 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。 ## 🙋 作者 由 [zuedev](https://github.com/zuedev) 构建,作为其实践安全学习作品集的一部分。
标签:GNU通用公共许可证, MITM代理, Node.js, Scrypt密钥派生, 插件系统, 数据可视化, 数据统计, 暗色界面, 服务指纹识别, 端口扫描, 网络工具, 自定义脚本, 请求拦截