chasssis/netrecon
GitHub: chasssis/netrecon
一款用 Python/Flask 构建的网络侦察与漏洞扫描 Web 应用,整合端口扫描、HTTP 头分析、DNS 枚举、WHOIS 查询和 SSL 证书检查等模块,面向授权安全评估与教学场景。
Stars: 1 | Forks: 0
# NetRecon
一个使用 Python 和 Flask 构建的网络侦察与漏洞扫描 Web 应用程序。专为授权的安全评估、渗透测试实验室和网络安全教育而设计。
## 功能
| 模块 | 描述 |
|--------|-------------|
| **IP 信息** | 将目标解析为 IP,并通过 ipapi.co 获取地理位置、ASN、ISP 和时区信息 |
| **端口扫描器** | 多线程 TCP 连接扫描 75 个端口,支持感知协议的 banner grabbing 和风险注释 |
| **HTTP 头分析器** | 获取 HTTP 安全头并给出 A–F 的评分 |
| **WHOIS 查询** | 检索域名注册数据 —— 注册商、创建/过期日期、域名服务器 |
| **DNS 枚举** | 查询 A、AAAA、MX、NS、TXT 和 CNAME 记录;检测 SPF/DMARC 并探测 13 个常见的 DKIM 选择器 |
| **SSL/TLS 检查器** | 验证证书,检查过期时间、协议版本 (TLS 1.2+) 和 SANs |
- 简洁的终端风格 Web 仪表盘
- 非阻塞的后台扫描任务,提供实时进度更新
- 一键将扫描结果导出为 JSON
- 输入验证 —— 阻止私有 IP、localhost 和格式错误的目标
- 速率限制 —— 防止扫描 API 被滥用
- 通过 Python 的 `logging` 模块进行结构化日志记录
- 感知协议的 banner grabbing(在 Web 端口执行 HTTP GET 以获取更丰富的服务器信息)
- 模块化架构 —— 轻松添加新的扫描模块
- 伦理使用声明和负责任的设计
## 演示
```
Target: scanme.nmap.org
Modules: Port Scan, HTTP Headers, DNS, WHOIS
[*] Running Port Scan...
[+] Port Scan complete.
[*] Running WHOIS Lookup...
[+] WHOIS complete.
...
[✓] Scan finished.
```
## 安装
### 前置条件
- Python 3.10+
- pip
### 本地设置
```
# Clone 仓库
git clone https://github.com/yourusername/netrecon.git
cd netrecon
# 创建 virtual environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装 dependencies
pip install -r requirements.txt
# 运行 app
python app.py
```
在浏览器中打开 `http://localhost:5000`
该应用程序默认以生产模式运行。要在本地启用 Flask 的 debug 模式:
```
FLASK_DEBUG=true python app.py
```
### Docker
```
# 使用 Docker Compose 构建并运行
docker-compose up --build
```
或者使用普通 Docker:
```
docker build -t netrecon .
docker run -p 5000:5000 netrecon
```
## 使用说明
1. 输入目标主机名或 IP 地址(例如 `scanme.nmap.org`)
2. 选择要运行的扫描模块
3. 点击 **Execute Scan**
4. 结果将随着每个模块的完成实时显示
5. 点击 **Export JSON** 将完整结果下载为 `.json` 文件
### 输入验证
NetRecon 在每个扫描任务开始前对目标强制执行以下规则:
- 阻止私有 IP 范围(`10.x.x.x`、`172.16–31.x.x`、`192.168.x.x`)
- 阻止环回地址(`127.x.x.x`、`localhost`)
- 拒绝包含无效字符的目标
- 空目标会立即返回错误
### 速率限制
`/api/scan` endpoint 按每个 IP 进行速率限制:
| 时间窗口 | 限制 |
|--------|-------|
| 每分钟 | 10 次请求 |
| 每小时 | 50 次请求 |
| 每天 | 200 次请求 |
## 运行测试
```
# 安装 dev dependencies
pip install -r requirements-dev.txt
# 运行完整 test suite
pytest tests/ -v
```
测试套件涵盖:
- `normalize_target` —— URL 剥离和主机名提取
- `validate_target` —— 阻止私有 IP、拒绝 localhost、字符验证
- `_ssl_warnings` —— 证书过期和已弃用协议检测
- `ReconScanner` 初始化
- 端口扫描器结果结构和总计数(通过 mock 的 sockets)
- HTTP 头评级阈值(A–F)
- 模块常量健全性检查(端口范围、头名称)
## 项目结构
```
netrecon/
├── app.py # Flask application, job management, rate limiting
├── modules/
│ ├── __init__.py
│ └── scanner.py # Core scan modules + input validation
├── templates/
│ └── index.html # Frontend dashboard
├── tests/
│ ├── __init__.py
│ └── test_scanner.py # pytest unit tests (50 tests)
├── Dockerfile
├── docker-compose.yml
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Dev/test dependencies
├── .gitignore
└── README.md
```
## 环境变量
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `FLASK_DEBUG` | `false` | 启用 Flask debug 模式 (`true`/`false`) |
| `PORT` | `5000` | 服务器监听的端口 |
## 扩展 NetRecon
添加新的扫描模块只需三个步骤:
**1. 在 `modules/scanner.py` 的 `ReconScanner` 中添加一个方法:**
```
def my_new_scan(self) -> dict:
logger.debug("My scan starting: target=%s", self.target)
# your logic here
return {"result": "data"}
```
**2. 在 `app.py` 的 `run_scan_job` 中注册它:**
```
if "my_scan" in scan_types:
steps.append(("my_scan", "My Scan Label", scanner.my_new_scan))
```
**3. 在 `index.html` 的表单中添加一个复选框,并在 JavaScript 中添加一个卡片渲染器。**
## 安全考量
- **线程池**设有上限,以避免向目标发起大量连接造成泛洪攻击
- **输入验证**在任何扫描开始前阻止私有/环回地址
- **速率限制**防止 API 被滥用为开放扫描代理
- **Debug 模式**默认关闭;需通过 `FLASK_DEBUG=true` 显式启用
- **SSL 验证**首先尝试;如果 HTTPS 失败则回退到 HTTP
- **无持久化** —— 扫描结果仅存储在内存中,服务器重启后会丢失
## 使用的技术
- **Flask** —— 轻量级 Python Web 框架
- **Flask-Limiter** —— API 速率限制
- **Python `logging`** —— 结构化应用程序日志
- **Python `socket`** —— 原始 TCP 连接扫描和 banner grabbing
- **`concurrent.futures`** —— 100 个 worker 的线程池,用于并行端口扫描
- **`dnspython`** —— DNS 记录解析和 DKIM 选择器探测
- **`python-whois`** —— WHOIS 查询
- **`requests`** —— HTTP 头获取和 IP 地理定位
- **`ssl`** —— 证书检查
- **`ipaddress`** —— 私有 IP 范围验证
- **ipapi.co** —— 免费的 IP 地理位置和 ASN API(无需 key)
- **pytest** —— 单元测试
- **gunicorn** —— 生产级 WSGI 服务器(在 Docker 中使用)
- Vanilla JS + CSS —— 不使用前端框架
## 法律免责声明
本工具仅供**教育目的和授权的安全测试使用**。
作者不对滥用行为承担责任。在扫描您不拥有的任何系统之前,请务必获得书面许可。
## 许可证
MIT —— 详情请参阅 [LICENSE](LICENSE)。
标签:Flask, Python, 内存取证对抗, 安全规则引擎, 实时处理, 插件系统, 无后门, 网络安全, 请求拦截, 逆向工具, 隐私保护