mikelobocyber/SniffSnorf
GitHub: mikelobocyber/SniffSnorf
基于 Rust 和 tokio 的异步端口扫描器,内置威胁面分析引擎,能自动识别主机类型、标记危险暴露并将发现映射到 MITRE ATT&CK 技术。
Stars: 0 | Forks: 0
# 🐽 SniffSnorf
**内置威胁面分析的异步端口扫描器。**
大多数端口扫描器只告诉你*哪些端口*是开放的。SniffSnorf 告诉你*这意味着什么*。
扫描完成后,分析引擎会像人类分析师一样读取结果——对主机类型进行指纹识别,用通俗易懂的英语标记危险的暴露情况,并将每个发现映射到 MITRE ATT&CK 技术。你可以将输出直接放入渗透测试报告中。
```
sniffsnorf -a 192.168.1.1 -p 1-1024
```
```
███████╗███╗ ██╗██╗███████╗███████╗███████╗███╗ ██╗ ██████╗ ██████╗ ███████╗
...
🐽 1 host · 1024 ports · 1024 total probes · concurrency 500
HOST PORT SERVICE STATE
─────────────────────────────────────────────────────────────────────────────────
192.168.1.1 22 ssh open
192.168.1.1 80 http open
192.168.1.1 3306 mysql open
192.168.1.1 6379 redis open
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🐽 SNIFFSNORF ANALYSIS · 192.168.1.1
Host type: web server
Surface: 4 open ports
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SUMMARY
192.168.1.1 has 4 open ports and appears to be a web server.
2 high-severity findings present elevated risk.
FINDINGS
[1] HIGH MySQL database port exposed (port 3306)
Ports: 3306
MITRE: T1190
Detail: MySQL (port 3306) is reachable from the network. Databases
should never be directly exposed...
[2] HIGH Redis database port exposed (port 6379)
Ports: 6379
MITRE: T1190
Detail: Redis has no authentication by default and allows arbitrary
data reads, writes, and in some configurations remote code
execution via CONFIG SET...
```
## 安装
```
git clone https://github.com/mikelobocyber/sniffsnorf
cd sniffsnorf
cargo build --release
./target/release/sniffsnorf --help
```
需要 Rust 1.75+(`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`)。
## 用法
```
sniffsnorf [OPTIONS]
Arguments:
IP address, hostname, or CIDR range (e.g. 192.168.1.0/24)
Options:
-p, --ports Port or port range [default: 1-1024]
-c, --concurrency Max concurrent connections [default: 500]
-t, --timeout-ms Connect timeout per port in ms [default: 1000]
-b, --banner Grab service banners from open ports
-a, --analyze Run analyst engine (implies --banner)
-j, --json Output results as newline-delimited JSON
-q, --open-only Only print open ports
-h, --help Print help
```
## 示例
```
# Basic scan — top 1024 ports
sniffsnorf 192.168.1.1
# Full analyst report — the main feature
sniffsnorf -a 192.168.1.1
# Analyst on a subnet — reports one host per IP with open ports
sniffsnorf -a 192.168.1.0/24 -p 22,80,443,3306,5432,6379
# Common attack-surface ports with banners
sniffsnorf -b -p 21,22,23,25,80,443,445,3306,3389,5432,5900,6379,8080,27017 192.168.1.1
# Fast full-range scan
sniffsnorf -p 1-65535 -c 2000 -t 500 10.0.0.1
# JSON output for piping to jq
sniffsnorf -j -p 1-1024 192.168.1.1 | jq 'select(.open == true)'
# JSON with analyst findings (human report to stderr, JSON to stdout)
sniffsnorf -a -j 192.168.1.1
```
## 分析引擎工作原理
扫描完成后,分析引擎会对结果进行三轮分析:
**1. 主机指纹识别**(`analyst.rs: fingerprint_host`)
通过查看开放端口的*组合*来判断这大概是什么类型的主机。开放了端口 445 + 139 + 135 的主机是一台 Windows 机器。开放了端口 2375 的主机是一台 Docker 主机。开放了端口 3306 + 5432 且没有 Web 端口的主机是一台数据库服务器。指纹识别决定了叙述的基调。
**2. 发现检测**(`analyst.rs: check_*`)
每个检测器会检查一种特定的条件,并返回一个带有严重性标签和通俗易懂解释的发现。检测器涵盖:
| 发现 | 严重性 | MITRE |
|---|---|---|
| Telnet 开放 | 严重 | T1021.004 |
| Docker API 未启用 TLS | 严重 | T1610 |
| 端口 4444(Metasploit 默认端口) | 严重 | T1571 |
| RDP 暴露 | 高 | T1021.001 |
| SMB 暴露(EternalBlue 攻击面) | 高 | T1021.002 |
| 数据库端口暴露 | 高 | T1190 |
| Jupyter Notebook 暴露 | 高 | T1059 |
| Kubernetes API 暴露 | 高 | T1613 |
| FTP 开放 | 中 | T1048.003 |
| SNMP 开放 | 中 | T1602.001 |
| VNC 暴露 | 中 | T1021.005 |
| 未加密的 LDAP | 中 | T1552.004 |
| 存在 SSH | 低 | T1021.004 |
| 存在 HTTP 但无 HTTPS | 低 | T1557 |
| 开发端口暴露 | 低 | T1190 |
**3. Banner 分析**(`analyst.rs: check_banner_issues`)
检查从开放端口接收到的实际文本。能够捕获诸如过时的 OpenSSH 版本(8.x 之前)、欢迎 Banner 中的 FTP 匿名登录提示、SMTP 开放中继指示符,以及 HTTP 头中的 Web 服务器版本泄露等问题。
## 架构
```
src/
├── main.rs CLI (clap), orchestration, task spawning, semaphore concurrency
├── scanner.rs Async TCP connect, ScanResult struct, port→service name map
├── banner.rs Banner grabbing — passive read or HTTP HEAD probe
├── cidr.rs CIDR expansion (IPv4, /16–/32), hostname passthrough
├── output.rs Colored table + NDJSON rendering
└── analyst.rs Host fingerprinting, finding detectors, narrative engine
```
### 并发模型
SniffSnorf 会立即为每个(主机,端口)对生成一个 `tokio::spawn` 任务。带有 `--concurrency` 许可证的 `tokio::sync::Semaphore` 可确保在任何时候最多有 N 个连接处于进行中状态。这避免了批处理的系统开销,同时仍然遵守并发上限。
### 为什么选择 Rust?
- 零成本异步:tokio 任务不是 OS 线程。数千个挂起的连接仅使用最少的内存。
- 无垃圾回收:连接循环的延迟是可预测的。
- `tokio::time::timeout` 与 `TcpStream::connect` 完美结合——没有回调地狱。
## MITRE ATT&CK 映射
SniffSnorf 的发现映射到以下 ATT&CK 战术:
- **侦察**:T1592(主机信息),T1602(SNMP)
- **初始访问**:T1190(面向公众的应用/数据库),T1078(默认账户)
- **执行**:T1059(Jupyter),T1610(容器部署)
- **横向移动**:T1021.001(RDP),T1021.002(SMB),T1021.004(SSH/Telnet),T1021.005(VNC)
- **收集**:T1114(电子邮件),T1557(AitM/无 TLS)
- **数据渗出**:T1048.003(FTP)
- **命令与控制**:T1571(非标准端口)
将 SniffSnorf 的发现与 Wazuh 检测规则结合使用,为你的蓝队资产组合构建完整的攻击者/防御者视角。
## 法律声明
请仅扫描你拥有或已获得明确书面测试权限的网络。未经授权的端口扫描可能会违反你所在司法管辖区的 CFAA、《计算机滥用法》及同等法律。
## 作者
[github.com/mikelobocyber](https://github.com/mikelobocyber)
标签:C2日志可视化, CISA项目, Cloudflare, MITRE ATT&CK, Rust, Tokio, 危险等级评估, 可视化界面, 威胁建模, 安全报告生成, 密码管理, 异步扫描器, 指纹识别, 插件系统, 攻击面分析, 数据统计, 无线安全, 服务器安全, 漏洞暴露检测, 端口扫描, 端口服务识别, 网络安全, 网络流量审计, 隐私保护