README.md

April 10, 2026 · View on GitHub

Nerva - Fast service fingerprinting CLI for network reconnaissance supporting 170+ protocols

Nerva
Nerva: Fast Service Fingerprinting CLI

Release Build Status Go Report Card License Stars

FeaturesInstallationQuick StartUsageProtocolsLibraryUse CasesTroubleshooting

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.

Features

  • 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

Installation

Releases

Download a prebuilt binary from the Releases page.

From GitHub

go install github.com/praetorian-inc/nerva/cmd/nerva@latest

From Source

git clone https://github.com/praetorian-inc/nerva.git
cd nerva
go build ./cmd/nerva
./nerva -h

Docker

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

Quick Start

Fingerprint a single target:

nerva -t example.com:22
# ssh://example.com:22

Get 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

Usage

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

Flags

FlagShortDescriptionDefault
--targets-tTarget or comma-separated target list
--list-lInput file containing targets
--output-oOutput file pathstdout
--jsonOutput in JSON formatfalse
--csvOutput in CSV formatfalse
--misconfigsEnable security misconfiguration detectionfalse
--proxyProxy URL (e.g. socks5://127.0.0.1:1080)
--proxy-authSOCKS5 Proxy Auth (e.g. username:password)
--dns-orderDNS resolution order: p, l, lp, pllp
--fast-fFast mode (default ports only)false
--capabilities-cList available capabilities and exitfalse
--udp-URun UDP pluginsfalse
--sctp-SRun SCTP plugins (Linux only)false
--timeout-wTimeout in milliseconds2000
--verbose-vVerbose output to stderrfalse
--workers-WConcurrent scan workers50
--max-host-conn-HMax concurrent connections per host IP (0=unlimited)0
--rate-limit-RMax scans per second globally (0=unlimited)0

Examples

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 (may require root):

sudo nerva -t example.com:53 -U
# dns://example.com:53

SCTP scanning (Linux only):

nerva -t telecom-server:3868 -S
# diameter://telecom-server:3868

Fast 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

Security Misconfiguration Detection

Nerva can identify common security misconfigurations when enabled with --misconfigs:

nerva -t example.com:2375 --misconfigs --json

Detected misconfigurations:

Finding IDSeverityDescription
docker-unauth-apiCriticalDocker API accessible without authentication
x11-unauth-accessCriticalX11 server allows unauthenticated connections
smb-signing-not-requiredMediumSMB signing not required (relay attack risk)
telnet-cleartextMediumTelnet transmits credentials in cleartext
vnc-detectedMediumVNC detected (often weak authentication)
ssh-password-authMediumServer allows password authentication
ssh-weak-cipherLowServer offers weak ciphers (RC4, 3DES, Blowfish)
ssh-weak-kexLowServer offers weak key exchange algorithms
ssh-weak-macLowServer offers weak MAC algorithms
ftp-cleartextLowFTP 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"
    }
  ]
}

Proxy Support

Nerva supports routing scanning traffic through SOCKS5 and HTTP proxies with configurable DNS resolution.

Supported proxy schemes:

  • socks5:// - SOCKS5 proxy with local DNS resolution
  • socks5h:// - SOCKS5 proxy with proxy-side DNS resolution (always)
  • http:// - HTTP CONNECT proxy
  • https:// - HTTPS CONNECT proxy

Proxy authentication:

# Inline authentication (URL format)
nerva -t example.com:80 --proxy socks5://username:password@127.0.0.1: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):

OptionStrategyUse Case
lLocal onlyStandard local DNS (default)
pProxy onlyForce proxy-side DNS resolution
lpLocal, fallback to proxyTry local first, use proxy on failure
plProxy, fallback to localTry 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:9050

UDP through proxy:

# UDP scanning through SOCKS5 proxy (limited support)
nerva -t target.com:161 --proxy socks5://127.0.0.1:1080 --udp

⚠️ UDP Limitations: UDP through SOCKS5 has limited support. Not all SOCKS5 servers support UDP association. Local UDP fallback may occur.

Parallel 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 printed

Supported Protocols

170+ service detection plugins across TCP, UDP, and SCTP:

HTTP Fingerprint Modules (66)

Technology detection for web services, organized by category:

Firewalls & Network Security (12)

ModuleDescription
CheckpointCheck Point Security Gateway
Cisco ASA/FTDCisco firewall/VPN appliances
FortiGateFortinet firewall/VPN
GlobalProtectPalo Alto Networks VPN
JuniperJuniper SRX firewalls
OPNsenseOPNsense firewall
pfSensepfSense firewall
SonicWallSonicWall firewalls
AnyConnectCisco AnyConnect SSL VPN
Cisco ExpresswayCisco collaboration gateway
BigIPF5 BIG-IP load balancer
WinRMWindows Remote Management

AI/LLM & Machine Learning (6)

ModuleDescription
OllamaSelf-hosted LLM inference server
LocalAISelf-hosted LLM inference (OpenAI-compatible)
Open WebUILLM web interface (ChatGPT-style)
TritonNVIDIA Triton Inference Server
WeaviateVector database for AI
ChromaDBVector database

Databases & Data Stores (12)

ModuleDescription
ArangoDBMulti-model database
CockroachDBDistributed SQL database
CouchDBApache document database
ElasticsearchSearch and analytics engine
etcdDistributed key-value store
MilvusVector database
MinIOS3-compatible object storage
PineconeVector database
Redis CommanderRedis web management UI
TiDBDistributed SQL database
YugabyteDBDistributed SQL database
QdrantVector database

DevOps & Infrastructure (14)

ModuleDescription
ArtifactoryJFrog artifact repository
ConsulHashiCorp service mesh
Docker RegistryContainer image registry
GiteaSelf-hosted Git service
GrafanaObservability platform
HarborContainer registry
JaegerDistributed tracing
JenkinsCI/CD automation
KubernetesContainer orchestration API
PortainerDocker management UI
PrometheusMonitoring system
Swagger/OpenAPIAPI documentation
TeamCityCI/CD server
VaultHashiCorp secrets management

Web Servers & Frameworks (10)

ModuleDescription
Apache HTTPDApache HTTP Server
Express.jsNode.js web framework
GoAheadEmbedded web server
GotenbergPDF generation service
GuacamoleApache remote desktop gateway
SOAPWeb services
TengineAlibaba web server
TomcatApache Tomcat
WordPressCMS platform
UPnPUniversal Plug and Play

Enterprise & Business (8)

ModuleDescription
AEMAdobe Experience Manager
Dynamics 365Microsoft Dynamics 365 / Power Apps
Oracle Service CloudOracle CRM platform
SAP NetWeaverSAP enterprise platform
SplunkLog management platform
VMware HorizonVirtual desktop infrastructure
QNAP QTSNAS management
ExchangeMicrosoft Exchange Server

Home & IoT (2)

ModuleDescription
Home AssistantHome automation platform
UniFi/EdgeOSUbiquiti network devices

Other (2)

ModuleDescription
Go pprofGo profiling endpoints
NATSMessage broker

Databases (20)

ProtocolTransportDefault Ports
PostgreSQLTCP5432
MySQLTCP3306
MSSQLTCP1433
OracleTCP1521
MongoDBTCP27017
RedisTCP/TLS6379, 6380
CassandraTCP9042
InfluxDBTCP8086
Neo4jTCP/TLS7687
DB2TCP446, 50000
SybaseTCP5000
FirebirdTCP3050
MemcachedTCP11211
ZooKeeperTCP2181
MilvusTCP19530, 9091
CouchDBHTTP5984
ElasticsearchHTTP9200
ArangoDBHTTP8529
ChromaDBHTTP8000
PineconeHTTP443

Remote Access (6)

ProtocolTransportDefault Ports
SSHTCP22, 2222
RDPTCP/TLS3389
TelnetTCP23
VNCTCP5900
AnyDeskTCP7070
TeamViewerTCP5938

Web & API (2)

ProtocolTransportNotes
HTTP/HTTPSTCPHTTP/2, tech detection via Wappalyzer
KubernetesTCPAPI server detection

Messaging & Queues (10)

ProtocolTransportDefault Ports
KafkaTCP/TLS9092, 9093
MQTT 3/5TCP/TLS1883, 8883
AMQPTCP/TLS5672, 5671
ActiveMQTCP/TLS61616, 61617
NATSTCP/TLS4222, 6222
PulsarTCP/TLS6650, 6651
SMTPTCP/TLS25, 465, 587
POP3TCP/TLS110, 995
IMAPTCP/TLS143, 993
SMPPTCP2775, 2776

File & Directory Services (7)

ProtocolTransportDefault Ports
FTPTCP21
SMBTCP445
NFSTCP/UDP2049
RsyncTCP873
TFTPUDP69
SVNTCP3690
LDAPTCP/TLS389, 636

Network Services (11)

ProtocolTransportDefault Ports
DNSTCP/UDP53
DHCPUDP67, 68
NTPUDP123
SNMPUDP161
NetBIOS-NSUDP137
STUNUDP3478
OpenVPNUDP1194
IPsecUDP500
IPMIUDP623
CoAPUDP5683
EchoTCP/UDP7

Industrial Control Systems (18)

ProtocolTransportDefault PortsNotes
ModbusTCP502SCADA/PLC
S7commTCP102Siemens PLC
EtherNet/IPTCP44818Rockwell/Allen-Bradley
PROFINETTCP34962-34964Siemens industrial
BACnetUDP47808Building automation
OPC UATCP4840Industrial interop
OMRON FINSTCP/UDP9600OMRON PLC
MELSEC-QTCP5006, 5007Mitsubishi PLC
KNXnet/IPUDP3671Building automation
IEC 104TCP2404Power grid SCADA
DNP3TCP20000Power grid SCADA
CodesysTCP1200, 2455PLC runtime
FoxTCP1911Tridium Niagara
PC WORXTCP1962Phoenix Contact
ProConOSTCP20547PLC runtime
HART-IPTCP5094Process automation
EtherCATUDP34980Motion control
Crimson v3TCP789Red Lion HMI
PCOMTCP20256Unitronics PLC
GE SRTPTCP18245GE PLC
ATGTCP10001Tank gauges

Telecom & VoIP (17)

ProtocolTransportDefault PortsNotes
DiameterTCP/SCTP3868LTE/5G AAA
M3UASCTP2905SS7 over IP
M2UASCTP2904MTP2 User Adaptation
M2PASCTP3565MTP2 Peer Adaptation
SGsAPSCTP29118Circuit-switched fallback
X2APSCTP36422LTE inter-eNodeB
IUASCTP9900ISDN over IP
SIPTCP/UDP/TLS5060, 5061VoIP signaling
MEGACO/H.248UDP2944, 2945Media gateway
MGCPUDP2427, 2727Media gateway
H.323TCP1720Video conferencing
SCCP/SkinnyTCP2000, 2443Cisco IP phones
IAX2UDP4569Asterisk protocol
GTP-CUDP2123GPRS control
GTP-UUDP2152GPRS user plane
GTP'UDP3386GPRS charging
PFCPUDP88055G user plane

VPN & Security (11)

ProtocolTransportDefault Ports
SSHTCP22, 2222
OpenVPNUDP1194
WireGuardUDP51820
IPsec/IKEv2UDP500, 4500
L2TPUDP1701
SSTPTCP443
GlobalProtectHTTP443
AnyConnectHTTP443
FortiGateHTTP443
STUN/TURNUDP3478, 5349
KerberosTCP88

Remote Access & Management (10)

ProtocolTransportDefault Ports
RDPTCP/TLS3389
VNCTCP5900
TelnetTCP23
WinRMHTTP5985, 5986
IPMIUDP623
SNMPUDP161
Zabbix AgentTCP10050
NRPETCP/TLS5666
DockerTCP/TLS2375, 2376
X11TCP6000-6063

Developer Tools (8)

ProtocolTransportDefault Ports
HTTP/HTTPSTCP80, 443, 8080, 8443
Java RMITCP1099
JDWPTCP5005
RTSPTCP554
Linux RPCTCP111
JetDirectTCP9100
CUPS/IPPTCP631
SonarQubeTCP9000

Library Usage

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.

Use Cases

Penetration Testing

Rapidly fingerprint services discovered during reconnaissance to identify potential attack vectors.

Asset Discovery Pipelines

Combine with Naabu or Masscan for large-scale asset inventory:

naabu -host 10.0.0.0/24 -silent | nerva --json | jq '.protocol'

CI/CD Security Scanning

Integrate into deployment pipelines to verify only expected services are exposed.

Bug Bounty Reconnaissance

Quickly enumerate services across scope targets to find interesting endpoints.

Telecom Network Analysis

Fingerprint Diameter nodes in LTE/5G networks using SCTP transport (Linux):

nerva -t mme.telecom.local:3868 -S --json

Architecture

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]

Why Nerva?

vs Nmap

  • 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

vs zgrab2

  • Auto-detection: No need to specify protocol ahead of time
  • Simpler usage: nerva -t host:port vs echo host | zgrab2 http -p port

Troubleshooting

No output

Cause: Port is closed or no supported service detected.

Solution: Verify the port is open:

nc -zv example.com 80

Timeout errors

Cause: Default 2-second timeout too short for slow services.

Solution: Increase timeout:

nerva -t example.com:80 -w 5000  # 5 seconds

UDP services not detected

Cause: UDP scanning disabled by default.

Solution: Enable with -U flag (may require root):

sudo nerva -t example.com:53 -U

SCTP not working

Cause: SCTP only supported on Linux.

Solution: Run on a Linux system or container:

docker run --rm nerva -t telecom:3868 -S

Terminology

  • 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)

Support

If you find Nerva useful, please consider giving it a star:

GitHub stars

Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

License

Apache 2.0 — see LICENSE for details.

Acknowledgements

Nerva is a maintained fork of fingerprintx, originally developed by Praetorian's intern class of 2022: