hassoun3h/SCANN3R
GitHub: hassoun3h/SCANN3R
一款基于 Python 标准库的 TCP 端口变化检测扫描器,通过持久化历史扫描结果并自动比对差异,帮助安全团队及时发现目标暴露面的端口状态变更。
Stars: 0 | Forks: 0
# SCANN3R
一款用于变更检测的 TCP 端口扫描器。普通的端口扫描器只能告诉你*当前*有哪些端口处于开放状态,而 SCANN3R 能够告诉你自上次扫描以来发生了哪些*变化*。专为需要掌握目标暴露面变化(如新端口开放、服务消失或防火墙规则悄然更改)的安全团队而构建。
## 为什么开发这个工具
nmap 用于回答“这台主机的状态是什么?”而 SCANN3R 用于回答“自上次检查以来,这台主机有什么不同?”它会存储每一次扫描的结果,并将针对同一目标的每一次新扫描与上一次进行比对,一旦任何端口的状态发生改变(开放、关闭或被过滤),就会通过邮件发送警报。
典型应用场景:
- 监控您自身的外部攻击面,防范意外变化
- 及时发现因配置错误而暴露的服务
- 跟踪验证修复措施是否真正关闭了某个端口并保持关闭状态
## 环境要求
- Python 3.8 或更高版本
- 执行扫描、存储、差异对比或邮件警报功能无需任何第三方依赖包(仅使用标准库)
## 安装说明
```
git clone https://github.com/hassoun3h/SCANN3R.git
cd SCANN3R
```
就这些。无需编译任何内容,也无需安装任何依赖。
## 快速开始
运行您的第一次扫描:
```
python3 scann3r.py scan --target scanme.nmap.org --ports 1-1024
```
对任何目标的首次扫描都会建立一个基线:扫描结果会被保存,但此时还没有可对比的历史数据。稍后再次运行相同的命令,SCANN3R 就会报告在此期间发生的任何变化。
## 命令
### `scan` — 运行扫描并检测变化
```
python3 scann3r.py scan --target [options]
```
| 选项 | 默认值 | 描述 |
|--------|---------|-------------|
| `--target` | *(必填)* | 要扫描的主机名或 IP |
| `--ports` | `1-1024` | 要扫描的端口。支持范围、列表或两者混合:`1-1024`, `22,80,443`, `1-100,8080` |
| `--timeout` | `1.0` | 单个端口的连接超时时间(秒) |
| `--workers` | `100` | 并发线程数 |
| `--db` | `scann3r.db` | 要使用的 SQLite 数据库文件 |
示例:以更短的超时时间扫描一组特定端口:
```
python3 scann3r.py scan --target 10.0.0.5 --ports 22,80,443,3389,8080 --timeout 0.5
```
### `history` — 显示目标的近期扫描记录
```
python3 scann3r.py history --target 10.0.0.5 --limit 10
```
### `targets` — 列出您扫描过的所有目标
```
python3 scann3r.py targets
```
## 邮件警报
当扫描检测到变化时,SCANN3R 可以通过邮件发送摘要。其配置完全通过环境变量读取,因此代码中不会包含任何凭证信息:
```
export SCANN3R_SMTP_HOST="smtp.gmail.com"
export SCANN3R_SMTP_PORT="587"
export SCANN3R_SMTP_USER="you@example.com"
export SCANN3R_SMTP_PASSWORD="your-app-password"
export SCANN3R_ALERT_FROM="you@example.com"
export SCANN3R_ALERT_TO="soc-team@example.com"
```
如果未设置这些变量,扫描功能仍会正常运行;邮件发送步骤会被直接跳过。警报是非致命的:如果无法连接到邮件服务器,扫描结果仍会被保存,同时该失败情况会被记录到日志中。
特别是对于 Gmail,您需要使用应用专用密码(开启 2FA 后,常规账户密码将无法用于 SMTP)。
## 了解端口状态
SCANN3R 区分三种状态,这三种状态之间的任何转换都会被视为一次变化:
- **open** — 有服务正在主动监听
- **closed** — 主机可达,但该端口上没有任何程序(连接被拒绝)
- **filtered** — 超时前未收到响应,通常是防火墙丢弃了数据包
区分 closed(关闭)和 filtered(被过滤)非常重要。一个端口的状态从 `open -> filtered` 通常意味着防火墙添加了新规则,这与服务单纯停止运行(`open -> closed`)所释放的信号截然不同。
## 负责任使用须知
仅扫描您拥有或已获得明确书面授权进行测试的系统。在某些司法管辖区,未经授权的端口扫描可能是违法行为。本工具仅用于对您自身的基础设施进行防御性监控。
## 许可证
请参阅 LICENSE 文件。
标签:Python, 插件系统, 攻击面监控, 数据统计, 无后门, 端口扫描