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, 插件系统, 攻击面监控, 数据统计, 无后门, 端口扫描