HANSAJA122/Network-Scanner-Vulnerability-Analyzer
GitHub: HANSAJA122/Network-Scanner-Vulnerability-Analyzer
一个面向作品集的 Python 网络扫描与暴露分析工具,提供多线程端口扫描、横幅抓取与服务指纹识别。
Stars: 0 | Forks: 0
# NetScan — 网络扫描器与暴露分析器
NetScan 是一个 **面向作品集** 的 Python 工具,支持 **多线程 TCP 连接扫描**、**横幅抓取**、**轻量级服务指纹识别** 以及 **基于常见风险端口和协议提示的启发式暴露警告**。
## 功能
- 扫描 **IPv4 地址** 或 **主机名**(存在多个时优先使用第一个 IPv4 A 记录)
- **灵活的端口语法**:`80`、`22,443`、`1-1024`、`8000-8010,8443`
- **并发工作线程**(线程池)实现快速扫描
- **横幅捕获**,在相关场景下进行简单的 HTTP 与 TLS 探测
- **基于知名端口的服务猜测**,并结合横幅正则匹配
- **启发式警告**(仅作信息提示,非 CVE 验证)
- **丰富的 CLI 表格与进度输出**
- **JSON 导出**,便于自动化与仪表盘集成
- **可选 Web 仪表盘**(Flask + 图表),支持 KPI 卡片、严重性分布与服务分析
## 快速开始
```
cd "Network Scanner"
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
```
### 扫描示例
```
# 默认扫描:主机上的 1–1024 端口
python main.py scan example.com
# 指定端口并保存 JSON
python main.py scan 192.0.2.10 -p 22,80,443,3389,445 -o scan_results/web.json
# 更快的连接探测、更高并发、无横幅
python main.py scan 198.51.100.5 -p 1-65535 --connect-timeout 0.4 -j 400 --no-banner
# 静默模式(在脚本中很有用);设置 -o 时仍写入 JSON
python main.py scan scanme.nmap.org -p 1-1024 -q -o scan_results/scanme.json
```
模块形式:
```
python -m netscan scan 127.0.0.1 -p 22,80,443
```
### Web 仪表盘
```
python main.py dashboard --host 127.0.0.1 --port 8765 --results-dir scan_results
```
打开打印的 URL,选择报告,或 **上传** 使用 `-o` 导出的 JSON 文件。
## 1. 如何运行
| 命令 | 用途 |
|------|------|
| `python main.py scan <目标> [选项]` | 执行端口扫描 |
| `python main.py dashboard [选项]` | 启动本地报告查看器 |
常用标志:
| 标志 | 含义 |
|------|------|
| `-p`, `--ports` | 端口列表/范围(默认 `1-1024`) |
| `--connect-timeout` | TCP 连接超时(秒) |
| `--banner-timeout` | 每次读取横幅的超时时间 |
| `-j`, `--threads` | 最大并发线程数 |
| `--no-banner` | 仅报告开启/关闭,跳过横幅读取 |
| `-o`, `--output` | 将结构化 JSON 写入文件 |
| `-q`, `--quiet` | 减少控制台输出 |
## 2. 扫描原理
1. **目标解析**(`netscan/resolver.py`):若目标不是 IPv4 字面量,工具将使用 `getaddrinfo`(IPv4, TCP)解析,并扫描返回的 **第一个** 地址(若存在多个 A 记录会打印警告)。
2. **端口列表解析**(`netscan/portspec.py`):将 `-p` 参数展开为 `[1, 65535]` 范围内唯一且排序的整数列表。
3. **TCP 连接扫描**(`netscan/scanner.py`):对每个端口,工作线程尝试 `socket.create_connection。成功建立握手即标记该端口为 **开启**。
4. **横幅抓取**(`netscan/banner.py`):在开启端口上(除非使用 `--no-banner`),读取初始字节;必要时对常见 Web 端口发送小型 **HTTP/1.0** `GET /` 请求,或对 `443`/`8443` 端口执行 **TLS** 握手(证书验证已故意禁用,仅用于发现场景)。
5. **服务猜测**(`netscan/services.py`):将横幅与简单正则匹配;否则使用 **IANA 风格** 的知名端口映射提供标签。猜测结果为 **概率性** 匹配。
6. **警告**(`netscan/vulnerabilities.py`):通过独立规则将 **端口 + 服务 + 横幅提示** 映射到信息性严重性层级。此过程 **非认证测试**,也 **非漏洞验证**。
并发通过 `ThreadPoolExecutor` 实现,每个端口相互独立,受 `-j` 参数限制。
## 3. 结果解读
### CLI 表格
- **开放端口表**:每行表示一个在连接超时内完成 TCP 握手的端口。**服务** 为尽力而为的标签,**横幅** 为经过简化的文本预览(通常为协议问候的第一行或 HTTP 头部)。
- **启发式警告**:突出显示 **常见暴露模式**(如 Telnet 明文传输、公共 RDP、无认证类 Redis 风险、SMB 暴露等)。这些是 **审查起点**,而非入侵或配置错误的证明。
### JSON 报告(`-o`)
顶层字段:
- `meta`:扫描参数、时间戳、解析目标与计数
- `open_ports`:仅包含完成 TCP 连接的端口
- `warnings`:去重后的启发式条目,含 `severity`、`title` 与 `detail`
**关闭与过滤说明**:本工具不执行原始 SYN 隐蔽扫描;未开放的结果可能是 **关闭**(连接拒绝)或 **过滤**(超时/防火墙丢弃)。两者均视为“未开启”并从 `open_ports` 中排除。
## 项目结构
```
netscan/
__init__.py
__main__.py # python -m netscan
cli.py # argparse + Rich UI
config.py # defaults
resolver.py # DNS / IPv4 handling
portspec.py # -p parsing
scanner.py # threaded connect + orchestration
banner.py # banner/TLS/HTTP helpers
services.py # fingerprinting heuristics
vulnerabilities.py # warning rules
web_app.py # Flask dashboard
report.py # JSON serialization
main.py # convenience entrypoint
requirements.txt
README.md
```
## 依赖要求
- Python 3.10+
- 请参考 `requirements.txt`(包含 `rich`、`flask`)
## 设计限制
- **仅支持 IPv4 TCP**;当前版本无 UDP、SCTP 或 IPv6 支持
- **连接扫描** 在日志与防火墙中可见
- **无利用、无凭据测试、无认证检查**
- **服务与风险标签** 仅为启发式结果,请使用合适工具与流程进行验证
## 许可证
MIT —— 适用于作品集使用;若复用模块请保留署名。
标签:Flask仪表盘, HTTP探测, JSON导出, KPI卡片, Python网络工具, Scrypt密钥派生, SEO关键词, TCP连接扫描, TLS探测, URL短链接分析, Web仪表盘, 云存储安全, 多线程扫描, 安全风险预警, 并发工作, 开源安全工具, 数据统计, 暴露分析, 服务指纹识别, 服务探测, 横幅抓取, 端口扫描, 端口范围扫描, 网络安全评估, 网络扫描, 网络暴露监控, 逆向工具, 逆向工程平台