mrecio87/nd-scanner
GitHub: mrecio87/nd-scanner
以 Docker 容器运行的独立内网漏洞扫描器,集成了主机发现、端口扫描、服务识别和漏洞检测,提供 Web 界面和命令行两种使用方式。
Stars: 0 | Forks: 0
# nd-scanner
一个独立的网络扫描设备,以单个 Docker
容器运行。给它一个范围,它就能发现存活主机和开放端口,识别
其背后的服务,针对漏洞模板集测试这些
服务,并生成一份可读的报告。
它在普通硬件上运行良好。扫描将大部分时间花在等待
网络上,而不是消耗 CPU。
# 安装说明
你需要一台 Debian 或 Ubuntu 机器(物理机或虚拟机),连接到可以
路由到你打算扫描的目标网络。无需事先安装任何其他内容。
```
curl -fsSL https://raw.githubusercontent.com/mrecio87/nd-scanner/main/install.sh | bash
```
如果缺少 Docker 和 git,它会自动安装,克隆到 `~/nd-scanner`,提示输入
密码,进行构建,并启动 Web 界面。在提示符下,输入密码
或按 Enter 键自动生成。无论哪种方式,密码都会在最后打印出来,因此
在关闭终端之前请妥善保存。
首次构建会拉取扫描工具和漏洞模板,因此请耐心等待
几分钟。完成后,它会打印出 URL、密码和
证书指纹。
打开 URL。浏览器会警告自签名证书的问题。将其显示的指纹
与刚刚打印出的指纹进行比对,然后继续并登录。
如果不进行该检查,证书将毫无意义。
如果安装程序将你添加到了 `docker` 组,请在手动
运行 Docker 命令之前注销并重新登录。
重新运行 `./setup.sh` 是安全的。它会保留已设置的密码、证书和
设置,因此请在重启或更改地址后使用它。
**已有 Docker:**
```
git clone https://github.com/mrecio87/nd-scanner.git nd-scanner && cd nd-scanner && ./setup.sh --prompt
```
**在无网络环境下运行:** 在有网络连接的地方构建,将
image 移植过去,然后运行 `./setup.sh`。
```
docker save nd-scanner:latest | gzip > nd-scanner.tar.gz
gunzip -c nd-scanner.tar.gz | docker load
```
# 运行扫描
登录,每行输入一个目标网络,选择一个 profile,然后开始。页面会
显示实时进度,完成的报告中包含一个打印 / 另存为 PDF 的按钮。
| Profile | 功能说明 |
|---|---|
| Quick look | 前 100 个端口,无漏洞检查。快速了解整体情况 |
| Standard | 前 1000 个端口,完整的模板检查 |
| Gentle | 速率较慢且使用 `-T2` 计时,适用于脆弱或生产网络 |
| Thorough | 全部 65535 个端口(速度较慢) |
在不熟悉的网络上,请先运行 Quick look。几分钟即可
告诉你是否能完全连接到目标,然后再决定是否进行长时间的扫描。
# 命令行
与 Web 界面并行工作,且互不影响。
```
docker compose run --rm netscan 10.0.0.5
TARGET="10.0.0.5,10.0.0.6" docker compose run --rm netscan
```
或者在 `targets/targets.txt` 中列出目标,每行一个,无需参数运行。
主机名、IP 和 CIDR 范围均可使用。
# 输出
每次运行都会创建 `output/scan-/`:
| 文件 | 内容 |
|---|---|
| `summary.txt` | 人类可读的汇总。请首先阅读此文件 |
| `naabu.json` | 发现的所有开放端口 (JSONL) |
| `hostports.tsv` | 主机到以逗号分隔的开放端口 |
| `nmap/.{nmap,xml,gnmap}` | 每个主机的服务和版本检测 |
| `nuclei.jsonl` | 漏洞检测结果 (JSONL) |
| `targets.txt` | 实际扫描的内容,用于记录留存 |
# 配置
`.env` 中的环境变量。默认值是有意保守设置的。
| 变量 | 默认值 | 说明 |
|---|---|---|
| `WEBUI_PASSWORD` | *(自动生成)* | 登录页面的密码 |
| `WEBUI_SECRET` | *(随机)* | Session key。设置它以在重启后保留会话 |
| `WEBUI_PORT` | `8080` | 要发布的主机端口 |
| `BRAND_NAME` | `Network Defenders` | 显示在页眉和报告页脚中 |
| `BRAND_TAGLINE` | `Network Security Assessment` | 品牌名称下的副标题 |
| `HTTPS` | `true` | 默认开启 TLS。`false` 则提供明文服务 |
| `TLS_SAN` | *(自动检测)* | 证书的额外地址 |
| `TLS_CERT` / `TLS_KEY` | | 你自己的证书和密钥的路径 |
| `SCAN_TYPE` | `auto` | `auto` 每次运行自动选择,`s` = SYN,`c` = TCP connect |
| `NAABU_TOP_PORTS` | `1000` | 只能选 `100`、`1000` 或 `full`。如果设置了 `NAABU_PORTS` 则会被忽略 |
| `NAABU_PORTS` | | 显式列表,例如 `80,443,8080-8090`,或 `-` 代表全部 65535 |
| `NAABU_RATE` | `1000` | Packets/sec,当 `SCAN_TYPE` 不是 `auto` 时使用 |
| `NAABU_RATE_LOCAL` | `2000` | `auto` 模式用于直连目标时的速率 |
| `NAABU_RATE_ROUTED` | `300` | `auto` 模式遇到任何路由时的速率 |
| `HOST_SUBNETS` | *(自动检测)* | 直连子网,由 `setup.sh` 写入 |
| `NMAP_ARGS` | `-sV -O -Pn -T3` | `-O` 猜测 OS;去掉它可以实现更快、更安静的扫描。添加 `-sC` 使用默认脚本,`-T2` 减速 |
| `NUCLEI_SEVERITY` | `info,low,medium,high,critical` | 去掉 `info` 只显示检测结果 |
| `NUCLEI_TAGS` | | 例如 `cve,exposure` 以缩小模板集范围 |
| `NUCLEI_RATE` | `150` | Requests/sec |
| `NUCLEI_UPDATE` | `false` | `true` 在扫描前刷新模板 |
| `SKIP_NMAP` / `SKIP_NUCLEI` | `false` | 跳过某个阶段 |
`SCAN_TYPE=auto` 会根据设备自身的子网检查每个目标。如果
它们全部为直连,它将以本地速率使用 SYN 扫描,因为
中间没有任何阻碍。如果涉及任何路由,它会降级为
较低速率的 connect 扫描,因为通过状态防火墙的半开连接会填满
其状态表并导致设备被封禁。任何不明确的情况,包括
无法解析的名称,都会被视为路由。
模板已内置到 image 中,因此新设备无需通过
客户端网络拉取即可立即扫描。`docker-compose.yml` 将容器限制为
2 个 CPU 和 2 GB。对于树莓派级别的设备,可以尝试 1 个 CPU 和 512 MB 并设置 `NAABU_RATE=200`。
# 密码
每个设备都有自己的密码,在安装时设置。`./setup.sh --prompt` 可以在
以后更改它。`./setup.sh --password '...'` 无需提示即可设置,适用于配置
脚本,但代价是它会留在你的 shell 历史记录中。
将它们保存在密码管理器中,每个设备一个条目。不要在
不同站点重复使用同一个密码:任何在某个客户端获取到密码的人,随后都可以登录到你部署的
所有其他设备。
# 部署到客户端站点
完整的操作手册,包括 Debian 安装:**[DEPLOY.md](DEPLOY.md)**。
在出发前确认书面授权和范围,首次连接时验证
证书指纹,并在设备离开或
重用之前清除结果。`output/` 包含该客户端完整的漏洞图谱。
```
docker compose down && rm -rf output/scan-* certs/
```
`output/` 和真实目标列表已被 gitignored,因此客户端数据不会
进入代码库。仅扫描你已获得书面授权进行测试的主机。
标签:Cutter, Docker, 加密, 安全防御评估, 插件系统, 漏洞扫描器, 版权保护, 请求拦截