Tauqeerkhan187/Mini-nessus-web
GitHub: Tauqeerkhan187/Mini-nessus-web
一个轻量级的基于 Web 的漏洞扫描器,将安全评估流程与后端工程实践相结合。
Stars: 0 | Forks: 0
# Mini-Nessus Web
Mini-Nessus Web 是一个轻量级的 **基于 Web 的漏洞扫描器**,采用 **Flask**、**SQLite**、**SQLAlchemy**、**Celery** 和自定义 Python 扫描引擎构建。
它作为一个实践性网络安全作品集项目,用于展示:
- 网络侦察
- 服务指纹识别
- 基于规则的漏洞检测
- CVSS 风格风险评分
- 异步扫描执行
- PDF 报告生成
- 简洁的 Web 仪表板设计
该项目灵感来源于 Nessus 等工具的工作流,但有意保持架构简单、可读且易于扩展。
## 功能
- 用于启动和查看扫描的 Web 仪表板
- 使用 Celery 的异步后台扫描
- 自定义多线程 TCP 端口扫描器
- 使用横幅和默认端口逻辑进行服务识别
- 支持的服务识别:
- SSH
- HTTP
- FTP
- MySQL
- PostgreSQL
- Redis
- Telnet
- SMTP
- 基于规则的漏洞检查
- 对选定服务进行本地 CVE/版本匹配
- CVSS 风格逐项发现评分
- 扫描级风险聚合
- 使用 Paramiko 的认证 SSH 检查
- 快速和完整扫描配置文件
- 使用 ReportLab 生成 PDF 报告
- 严重性分布和扫描时间线图表
- 通过 SQLAlchemy 实现的 SQLite 持久化
- 使用允许的 CIDR 验证的实验室仅安全限制
## 我为什么构建这个项目
许多学生安全项目止步于“它能扫描端口”。
我希望这个项目更进一步,表现得像一个真实产品:
1. 从 Web 应用启动扫描
2. 识别暴露的服务
3. 基于真实规则生成发现项
4. 使用现实评分进行优先级排序
5. 将所有信息存储在数据库中
6. 在可用仪表板中呈现结果
7. 导出专业的 PDF 报告
这个项目帮助我将 **进攻性安全概念** 与 **后端工程**、**风险优先级** 和 **报告** 结合起来。
## 技术栈
### 后端
- Flask
- Flask-SQLAlchemy
- SQLite
- Celery
- Redis
### 扫描 / 安全逻辑
- 自定义 Python 端口扫描器
- 横幅抓取与服务指纹识别
- 基于规则的漏洞检查
- CVSS 风格评分
- Paramiko 用于认证 SSH 检查
### 报告 / 前端
- ReportLab
- Jinja2 模板
- Chart.js
- 自定义样式表
## 项目结构
```
Mini-nessus-web-main/
├── .gitignore
├── README.md
├── requirements.txt
├── main.py
│
├── app/
│ ├── .gitignore
│ ├── __init__.py
│ ├── celery_app.py
│ ├── models.py
│ ├── routes.py
│ └── tasks.py
│
├── scanner/
│ ├── banners.py
│ ├── checks.py
│ ├── engine.py
│ ├── portscan.py
│ ├── scoring.py
│ └── ssh_checks.py
│
├── reporting/
│ └── pdf.py
│
├── static/
│ └── style.css
│
└── templates/
├── base.html
├── index.html
├── new_scan.html
└── scan.html
```
## 架构
该项目遵循清晰的流程:
* **`scanner/portscan.py`**
线程化 TCP 端口发现
* **`scanner/banners.py`**
横幅抓取、服务猜测、版本提取
* **`scanner/checks.py`**
基线暴露规则和本地 CVE/版本匹配
* **`scanner/scoring.py`**
CVSS 风格增强与扫描级风险聚合
* **`scanner/ssh_checks.py`**
使用提供的凭据进行认证 SSH 检查
* **`scanner/engine.py`**
编排完整扫描流程
* **`app/tasks.py`**
使用 Celery 异步运行扫描,存储发现项并生成 PDF
* **`app/routes.py`**
仪表板、扫描创建、扫描查看、PDF 下载、仪表板 API
* **`reporting/pdf.py`**
构建最终的 PDF 评估报告
这将扫描逻辑、评分、存储和 UI 职责分离,而不是把应用变成一个巨大的混乱。
## 工作原理
1. 用户从仪表板启动扫描
2. Flask 在 SQLite 中创建一条 `Scan` 记录
3. Celery 领取后台任务
4. 扫描引擎验证目标是否在允许的 CIDR 范围内
5. 端口扫描器识别开放端口
6. 横幅抓取和服务识别确定可能的服务
7. 基于规则的检查生成发现项
8. CVSS 风格评分增强发现项并计算扫描级风险
9. 结果存储在数据库中
10. 生成 PDF 报告
11. 仪表板显示发现项和趋势
## 当前检测 / 发现逻辑
### 基线暴露检查
扫描器当前会对以下易受攻击的服务触发发现项:
* Telnet 暴露
* FTP 暴露
* MySQL 暴露
* PostgreSQL 暴露
* Redis 暴露
* SSH 暴露
* HTTP 暴露
### 版本 / CVE 匹配
本地 CVE 匹配逻辑当前包含对以下服务的选定检查:
* OpenSSH
* Apache HTTP 服务器
* nginx
* vsFTPd
* ProFTPD
* Redis
* MySQL
### 认证 SSH 检查
当提供有效的 SSH 凭据时,扫描器可以执行额外的检查,例如:
* 密码认证是否启用
* 是否允许 root 登录
* X11 转发是否启用
* 是否允许空密码
* 是否启用协议 1
* 缺少或薄弱的防火墙配置
* 待处理的安全更新
* 危险的文件系统权限
* 除 root 外的 UID 0 用户
## 风险评分
该项目最初使用简单的加权严重性方法,后来升级为 **CVSS 风格评分模型**。
每个发现项可以存储:
* 严重性
* CVSS 风格分数
* CVSS 向量
* 影响说明
* 修复建议
* 可选的 CVE
* 规则键
每个扫描存储:
* `risk_score`
* `risk_level`
这使得输出比单纯的原始严重性标签更有用。
## 前端
Web 界面包含:
* 现代仪表板布局
* 扫描历史记录表
* 严重性分布图表
* 扫描时间线图表
* 新建扫描表单
* 扫描详情页面
* PDF 下载按钮
前端使用 Flask 模板、共享基础布局、Chart.js 和自定义样式表构建。
## PDF 报告
每个完成的扫描都会生成一个包含以下内容的 PDF 报告:
* 目标信息
* 扫描元数据
* 风险分数和风险级别
* 执行摘要
* 扫描的端口 / 开放端口
* 按严重性划分的发现项数量
* 详细发现项
* 修复建议
* 免责声明部分
## 数据模型
### `Scan`
存储高级扫描元数据:
* 目标
* 端口选择
* 配置文件
* 状态
* 时间戳
* 错误信息
* 风险分数 / 风险级别
* Celery 任务 ID
* SSH 认证元数据
### `Finding`
存储发现项级数据:
* 端口
* 服务
* 横幅
* 版本
* 问题
* 严重性
* 修复建议
* CVE
* CVSS 分数
* CVSS 向量
* 影响
* 规则键
## 要求
来自 `requirements.txt`:
* Flask
* Flask-SQLAlchemy
* Celery
* redis
* reportlab
* python-dotenv
* packaging
* paramiko
## 安装
## 1) 克隆仓库
```
git clone https://github.com/TauqeerKhan187/mini-nessus-web.git
cd mini-nessus-web
```
## 2) 创建并激活虚拟环境
### Linux / macOS
```
python3 -m venv venv
source venv/bin/activate
```
### Windows
```
python -m venv venv
venv\Scripts\activate
```
## 3) 安装依赖
```
pip install -r requirements.txt
```
## 4) 启动 Redis
Celery 使用 Redis 作为消息代理和结果后端。
### Linux
```
redis-server
```
确保 Redis 在以下地址运行:
```
redis://localhost:6379/0
```
## 5) 配置环境变量
在项目根目录创建 `.env` 文件:
```
FLASK_SECRET=dev
REDIS_URL=redis://localhost:6379/0
ALLOWED_CIDR=192.168.56.0/24
HOST=0.0.0.0
PORT=5000
```
### 重要
`ALLOWED_CIDR` 用作 **实验室安全限制**。
目标地址不在此网络范围内将被拒绝。
## 6) 启动 Flask 应用
```
python main.py
```
## 7) 启动 Celery 工作进程
在同一个项目目录中打开另一个终端并运行:
```
celery -A app.celery_app.celery worker --loglevel=info
```
## 用法
1. 在浏览器中打开仪表板
2. 点击 **新建扫描**
3. 输入:
* 目标 IP
* 可选自定义端口
* 扫描配置文件(`quick` 或 `full`)
* 可选 SSH 用户名/密码
4. 启动扫描
5. 等待后台任务
6. 打开扫描详情页面
7. 查看发现项、CVSS 风格分数和修复建议
8. 下载 PDF 报告
## 扫描配置文件
### 快速
针对较小的常用端口列表,以更快的速度提供反馈。
### 完整
扫描端口 `1-1024` 以及多个其他常用服务端口。
## 安全 / 注意事项
本项目故意限制在 **实验室环境** 中使用。
扫描器会在扫描前验证目标 IP 是否在 `ALLOWED_CIDR` 范围内。
这意味着它会拒绝扫描允许网络范围之外的目标。
本工具适用于:
* 教育用途
* 本地实验室
* 仅限授权的内部测试
**不要**用于你未拥有或未经明确授权评估的系统。
## 开发过程中的改进
开发期间的关键升级包括:
* 修复 MySQL 和 Redis 检测
* 改进快速 / 完整端口配置文件行为
* 使用 CVSS 风格评分替代简单加权评分
* 添加每个发现项的影响说明
* 添加扫描级风险聚合
* 在数据库中存储 CVSS 字段
* 改进 PDF 布局和清晰度
* 将前端仪表板重新设计为更简洁的仪表板
* 将重复的模板样式移至共享布局 + 样式表
* 为严重性和扫描历史记录添加仪表板图表
## 限制
这仍然是一个轻量级扫描器,并非完整商业漏洞管理平台。
当前限制包括:
* 基于横幅/版本的检查可能产生误报
* 超出 SSH 检查之外没有深入的认证 Linux 审计
* 没有插件市场或动态插件
* 没有用户认证或多用户支持
* 没有调度或重复扫描系统
* 没有资产分组或标签
* 没有 REST API 认证层
* SQLite 适用于本地使用,但不适合大规模部署
## 未来的改进
计划或可能的后续步骤:
* PDF 中的“前三项风险”部分
* 更丰富的 CVE 覆盖
* 更好的认证检查
* JSON / CSV 导出
* 资产清单支持
* 扫描调度
* 多目标支持
* PostgreSQL 部署版本
* 登录 / 用户角色
* 仪表板中的过滤和排序
* 修复跟踪
## 截图
该应用程序包含一个基于 Flask 的现代仪表板,用于启动扫描、查看发现项、跟踪严重性趋势以及导出 PDF 报告。
### 仪表板
显示主要概览,包括严重性分布、扫描时间线和扫描历史记录。

### 新建扫描
启动快速或完整扫描,可选提供 SSH 凭据用于认证检查。

### 扫描详情
显示扫描级风险、优先级排序的发现项、CVSS 风格分数、影响说明和修复建议。

### PDF 报告
导出一个包含执行摘要和详细发现项的干净漏洞评估报告。


技能展示
本项目展示了在以下方面的实践工作:
* Python
* Flask
* SQLAlchemy
* SQLite
* Celery
* Redis
* Paramiko
* 异步任务编排
* 端口扫描
* 服务指纹识别
* 漏洞检测逻辑
* 风险评分
* PDF 生成
* Web 仪表板设计
* 项目架构
## 作者
**TK**
网络安全学生,致力于构建实用的安全工具和适合作品集的项目。
标签:Banner探测, Celery队列, CIDR验证, CVE匹配, CVSS评分, Flask应用, FTP检测, HTTP服务检测, Lab安全限制, MySQL探测, PDF报告, PostgreSQL探测, Redis后端, Redis探测, Scrypt密钥派生, SMTP检测, SQLAlchemy ORM, SQLite数据库, SSH检查, Telnet检测, Web漏洞扫描, 云计算, 内核监控, 加密, 安全仪表盘, 安全工具开发, 安全项目, 开源安全工具, 异步任务, 报告导出, 搜索引擎查询, 数据统计, 服务指纹识别, 漏洞扫描器, 端口扫描, 网络安全, 网络安全学习, 规则引擎, 逆向工具, 逆向工程平台, 隐私保护, 风险聚合