Features • Installation • Quick Start • Usage • Protocols • Library • Use Cases • Troubleshooting
High-performance service fingerprinting written in Go. Identify 170+ network protocols across TCP, UDP, and SCTP transports with rich metadata extraction.
Nerva rapidly detects and identifies services running on open network ports. Use it alongside port scanners like Naabu to fingerprint discovered services, or integrate it into your security pipelines for automated reconnaissance.
- 170+ Protocol Plugins — Databases, remote access, web services, messaging, industrial, and telecom protocols
- 76 HTTP Fingerprinters — Detect web technologies including firewalls, databases, AI/LLM servers, and more
- Security Misconfiguration Detection — Identify common security issues like unauthenticated APIs and cleartext protocols (
--misconfigs) - Multi-Transport Support — TCP (default), UDP (
--udp), and SCTP (--sctp, Linux only) - Proxy Support — Route scanning traffic transparently through SOCKS5 or HTTP proxies with configurable DNS resolution
- Rich Metadata — Extract versions, configurations, and security-relevant details from each service
- Fast Mode — Scan only default ports for rapid reconnaissance (
--fast) - Flexible Output — JSON, CSV, or human-readable formats
- Pipeline Friendly — Pipe from Naabu, Nmap, or any tool that outputs
host:port - Go Library — Import directly into your Go applications
Download a prebuilt binary from the Releases page.
go install github.com/praetorian-inc/nerva/cmd/nerva@latest
git clone https://github.com/praetorian-inc/nerva.git
cd nerva
go build ./cmd/nerva
./nerva -hgit 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
Fingerprint a single target:
nerva -t example.com:22
# ssh://example.com:22Get detailed JSON metadata:
nerva -t example.com:22 --json
# {"host":"example.com","ip":"93.184.216.34","port":22,"protocol":"ssh","transport":"tcp","metadata":{...}}Pipe from a port scanner:
naabu -host example.com -silent | nerva # http://example.com:80 # ssh://example.com:22 # https://example.com:443
The full reference — every subcommand, alias and flag, including the ones hidden from --help — is generated into docs/CLI.md.
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
Multiple targets:
nerva -t example.com:22,example.com:80,example.com:443
From file:
nerva -l targets.txt --json -o results.json
UDP scanning:
nerva -t example.com:53 -U
# dns://example.com:53SCTP scanning (Linux only):
nerva -t telecom-server:3868 -S
# diameter://telecom-server:3868Fast mode (default ports only):
nerva -l large-target-list.txt --fast --json
Proxy routing with remote DNS resolution:
nerva -t target.internal:80 --proxy socks5://127.0.0.1:1080 --dns-order p
Nerva can identify common security misconfigurations when enabled with --misconfigs:
nerva -t example.com:2375 --misconfigs --json
Detected misconfigurations:
| Finding ID | Severity | Description |
|---|---|---|
docker-unauth-api |
Critical | Docker API accessible without authentication |
x11-unauth-access |
Critical | X11 server allows unauthenticated connections |
dotnet-remoting-http-exposed |
High | .NET Remoting HTTP channel exposed (deserialization risk) |
smb-signing-not-required |
Medium | SMB signing not required (relay attack risk) |
telnet-cleartext |
Medium | Telnet transmits credentials in cleartext |
vnc-detected |
Medium | VNC detected (often weak authentication) |
ssh-password-auth |
Medium | Server allows password authentication |
ssh-weak-cipher |
Low | Server offers weak ciphers (RC4, 3DES, Blowfish) |
ssh-weak-kex |
Low | Server offers weak key exchange algorithms |
ssh-weak-mac |
Low | Server offers weak MAC algorithms |
ftp-cleartext |
Low | FTP transmits credentials in cleartext |
Example output with misconfigs:
{
"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 supports routing scanning traffic through SOCKS5 and HTTP proxies with configurable DNS resolution.
Supported proxy schemes:
socks5://- SOCKS5 proxy with local DNS resolutionsocks5h://- SOCKS5 proxy with proxy-side DNS resolution (always)http://- HTTP CONNECT proxyhttps://- HTTPS CONNECT proxy
Proxy authentication:
# 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 resolution strategies (--dns-order):
| Option | Strategy | Use Case |
|---|---|---|
l |
Local only | Standard local DNS (default) |
p |
Proxy only | Force proxy-side DNS resolution |
lp |
Local, fallback to proxy | Try local first, use proxy on failure |
pl |
Proxy, fallback to local | Try proxy first, use local on failure |
Note: socks5h:// scheme automatically forces proxy-side DNS (equivalent to --dns-order p)
Tor scanning example:
# Scan .onion services through Tor (SOCKS5 proxy on port 9050)
nerva -t http://example.onion:80 --proxy socks5h://127.0.0.1:9050UDP through proxy:
# UDP scanning through SOCKS5 proxy (limited support)
nerva -t target.com:161 --proxy socks5://127.0.0.1:1080 --udpParallel scanning with rate limiting:
nerva -l large-target-list.txt -W 100 -H 5 -R 50 -v
Graceful shutdown (Ctrl+C returns partial results):
nerva -l huge-target-list.txt -W 50 -v
# Press Ctrl+C to stop — collected results are still printed170+ service detection plugins across TCP, UDP, and SCTP:
Technology detection for web services, organized by category:
| Module | Description |
|---|---|
| Checkpoint | Check Point Security Gateway |
| Cisco ASA/FTD | Cisco firewall/VPN appliances |
| FortiGate | Fortinet firewall/VPN |
| GlobalProtect | Palo Alto Networks VPN |
| Juniper | Juniper SRX firewalls |
| OPNsense | OPNsense firewall |
| pfSense | pfSense firewall |
| SonicWall | SonicWall firewalls |
| AnyConnect | Cisco AnyConnect SSL VPN |
| Cisco Expressway | Cisco collaboration gateway |
| BigIP | F5 BIG-IP load balancer |
| WinRM | Windows Remote Management |
| Module | Description |
|---|---|
| Ollama | Self-hosted LLM inference server |
| LocalAI | Self-hosted LLM inference (OpenAI-compatible) |
| Open WebUI | LLM web interface (ChatGPT-style) |
| Triton | NVIDIA Triton Inference Server |
| Weaviate | Vector database for AI |
| ChromaDB | Vector database |
| Module | Description |
|---|---|
| ArangoDB | Multi-model database |
| CockroachDB | Distributed SQL database |
| CouchDB | Apache document database |
| Elasticsearch | Search and analytics engine |
| etcd | Distributed key-value store |
| Milvus | Vector database |
| MinIO | S3-compatible object storage |
| Pinecone | Vector database |
| Redis Commander | Redis web management UI |
| TiDB | Distributed SQL database |
| YugabyteDB | Distributed SQL database |
| Qdrant | Vector database |
| Module | Description |
|---|---|
| Artifactory | JFrog artifact repository |
| Consul | HashiCorp service mesh |
| Docker Registry | Container image registry |
| Gitea | Self-hosted Git service |
| Grafana | Observability platform |
| Harbor | Container registry |
| Jaeger | Distributed tracing |
| Jenkins | CI/CD automation |
| Kubernetes | Container orchestration API |
| Portainer | Docker management UI |
| Prometheus | Monitoring system |
| Swagger/OpenAPI | API documentation |
| TeamCity | CI/CD server |
| Vault | HashiCorp secrets management |
| Module | Description |
|---|---|
| Apache HTTPD | Apache HTTP Server |
| Express.js | Node.js web framework |
| GoAhead | Embedded web server |
| Gotenberg | PDF generation service |
| Guacamole | Apache remote desktop gateway |
| SOAP | Web services |
| Tengine | Alibaba web server |
| Tomcat | Apache Tomcat |
| WordPress | CMS platform |
| UPnP | Universal Plug and Play |
| Module | Description |
|---|---|
| AEM | Adobe Experience Manager |
| Dynamics 365 | Microsoft Dynamics 365 / Power Apps |
| Oracle Service Cloud | Oracle CRM platform |
| SAP NetWeaver | SAP enterprise platform |
| Splunk | Log management platform |
| VMware Horizon | Virtual desktop infrastructure |
| QNAP QTS | NAS management |
| Exchange | Microsoft Exchange Server |
| Module | Description |
|---|---|
| Home Assistant | Home automation platform |
| UniFi/EdgeOS | Ubiquiti network devices |
| Module | Description |
|---|---|
| .NET Remoting HTTP | Microsoft .NET Remoting HTTP channel |
| Go pprof | Go profiling endpoints |
| NATS | Message broker |
| Protocol | Transport | Default Ports |
|---|---|---|
| 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 |
| Protocol | Transport | Default Ports |
|---|---|---|
| SSH | TCP | 22, 2222 |
| RDP | TCP/TLS | 3389 |
| Telnet | TCP | 23 |
| VNC | TCP | 5900 |
| AnyDesk | TCP | 7070 |
| TeamViewer | TCP | 5938 |
| Splashtop (shared RAT detector) | TCP | 6783–6785 |
| Dameware Mini Remote Control (shared RAT detector) | TCP | 6129 |
| NetSupport remote-control family (shared RAT detector) | TCP | 5405 |
| RealVNC proprietary RFB / branded license failures (shared RAT detector) | TCP | 5900 |
| NoMachine NX (shared RAT detector) | TCP | 4000 |
| Radmin (shared RAT detector) | TCP | 4899 |
| RustDesk-compatible LAN discovery (shared RAT detector) | UDP | 21119 |
| LogMeIn / LogMeIn Web Gateway | HTTP/HTTPS | HTTP service port |
The additional remote-access detectors in pkg/plugins/services/rat/ reuse
Nerva's shared protocol and HTTP/HTTPS engines. They identify services, not
installation or unattended-access settings. Port numbers alone are not detections.
| Protocol | Transport | Notes |
|---|---|---|
| HTTP/HTTPS | TCP | HTTP/2, tech detection via Wappalyzer |
| Kubernetes | TCP | API server detection |
| Protocol | Transport | Default Ports |
|---|---|---|
| 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 |
| Protocol | Transport | Default Ports |
|---|---|---|
| FTP | TCP | 21 |
| SMB | TCP | 445 |
| NFS | TCP/UDP | 2049 |
| Rsync | TCP | 873 |
| TFTP | UDP | 69 |
| SVN | TCP | 3690 |
| LDAP | TCP/TLS | 389, 636 |
| Protocol | Transport | Default Ports |
|---|---|---|
| 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 |
| Protocol | Transport | Default Ports | Notes |
|---|---|---|---|
| Modbus | TCP | 502 | SCADA/PLC |
| S7comm | TCP | 102 | Siemens PLC |
| EtherNet/IP | TCP | 44818 | Rockwell/Allen-Bradley |
| PROFINET | TCP | 34962-34964 | Siemens industrial |
| BACnet | UDP | 47808 | Building automation |
| OPC UA | TCP | 4840 | Industrial interop |
| OMRON FINS | TCP/UDP | 9600 | OMRON PLC |
| MELSEC-Q | TCP | 5006, 5007 | Mitsubishi PLC |
| KNXnet/IP | UDP | 3671 | Building automation |
| IEC 104 | TCP | 2404 | Power grid SCADA |
| DNP3 | TCP | 20000 | Power grid SCADA |
| Codesys | TCP | 1200, 2455 | PLC runtime |
| Fox | TCP | 1911 | Tridium Niagara |
| PC WORX | TCP | 1962 | Phoenix Contact |
| ProConOS | TCP | 20547 | PLC runtime |
| HART-IP | TCP | 5094 | Process automation |
| EtherCAT | UDP | 34980 | Motion control |
| Crimson v3 | TCP | 789 | Red Lion HMI |
| PCOM | TCP | 20256 | Unitronics PLC |
| GE SRTP | TCP | 18245 | GE PLC |
| ATG | TCP | 10001 | Tank gauges |
| Protocol | Transport | Default Ports | Notes |
|---|---|---|---|
| Diameter | TCP/SCTP | 3868 | LTE/5G AAA |
| M3UA | SCTP | 2905 | SS7 over IP |
| M2UA | SCTP | 2904 | MTP2 User Adaptation |
| M2PA | SCTP | 3565 | MTP2 Peer Adaptation |
| SGsAP | SCTP | 29118 | Circuit-switched fallback |
| X2AP | SCTP | 36422 | LTE inter-eNodeB |
| IUA | SCTP | 9900 | ISDN over IP |
| SIP | TCP/UDP/TLS | 5060, 5061 | VoIP signaling |
| MEGACO/H.248 | UDP | 2944, 2945 | Media gateway |
| MGCP | UDP | 2427, 2727 | Media gateway |
| H.323 | TCP | 1720 | Video conferencing |
| SCCP/Skinny | TCP | 2000, 2443 | Cisco IP phones |
| IAX2 | UDP | 4569 | Asterisk protocol |
| GTP-C | UDP | 2123 | GPRS control |
| GTP-U | UDP | 2152 | GPRS user plane |
| GTP' | UDP | 3386 | GPRS charging |
| PFCP | UDP | 8805 | 5G user plane |
| Protocol | Transport | Default Ports |
|---|---|---|
| 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 |
| Protocol | Transport | Default Ports |
|---|---|---|
| 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 |
| Protocol | Transport | Default Ports |
|---|---|---|
| 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 |
Import Nerva into your Go applications:
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) } }
See examples/service-fingerprinting-example.go for a complete working example.
Rapidly fingerprint services discovered during reconnaissance to identify potential attack vectors.
Combine with Naabu or Masscan for large-scale asset inventory:
naabu -host 10.0.0.0/24 -silent | nerva --json | jq '.protocol'
Integrate into deployment pipelines to verify only expected services are exposed.
Quickly enumerate services across scope targets to find interesting endpoints.
Fingerprint Diameter nodes in LTE/5G networks using SCTP transport (Linux):
nerva -t mme.telecom.local:3868 -S --json
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]
- Smarter defaults: Nerva checks the most likely protocol first based on port number
- Structured output: Native JSON/CSV support for easy parsing and pipeline integration
- Focused: Service fingerprinting only — pair with dedicated port scanners for discovery
- Auto-detection: No need to specify protocol ahead of time
- Simpler usage:
nerva -t host:portvsecho host | zgrab2 http -p port
Cause: Port is closed or no supported service detected.
Solution: Verify the port is open:
nc -zv example.com 80
Cause: Default 2-second timeout too short for slow services.
Solution: Increase timeout:
nerva -t example.com:80 -w 5000 # 5 secondsCause: UDP scanning disabled by default.
Solution: Enable with -U flag:
nerva -t example.com:53 -U
Nerva UDP scans use connected datagram sockets and do not require root.
Cause: SCTP only supported on Linux.
Solution: Run on a Linux system or container:
docker run --rm nerva -t telecom:3868 -S
- Service: A network service running on a port (SSH, HTTP, PostgreSQL, etc.)
- Fingerprinting: Detecting and identifying the service type, version, and configuration
- Plugin: A protocol-specific detection module
- Fast Mode: Scanning only the default port for each protocol (80/20 optimization)
- Transport: Network layer protocol (TCP, UDP, or SCTP)
If you find Nerva useful, please consider giving it a star:
We welcome contributions! See CONTRIBUTING.md for guidelines.
Apache 2.0 — see LICENSE for details.
Nerva is a maintained fork of fingerprintx, originally developed by Praetorian's intern class of 2022:
- Soham Roy
- Jue Huang
- Henry Jung
- Tristan Wiesepape
- Joseph Henry
- Noah Tutt
- Nathan Sportsman