johnnyxmas/ScanCannon
GitHub: johnnyxmas/ScanCannon
一款用于大规模网络凭据攻击面枚举和通用侦察的高速Bash脚本。
Stars: 475 | Forks: 77
# ScanCannon v1.5

**一款用于高效枚举基于凭据的攻击面并对大规模外部网络范围进行通用侦察的Bash脚本。**
ScanCannon能够以基础设施所能支持的最高速度处理超大网络(如整个互联网)的枚举,专门寻找基于凭据的攻击面和API。它使用 `masscan` 快速识别开放端口,然后调用 `nmap` 获取监听这些端口的系统和服务的详细信息,从而弥补 `masscan` 精度不足的缺陷。最终产物是一个包含IP地址、主机名和有趣服务的纯文本文件数组,你可以轻松将其导入到攻击链中的下一个工具中。
## 目录
- [什么是ScanCannon?](#what-is-scancannon)
- [前置条件](#prerequisites)
- [安装说明](#installation)
- [快速开始](#quick-start)
- [配置](#configuration)
- [使用示例](#usage-examples)
- [进度跟踪](#progress-tracking)
- [理解输出](#understanding-output)
- [安全与法律考量](#safety--legal-considerations)
- [故障排除](#troubleshooting)
- [常见问题](#faq)
- [已知问题](#known-issues)
- [许可证](#license)
## 什么是ScanCannon?
### 功能特性
- **高速网络枚举**,使用masscan进行初始发现
- **详细的服务检测**,使用nmap扫描发现的主机
- **API端点检测**,使用nmap NSE脚本和针对性的curl探测(通过 `-a` 标志)
- **基于ASN的全面网络发现** — 解析所有A记录,查询 `whois` 获取CIDR和ASN,然后通过RADB发现该ASN公布的所有前缀。同时支持 `-d`(域名)和 `-c`(CIDR)输入,并提供交互式范围选择。
- **全面的输出格式**,包括便于导入其他工具的纯文本文件
- **自动发现域名/子域名**,基于扫描结果
- **服务分类**,针对常见的凭据攻击向量(SSH、FTP、HTTP、SMB等)
- **高级进度跟踪**,具有实时视觉反馈、ETA计算和阶段监控
- **自动清理**和文件组织
- **跨平台支持**(Linux、MacOS、WSL2)
### 目标服务
ScanCannon专注于以下高价值服务进行安全评估:
**TCP服务:**
- **21** - FTP(文件传输协议)
- **22** - SSH(安全外壳)
- **23** - Telnet
- **53** - DNS(域名系统)
- **80** - HTTP(Web服务器)
- **135** - MSRPC(Microsoft RPC)
- **139** - NetBIOS会话服务
- **443** - HTTPS(安全Web服务器)
- **445** - Microsoft-DS(SMB/CIFS)
- **990** - SFTP(安全FTP)
- **1701** - L2F(第二层转发)
- **1723** - PPTP(点对点隧道协议)
**UDP服务(使用 `-u` 标志):**
- **53** - DNS(域名系统)
- **161** - SNMP(简单网络管理协议)
- **500** - ISAKMP(互联网安全关联和密钥管理协议)
*这种聚焦方法大大减少了扫描时间,同时确保发现所有高价值的攻击面服务。*
## 前置条件
- **Root/管理员权限**(原始数据包操作所需)
- **[Masscan v1.0.3+](https://github.com/robertdavidgraham/masscan)** - 高速端口扫描器
- **[Nmap v7.0.1+](https://github.com/nmap/nmap)** - 网络发现和安全审计
- **标准Unix工具**:`dig`、`whois`、`wget`、`awk`、`sed`
- **curl** *(可选,通过 `-a` 标志进行API端点检测时必需)*
## 快速开始
### 命令语法
```
sudo ./scancannon.sh [-u] [-a] <-d domain | -c CIDR> [...]
```
必须至少使用一个 `-d` 或 `-c` 标志。这两个标志可重复使用并可组合。
**选项:**
- `-d domain` : 发现某个域名的所有网络(解析所有A记录 → whois → ASN → RADB前缀查找;可重复;也接受URL)
- `-c CIDR` : 发现与某个CIDR相关的所有网络(whois → ASN → RADB前缀查找;可重复)
- `-u` : 使用nmap对常用端口(53、161、500)执行UDP扫描(速度明显较慢)
- `-a` : 对HTTP/HTTPS服务执行API端点检测(需要 `curl`)
`-d` 和 `-c` 都会运行基于ASN的全面网络发现,并呈现一个交互式选择菜单,供你选择要扫描的发现范围。
### 示例
```
# 按 CIDR 扫描网络(包括相关网络的 ASN 发现)
sudo ./scancannon.sh -c 203.0.113.0/24
# 发现域名的所有网络(解析所有 IP → ASN → 所有已宣告前缀)
sudo ./scancannon.sh -d example.com
# 组合域名 + CIDR(两者均被扫描)
sudo ./scancannon.sh -d example.com -c 10.0.0.0/24
# 包含 UDP 扫描(较慢但更全面)
sudo ./scancannon.sh -u -d example.com
# 包含 API 端点检测
sudo ./scancannon.sh -a -c 203.0.113.0/24
# 组合所有标志
sudo ./scancannon.sh -ua -d example.com -c 10.0.0.0/24
```
## 配置
### 基础配置
主要配置通过 [`scancannon.conf`](scancannon.conf) 进行处理:
```
# 你可能想要调整的关键设置:
rate = 5000.00 # Packets per second (start low!)
excludefile = exclude.txt # Networks to exclude from scanning
# 仅扫描 ScanCannon 实际使用的端口 - 效率更高!
ports = 21,22,23,53,80,135,139,443,445,990,1701,1723
```
### 排除列表
编辑 [`exclude.txt`](exclude.txt) 以添加你想要跳过的网络:
```
# 添加要排除的网络(每行一个)
192.168.0.0/16 # Private networks
10.0.0.0/8 # Private networks
172.16.0.0/12 # Private networks
127.0.0.0/8 # Loopback
```
### 自动网络配置
ScanCannon每次运行时都会自动提示网络适配器配置。这通过帮助masscan达到最大扫描速度来确保最佳性能。脚本将:
1. **检测网络接口**并让你选择使用哪一个
2. **自动配置** adapter-ip 和 adapter-mac 设置
3. **查找你的默认网关**并配置 router-mac 设置
4. **更新 scancannon.conf** 文件中的检测到的设置
```
# 每次运行 ScanCannon 时:
sudo ./scancannon.sh -c 192.168.1.0/24
# 你将始终看到:
=== Network Adapter Configuration ===
For optimal performance, ScanCannon can automatically configure your network adapter settings.
This helps masscan achieve maximum scanning speed by bypassing the kernel network stack.
Would you like to automatically configure network adapter settings? [y/N]: y
# 如果存在多个接口:
Multiple network interfaces found:
[1] eth0 - IP: 192.168.1.100, MAC: aa:bb:cc:dd:ee:ff
[2] wlan0 - IP: 10.0.0.50, MAC: 11:22:33:44:55:66
Select interface [1-2]: 1
# 配置自动应用于 scancannon.conf
# 若希望保留现有设置或手动配置,请回答 'N'
```
### 手动网络配置(高级)
如果你偏好手动配置或需要自定义设置,可以直接编辑 [`scancannon.conf`](scancannon.conf):
```
# 网络适配器设置以实现最佳性能:
adapter-ip = 192.168.1.100 # Your machine's IP address
adapter-mac = aa:bb:cc:dd:ee:ff # Your network card's MAC address
router-mac = 11:22:33:44:55:66 # Your router's MAC address
```
**这些设置为何重要:**
- **`adapter-ip`**:你的机器在扫描接口上的IP地址
- Masscan使用它来构建具有正确源IP的数据包
- 必须与你进行扫描的接口的IP匹配
- **`adapter-mac`**:你的网卡MAC地址
- 用于原始数据包传输以绕过内核网络
- 通过避免操作系统网络栈开销来提高性能
- **`router-mac`**:你的默认网关的MAC地址
- masscan需要它来将数据包直接发送到路由器
- 通过绕过ARP查找实现最大扫描速度
**这些设置何时有帮助:**
- **高速扫描**(>10,000 pps)- 显著提高性能
- **大型网络范围** - 减少数据包丢失并提高准确性
- **专用扫描系统** - 最大化硬件利用率
- **虚拟机** - 可能需要它来正确传输数据包
**手动检测命令:**
```
# Linux - 获取 IP、MAC 和网关:
ip addr show # Your IP and MAC
ip route show # Default gateway IP
arp -a | grep $(ip route | grep default | awk '{print $3}') # Gateway MAC
# macOS - 获取 IP、MAC 和网关:
ifconfig # Your IP and MAC
netstat -rn # Default gateway IP
arp -a | grep $(netstat -rn | grep default | awk '{print $2}') # Gateway MAC
```
**重要提示**:Masscan要求MAC地址使用横杠格式(aa-bb-cc-dd-ee-ff),而不是冒号格式(aa:bb:cc:dd:ee:ff)。自动配置现在会自动处理此转换,但如果手动配置,请确保使用横杠。
## 理解输出
ScanCannon在 `results/` 目录中创建有组织的输出:
```
results/
├── 203_0_113_0_24/ # Per-network results
│ ├── masscan_output.bin # Binary masscan results
│ ├── masscan_output.txt # Text masscan results
│ ├── hosts_and_ports.txt # Discovered hosts:ports
│ ├── nmap_files/ # Individual nmap scans
│ ├── gnmap_files/ # Greppable nmap output
│ ├── nmap_xml_files/ # XML nmap output
│ ├── interesting_servers/ # Categorized services
│ │ ├── ssh_servers.txt # SSH servers found
│ │ ├── http_servers.txt # Web servers found
│ │ ├── ftp_servers.txt # FTP servers found
│ │ ├── api_servers.txt # API endpoints found (with -a)
│ │ ├── api_details.txt # API detection details (with -a)
│ │ └── ... # Other services
│ ├── resolved_subdomains.txt # Discovered domains
│ └── resolved_root_domains.csv # Domain details with WHOIS
├── all_interesting_servers/ # Combined results
│ ├── all_ssh_servers.txt # All SSH servers
│ ├── all_http_servers.txt # All web servers
│ ├── all_api_servers.txt # All API endpoints (with -a)
│ └── ... # Other combined lists
├── all_subdomains.txt # All discovered domains
├── all_root_domains.csv # All domain details
└── dead_networks.txt # Unresponsive networks
```
## 安全与法律考量
### ⚠️ **严重警告** ⚠️
**ScanCannon很容易导致拒绝服务状况,即使是从单个源发起。**
### 速率限制指南
| 网络类型 | 建议速率 | 备注 |
|----------|----------|------|
| 家庭/SOHO | 1,000-5,000 pps | 可能导致消费级路由器崩溃 |
| 小型企业 | 5,000-10,000 pps | 监控连接性问题 |
| 企业 | 10,000-20,000 pps | 增量测试 |
| ISP/大规模 | 20,000+ pps | 可能损坏基础设施 |
### 最佳实践
1. **从低开始**:从 `rate = 1000` 开始,然后逐步增加
2. **先测试**:在扫描大型网络之前先扫描一个小子网
3. **监控影响**:留意网络性能下降
4. **遵守法律**:只扫描你拥有或已获得许可进行测试的网络
5. **备份配置**:在更改前保存有效配置
## 故障排除
### 常见问题
**"ERROR: masscan is not installed"**
```
# 使用你的包管理器安装 masscan
sudo apt install masscan # Ubuntu/Debian
```
**"ERROR: This script must be run as root"**
```
# 使用 sudo 运行
sudo ./scancannon.sh -c 192.168.1.0/24
```
**"No IPs are up; skipping nmap"**
- 检查目标网络是否确实可达
- 验证 `scancannon.conf` 中的网络配置
- 尝试降低扫描速率
- 检查防火墙规则
**扫描似乎挂起或非常慢**
- 降低 `scancannon.conf` 中的 `rate` 设置
- 检查网络连接性
- 验证目标网络有响应
**masscan 报 "bad MAC address" 错误**
- Masscan要求MAC地址使用横杠格式(aa-bb-cc-dd-ee-ff),而不是冒号格式(aa:bb:cc:dd:ee:ff)
- 自动配置现在会自动处理此转换
- 如果手动配置,请将冒号转换为横杠:`aa:bb:cc:dd:ee:ff` → `aa-bb-cc-dd-ee-ff`
## 常见问题
### `nmap` 和 `masscan` 不是做同样的事情吗?为什么要同时使用两者?
Masscan为了速度牺牲了准确性,并且由于其激进的扫描方法可能会遗漏响应。ScanCannon使用masscan快速识别哪些IP地址有监听服务,然后使用nmap更可靠的扫描仅针对这些有响应的主机。这样你就同时获得了速度和准确性。
### 工具X不是能做所有这些事情甚至更多吗?为什么用这个?
大多数枚举工具试图成为全面的"一站式商店",但最终每项都做得平庸。ScanCannon专注于在做网络枚举方面做得非常出色,并输出到标准的、广泛兼容的文件格式,这些格式可以与其他专业工具配合使用。
### API端点检测是如何工作的?
当使用 `-a` 标志时,ScanCannon采用两层检测方法:
1. **第一层(被动):** 在nmap TCP枚举期间,为HTTP端口添加轻量级的NSE脚本(`http-headers`、`http-title`、`http-robots.txt`、`http-server-header`)。然后解析生成的XML输出,寻找API框架指纹(Express、Django、Flask、FastAPI、Spring等)、API相关的响应头(CORS、`X-API-Version`、JSON内容类型)以及文档页面标题(Swagger UI、GraphQL Playground等)。
2. **第二层(主动):** 对于每个发现的HTTP/HTTPS主机,`curl` 会探测14个著名的API路径,包括 `/api`、`/api/v1`、`/swagger.json`、`/openapi.json`、`/graphql` 等。响应根据JSON内容类型、已知API路径模式和需要认证的响应(401/403)被分类为API端点。
结果被写入 `api_servers.txt`(干净的端点列表)和 `api_details.txt`(带有层级指示的完整检测日志)。
### 为什么我需要root权限?
Masscan和nmap都需要原始套接字访问权限来进行SYN扫描和操作系统检测,这在Unix系统上需要root权限。
### 我可以暂停和恢复扫描吗?
目前,ScanCannon不支持暂停/恢复功能。对于大型扫描,请考虑将其分解为较小的CIDR范围。
### 如何扫描IPv6网络?
ScanCannon目前专注于IPv4网络。对于IPv6扫描,请直接使用nmap或考虑其他专业工具。
## 已知问题
- **国际顶级域名检测**:由于不同的WHOIS输出标准,对于国际顶级域名(如.co.uk、.io等)的域名检测可能无法可靠工作(待办?)
## 许可证
本项目采用知识共享署名-非商业性使用3.0未本地化版本许可证发布。

**你可以自由地:**
- **分享** — 在任何媒介或格式下复制和重新分发本材料
- **演绎** — 修改、转换和基于本材料进行创作
**但须遵守以下条款:**
- **署名** — 你必须给予所有贡献者适当的信用,提供许可证的链接,并说明是否进行了更改
- **非商业性使用** — 你不得将本材料用于商业目的
完整的许可证文本,请参阅 [LICENSE](LICENSE)。
**ScanCannon v1.5 由 J0hnnyXm4s 开发**
*"针对大规模网络范围的高效凭据攻击面枚举和通用侦察工具"*
标签:API检测, ASN发现, masscan, 代码生成, 侦察自动化, 凭据枚举, 外部网络枚举, 大规模网络, 威胁情报平台, 实时处理, 密码管理, 应用安全, 攻击面枚举, 数据统计, 服务检测, 渗透测试工具, 端口扫描, 网络安全, 网络扫描工具, 隐私保护