
nerva v1.48.1
快速服务指纹识别CLI,支持170多种协议(TCP/UDP/SCTP)- 由Praetorian构建
Nerva
Nerva: 快速服务指纹识别CLI
功能 • 安装 • 快速开始 • 使用方法 • 支持的协议 • 库使用 • 使用场景 • 故障排除
用Go编写的高性能服务指纹识别。 支持170+网络协议,涵盖TCP、UDP和SCTP传输,并提供丰富的元数据提取。
Nerva 快速检测和识别开放网络端口上运行的服务。可配合端口扫描器(如 Naabu)对发现的服务进行指纹识别,或集成到安全流水线中实现自动化侦察。
功能
- 170+ 协议插件 — 数据库、远程访问、Web服务、消息传递、工业及电信协议
- 76 个HTTP指纹识别器 — 检测包括防火墙、数据库、AI/LLM服务器等在内的Web技术
- 安全配置错误检测 — 识别常见安全问题,如未认证API和明文协议(
--misconfigs) - 多传输支持 — TCP(默认)、UDP(
--udp)和SCTP(--sctp,仅限Linux) - 代理支持 — 通过SOCKS5或HTTP代理透明路由扫描流量,支持可配置DNS解析
- 丰富的元数据 — 从每个服务中提取版本、配置和与安全相关的详细信息
- 快速模式 — 仅扫描默认端口以实现快速侦察(
--fast) - 灵活的输出 — JSON、CSV或可读格式
- 管道友好 — 从Naabu、Nmap或任何输出
host:port的工具接收输入 - Go库 — 直接导入到Go应用中使用
安装
发布版本
从发布页面下载预编译的二进制文件。
从GitHub安装```sh
go install github.com/praetorian-inc/nerva/cmd/nerva@latest
### 来自源```sh
git clone https://github.com/praetorian-inc/nerva.git
cd nerva
go build ./cmd/nerva
./nerva -h
Docker```sh
git clone https://github.com/praetorian-inc/nerva.git cd nerva docker build -t nerva . docker run --rm nerva -h docker run --rm nerva -t example.com:80 --json
## 快速开始
对单个目标进行指纹识别:```sh
nerva -t example.com:22
# ssh://example.com:22
获取详细的 JSON 元数据:```sh nerva -t example.com:22 --json
{"host":"example.com","ip":"93.184.216.34","port":22,"protocol":"ssh","transport":"tcp","metadata":{...}}
来自端口扫描器的管道:```sh
naabu -host example.com -silent | nerva
# http://example.com:80
# ssh://example.com:22
# https://example.com:443
用法```
nerva [flags]
TARGET SPECIFICATION: Requires host:port or ip:port format. Assumes ports are open.
EXAMPLES: nerva -t example.com:80 nerva -t example.com:80,example.com:443 nerva -l targets.txt nerva --json -t example.com:80 cat targets.txt | nerva
### 标志
| 标志 | 缩写 | 描述 | 默认值 |
|------|------|------|--------|
| `--targets` | `-t` | 目标或逗号分隔的目标列表 | — |
| `--list` | `-l` | 包含目标的输入文件 | — |
| `--output` | `-o` | 输出文件路径 | stdout |
| `--json` | | 以 JSON 格式输出 | false |
| `--csv` | | 以 CSV 格式输出 | false |
| `--misconfigs` | | 启用安全配置错误检测 | false |
| `--proxy` | | 代理 URL(例如 socks5://127.0.0.1:1080) | — |
| `--proxy-auth` | | SOCKS5 代理认证(例如 username:password) | — |
| `--dns-order` | | DNS 解析顺序:`p`, `l`, `lp`, `pl` | `lp` |
| `--fast` | `-f` | 快速模式(仅默认端口) | false |
| `--capabilities` | `-c` | 列出可用功能并退出 | false |
| `--udp` | `-U` | 运行 UDP 插件 | false |
| `--sctp` | `-S` | 运行 SCTP 插件(仅 Linux) | false |
| `--timeout` | `-w` | 超时时间(毫秒) | 2000 |
| `--verbose` | `-v` | 详细输出到 stderr | false |
| `--workers` | `-W` | 并发扫描工作线程数 | 50 |
| `--max-host-conn` | `-H` | 每个主机 IP 的最大并发连接数(0=无限制) | 0 |
| `--rate-limit` | `-R` | 全局每秒最大扫描数(0=无限制) | 0 |
### 示例
**多个目标:**```sh
nerva -t example.com:22,example.com:80,example.com:443
来自文件:```sh nerva -l targets.txt --json -o results.json
**UDP扫描**(可能需要root权限):```sh
sudo nerva -t example.com:53 -U
# dns://example.com:53
SCTP扫描(仅限Linux):```sh nerva -t telecom-server:3868 -S
diameter://telecom-server:3868
**快速模式**(仅默认端口):```sh
nerva -l large-target-list.txt --fast --json
代理路由与远程DNS解析:```sh nerva -t target.internal:80 --proxy socks5://127.0.0.1:1080 --dns-order p
### 安全配置错误检测
当使用 `--misconfigs` 选项启用时,Nerva 可以识别常见的安全配置错误:```sh
nerva -t example.com:2375 --misconfigs --json
检测到的错误配置:
| Finding ID | Severity | Description |
|---|---|---|
docker-unauth-api | Critical | Docker API 无需认证即可访问 |
x11-unauth-access | Critical | X11 服务器允许未认证的连接 |
smb-signing-not-required | Medium | SMB 签名未要求(存在中继攻击风险) |
telnet-cleartext | Medium | Telnet 以明文传输凭据 |
vnc-detected | Medium | 检测到 VNC(通常认证较弱) |
ssh-password-auth | Medium | 服务器允许密码认证 |
ssh-weak-cipher | Low | 服务器提供弱加密算法(RC4、3DES、Blowfish) |
ssh-weak-kex | Low | 服务器提供弱密钥交换算法 |
ssh-weak-mac | Low | 服务器提供弱 MAC 算法 |
ftp-cleartext | Low | FTP 以明文传输凭据 |
包含错误配置的示例输出:```json { "host": "example.com", "port": 2375, "protocol": "docker", "anonymous_access": true, "security_findings": [ { "id": "docker-unauth-api", "severity": "critical", "description": "Docker API accessible without authentication", "evidence": "Successfully queried /version endpoint without credentials" } ] }
### 代理支持
Nerva 支持通过 SOCKS5 和 HTTP 代理路由扫描流量,并可配置 DNS 解析。
**支持的代理协议:**
- `socks5://` - SOCKS5 代理,使用本地 DNS 解析
- `socks5h://` - SOCKS5 代理,始终使用代理端 DNS 解析
- `http://` - HTTP CONNECT 代理
- `https://` - HTTPS CONNECT 代理
**代理认证:**```sh
# Inline authentication (URL format)
nerva -t example.com:80 --proxy socks5://username:[email protected]:1080
# Separate authentication flag
nerva -t example.com:80 --proxy socks5://127.0.0.1:1080 --proxy-auth username:password
DNS 解析策略(--dns-order):
| 选项 | 策略 | 使用场景 |
|---|---|---|
l | 仅本地 | 标准本地 DNS(默认) |
p | 仅代理 | 强制代理端 DNS 解析 |
lp | 本地,回退到代理 | 优先尝试本地,失败时使用代理 |
pl | 代理,回退到本地 | 优先尝试代理,失败时使用本地 |
注意: socks5h:// 方案会自动强制代理端 DNS(等同于 --dns-order p)
Tor 扫描示例:```sh
Scan .onion services through Tor (SOCKS5 proxy on port 9050)
nerva -t http://example.onion:80 --proxy socks5h://127.0.0.1:9050
**UDP 通过代理:**```sh
# UDP scanning through SOCKS5 proxy (limited support)
nerva -t target.com:161 --proxy socks5://127.0.0.1:1080 --udp
⚠️ UDP 限制: 通过 SOCKS5 的 UDP 支持有限。并非所有 SOCKS5 服务器都支持 UDP 关联。可能会发生本地 UDP 回退。
带速率限制的并行扫描:```sh nerva -l large-target-list.txt -W 100 -H 5 -R 50 -v
**优雅关机**(Ctrl+C 返回部分结果):```sh
nerva -l huge-target-list.txt -W 50 -v
# Press Ctrl+C to stop — collected results are still printed
支持的协议
170+ 服务检测插件,覆盖 TCP、UDP 和 SCTP:
HTTP 指纹模块(66 个)
Web 服务技术检测,按类别组织:
防火墙与网络安全(12 个)
| 模块 | 描述 |
|---|---|
| Checkpoint | Check Point 安全网关 |
| Cisco ASA/FTD | Cisco 防火墙/VPN 设备 |
| FortiGate | Fortinet 防火墙/VPN |
| GlobalProtect | Palo Alto Networks VPN |
| Juniper | Juniper SRX 防火墙 |
| OPNsense | OPNsense 防火墙 |
| pfSense | pfSense 防火墙 |
| SonicWall | SonicWall 防火墙 |
| AnyConnect | Cisco AnyConnect SSL VPN |
| Cisco Expressway | Cisco 协作网关 |
| BigIP | F5 BIG-IP 负载均衡器 |
| WinRM | Windows 远程管理 |
AI/LLM 与机器学习(6 个)
| 模块 | 描述 |
|---|---|
| Ollama | 自托管 LLM 推理服务器 |
| LocalAI | 自托管 LLM 推理(兼容 OpenAI) |
| Open WebUI | LLM Web 界面(ChatGPT 风格) |
| Triton | NVIDIA Triton 推理服务器 |
| Weaviate | AI 向量数据库 |
| ChromaDB | 向量数据库 |
数据库与数据存储(12 个)
| 模块 | 描述 |
|---|---|
| ArangoDB | 多模型数据库 |
| CockroachDB | 分布式 SQL 数据库 |
| CouchDB | Apache 文档数据库 |
| Elasticsearch | 搜索与分析引擎 |
| etcd | 分布式键值存储 |
| Milvus | 向量数据库 |
| MinIO | S3 兼容对象存储 |
| Pinecone | 向量数据库 |
| Redis Commander | Redis Web 管理界面 |
| TiDB | 分布式 SQL 数据库 |
| YugabyteDB | 分布式 SQL 数据库 |
| Qdrant | 向量数据库 |
DevOps 与基础设施(14 个)
| 模块 | 描述 |
|---|---|
| Artifactory | JFrog 制品仓库 |
| Consul | HashiCorp 服务网格 |
| Docker Registry | 容器镜像仓库 |
| Gitea | 自托管 Git 服务 |
| Grafana | 可观测性平台 |
| Harbor | 容器仓库 |
| Jaeger | 分布式追踪 |
| Jenkins | CI/CD 自动化 |
| Kubernetes | 容器编排 API |
| Portainer | Docker 管理界面 |
| Prometheus | 监控系统 |
| Swagger/OpenAPI | API 文档 |
| TeamCity | CI/CD 服务器 |
| Vault | HashiCorp 密钥管理 |
Web 服务器与框架(10 个)
| 模块 | 描述 |
|---|---|
| Apache HTTPD | Apache HTTP 服务器 |
| Express.js | Node.js Web 框架 |
| GoAhead | 嵌入式 Web 服务器 |
| Gotenberg | PDF 生成服务 |
| Guacamole | Apache 远程桌面网关 |
| SOAP | Web 服务 |
| Tengine | 阿里 Web 服务器 |
| Tomcat | Apache Tomcat |
| WordPress | CMS 平台 |
| UPnP | 通用即插即用 |
企业级与商业(8 个)
| 模块 | 描述 |
|---|---|
| AEM | Adobe Experience Manager |
| Dynamics 365 | Microsoft Dynamics 365 / Power Apps |
| Oracle Service Cloud | Oracle CRM 平台 |
| SAP NetWeaver | SAP 企业平台 |
| Splunk | 日志管理平台 |
| VMware Horizon | 虚拟桌面基础设施 |
| QNAP QTS | NAS 管理 |
| Exchange | Microsoft Exchange 服务器 |
家庭与物联网(2 个)
| 模块 | 描述 |
|---|---|
| Home Assistant | 家庭自动化平台 |
| UniFi/EdgeOS | Ubiquiti 网络设备 |
其他(2 个)
| 模块 | 描述 |
|---|---|
| Go pprof | Go 性能分析端点 |
| NATS | 消息代理 |
数据库(20 个)
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| PostgreSQL | TCP | 5432 |
| MySQL | TCP | 3306 |
| MSSQL | TCP | 1433 |
| Oracle | TCP | 1521 |
| MongoDB | TCP | 27017 |
| Redis | TCP/TLS | 6379, 6380 |
| Cassandra | TCP | 9042 |
| InfluxDB | TCP | 8086 |
| Neo4j | TCP/TLS | 7687 |
| DB2 | TCP | 446, 50000 |
| Sybase | TCP | 5000 |
| Firebird | TCP | 3050 |
| Memcached | TCP | 11211 |
| ZooKeeper | TCP | 2181 |
| Milvus | TCP | 19530, 9091 |
| CouchDB | HTTP | 5984 |
| Elasticsearch | HTTP | 9200 |
| ArangoDB | HTTP | 8529 |
| ChromaDB | HTTP | 8000 |
| Pinecone | HTTP | 443 |
远程访问(6 个)
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| SSH | TCP | 22, 2222 |
| RDP | TCP/TLS | 3389 |
| Telnet | TCP | 23 |
| VNC | TCP | 5900 |
| AnyDesk | TCP | 7070 |
| TeamViewer | TCP | 5938 |
Web 与 API(2 个)
| 协议 | 传输层 | 备注 |
|---|---|---|
| HTTP/HTTPS | TCP | HTTP/2,通过 Wappalyzer 进行技术检测 |
| Kubernetes | TCP | API 服务器检测 |
消息与队列(10 个)
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| Kafka | TCP/TLS | 9092, 9093 |
| MQTT 3/5 | TCP/TLS | 1883, 8883 |
| AMQP | TCP/TLS | 5672, 5671 |
| ActiveMQ | TCP/TLS | 61616, 61617 |
| NATS | TCP/TLS | 4222, 6222 |
| Pulsar | TCP/TLS | 6650, 6651 |
| SMTP | TCP/TLS | 25, 465, 587 |
| POP3 | TCP/TLS | 110, 995 |
| IMAP | TCP/TLS | 143, 993 |
| SMPP | TCP | 2775, 2776 |
文件与目录服务(7 个)
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| FTP | TCP | 21 |
| SMB | TCP | 445 |
| NFS | TCP/UDP | 2049 |
| Rsync | TCP | 873 |
| TFTP | UDP | 69 |
| SVN | TCP | 3690 |
| LDAP | TCP/TLS | 389, 636 |
网络服务(11 个)
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| DNS | TCP/UDP | 53 |
| DHCP | UDP | 67, 68 |
| NTP | UDP | 123 |
| SNMP | UDP | 161 |
| NetBIOS-NS | UDP | 137 |
| STUN | UDP | 3478 |
| OpenVPN | UDP | 1194 |
| IPsec | UDP | 500 |
| IPMI | UDP | 623 |
| CoAP | UDP | 5683 |
| Echo | TCP/UDP | 7 |
工业控制系统(18 个)
| 协议 | 传输层 | 默认端口 | 备注 |
|---|---|---|---|
| Modbus | TCP | 502 | SCADA/PLC |
| S7comm | TCP | 102 | 西门子 PLC |
| EtherNet/IP | TCP | 44818 | Rockwell/Allen-Bradley |
| PROFINET | TCP | 34962-34964 | 西门子工业 |
| BACnet | UDP | 47808 | 楼宇自动化 |
| OPC UA | TCP | 4840 | 工业互操作 |
| OMRON FINS | TCP/UDP | 9600 | 欧姆龙 PLC |
| MELSEC-Q | TCP | 5006, 5007 | 三菱 PLC |
| KNXnet/IP | UDP | 3671 | 楼宇自动化 |
| IEC 104 | TCP | 2404 | 电网 SCADA |
| DNP3 | TCP | 20000 | 电网 SCADA |
| Codesys | TCP | 1200, 2455 | PLC 运行时 |
| Fox | TCP | 1911 | Tridium Niagara |
| PC WORX | TCP | 1962 | 菲尼克斯电气 |
| ProConOS | TCP | 20547 | PLC 运行时 |
| HART-IP | TCP | 5094 | 过程自动化 |
| EtherCAT | UDP | 34980 | 运动控制 |
| Crimson v3 | TCP | 789 | Red Lion HMI |
| PCOM | TCP | 20256 | Unitronics PLC |
| GE SRTP | TCP | 18245 | GE PLC |
| ATG | TCP | 10001 | 液位仪 |
电信与 VoIP(17 个)
| 协议 | 传输层 | 默认端口 | 备注 |
|---|---|---|---|
| Diameter | TCP/SCTP | 3868 | LTE/5G AAA |
| M3UA | SCTP | 2905 | SS7 over IP |
| M2UA | SCTP | 2904 | MTP2 用户适配层 |
| M2PA | SCTP | 3565 | MTP2 对等适配层 |
| SGsAP | SCTP | 29118 | 电路域回落 |
| X2AP | SCTP | 36422 | LTE 基站间接口 |
| IUA | SCTP | 9900 | ISDN over IP |
| SIP | TCP/UDP/TLS | 5060, 5061 | VoIP 信令 |
| MEGACO/H.248 | UDP | 2944, 2945 | 媒体网关 |
| MGCP | UDP | 2427, 2727 | 媒体网关 |
| H.323 | TCP | 1720 | 视频会议 |
| SCCP/Skinny | TCP | 2000, 2443 | Cisco IP 电话 |
| IAX2 | UDP | 4569 | Asterisk 协议 |
| GTP-C | UDP | 2123 | GPRS 控制面 |
| GTP-U | UDP | 2152 | GPRS 用户面 |
| GTP' | UDP | 3386 | GPRS 计费 |
| PFCP | UDP | 8805 | 5G 用户面 |
VPN 与安全(11 个)
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| SSH | TCP | 22, 2222 |
| OpenVPN | UDP | 1194 |
| WireGuard | UDP | 51820 |
| IPsec/IKEv2 | UDP | 500, 4500 |
| L2TP | UDP | 1701 |
| SSTP | TCP | 443 |
| GlobalProtect | HTTP | 443 |
| AnyConnect | HTTP | 443 |
| FortiGate | HTTP | 443 |
| STUN/TURN | UDP | 3478, 5349 |
| Kerberos | TCP | 88 |
远程访问与管理(10 个)
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| RDP | TCP/TLS | 3389 |
| VNC | TCP | 5900 |
| Telnet | TCP | 23 |
| WinRM | HTTP | 5985, 5986 |
| IPMI | UDP | 623 |
| SNMP | UDP | 161 |
| Zabbix Agent | TCP | 10050 |
| NRPE | TCP/TLS | 5666 |
| Docker | TCP/TLS | 2375, 2376 |
| X11 | TCP | 6000-6063 |
开发者工具(8 个)
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| HTTP/HTTPS | TCP | 80, 443, 8080, 8443 |
| Java RMI | TCP | 1099 |
| JDWP | TCP | 5005 |
| RTSP | TCP | 554 |
| Linux RPC | TCP | 111 |
| JetDirect | TCP | 9100 |
| CUPS/IPP | TCP | 631 |
| SonarQube | TCP | 9000 |
库使用方式
将 Nerva 导入 Go 应用程序:```go package main
import ( "context" "fmt" "log" "net/netip" "time"
"github.com/praetorian-inc/nerva/pkg/plugins"
"github.com/praetorian-inc/nerva/pkg/scan"
)
func main() { // Configure scan config := scan.Config{ DefaultTimeout: 2 * time.Second, FastMode: false, UDP: false, Proxy: "socks5://127.0.0.1:1080", // optional ProxyAuth: "username:password", // optional DNSOrder: "p", // resolver strategy }
// Create target
ip, _ := netip.ParseAddr("93.184.216.34")
target := plugins.Target{
Address: netip.AddrPortFrom(ip, 22),
Host: "example.com",
}
// Run scan
results, err := scan.ScanTargets(context.Background(), []plugins.Target{target}, config)
if err != nil {
log.Fatal(err)
}
// Process results
for _, result := range results {
fmt.Printf("%s:%d - %s (%s)\n",
result.Host, result.Port,
result.Protocol, result.Transport)
}
}
参见 [examples/service-fingerprinting-example.go](https://github.com/praetorian-inc/nerva/blob/HEAD/examples/service-fingerprinting-example.go) 获取完整的工作示例。
## 用例
### 渗透测试
快速识别侦察期间发现的服务,以识别潜在攻击向量。
### 资产发现流水线
结合 Naabu 或 Masscan 进行大规模资产盘点:```sh
naabu -host 10.0.0.0/24 -silent | nerva --json | jq '.protocol'
CI/CD 安全扫描
集成到部署流水线中,以验证仅曝露预期的服务。
漏洞赏金侦察
快速枚举跨范围目标的服务,以发现有趣的端点。
电信网络分析
使用 SCTP 传输(Linux)识别 LTE/5G 网络中的 Diameter 节点:```sh nerva -t mme.telecom.local:3868 -S --json
## 架构```mermaid
graph LR
A[host:port input] --> B[Target Parser]
B --> C[Scan Engine]
C --> D{Transport}
D -->|TCP| E[TCP Plugins]
D -->|UDP| F[UDP Plugins]
D -->|SCTP| G[SCTP Plugins]
E --> H[Service Detection]
F --> H
G --> H
H --> I[Metadata Extraction]
I --> J[JSON/CSV/Text Output]
为什么选择 Nerva?
对比 Nmap
- 更智能的默认设置:Nerva 会根据端口号首先检查最可能的协议
- 结构化输出:原生 JSON/CSV 支持,便于解析和管道集成
- 专注:仅进行服务指纹识别 — 配合专用端口扫描器进行发现
对比 zgrab2
- 自动检测:无需提前指定协议
- 更简单的用法:
nerva -t host:portvsecho host | zgrab2 http -p port
故障排除
无输出
原因:端口关闭或未检测到受支持的服务。
解决方案:验证端口是否开放:```sh nc -zv example.com 80
### 超时错误
**原因**:默认2秒超时对于慢速服务来说太短。
**解决方法**:增加超时时间:```sh
nerva -t example.com:80 -w 5000 # 5 seconds
未检测到的 UDP 服务
原因:默认情况下 UDP 扫描处于禁用状态。
解决方法:使用 -U 标志进行启用(可能需要 root 权限):```sh
sudo nerva -t example.com:53 -U
### SCTP 无法工作
**原因**:SCTP仅支持Linux系统。
**解决方案**:在Linux系统或容器中运行:```sh
docker run --rm nerva -t telecom:3868 -S
术语
- 服务:端口上运行的网络服务(SSH、HTTP、PostgreSQL 等)
- 指纹识别:检测并识别服务类型、版本和配置
- 插件:协议特定的检测模块
- 快速模式:仅扫描每种协议的默认端口(80/20 优化)
- 传输层:网络层协议(TCP、UDP 或 SCTP)
支持
如果您觉得 Nerva 有用,请考虑给它一个星标:
贡献
我们欢迎贡献!请参阅 CONTRIBUTING.md 了解指南。
许可证
Apache 2.0 — 详见 LICENSE。
致谢
Nerva 是 fingerprintx 的一个维护分支,最初由 Praetorian 2022 年实习生团队开发: