
nerva v1.69.2
CLI de identificación rápida de servicios para más de 170 protocolos (TCP/UDP/SCTP) - creado por Praetorian
Nerva
Nerva: CLI de fingerprinting de servicios rápido
Características • Instalación • Inicio rápido • Uso • Protocolos • Biblioteca • Casos de uso • Solución de problemas
Fingerprinting de servicios de alto rendimiento escrito en Go. Identifica más de 170 protocolos de red en los transportes TCP, UDP y SCTP con extracción de metadatos enriquecidos.
Nerva detecta e identifica rápidamente servicios que se ejecutan en puertos de red abiertos. Úsalo junto con escáneres de puertos como Naabu para hacer fingerprinting de los servicios descubiertos, o intégralo en tus pipelines de seguridad para reconocimiento automatizado.
Características
- Más de 170 plugins de protocolos — Bases de datos, acceso remoto, servicios web, mensajería, protocolos industriales y de telecomunicaciones
- 76 fingerprinters HTTP — Detecta tecnologías web, incluidos firewalls, bases de datos, servidores de IA/LLM y más
- Detección de malas configuraciones de seguridad — Identifica problemas de seguridad comunes como APIs sin autenticación y protocolos en texto claro (
--misconfigs) - Soporte multi-transporte — TCP (predeterminado), UDP (
--udp) y SCTP (--sctp, solo Linux) - Soporte de proxy — Enruta el tráfico de escaneo de forma transparente a través de proxies SOCKS5 o HTTP con resolución DNS configurable
- Metadatos enriquecidos — Extrae versiones, configuraciones y detalles relevantes para la seguridad de cada servicio
- Modo rápido — Escanea solo los puertos predeterminados para un reconocimiento rápido (
--fast) - Salida flexible — Formatos JSON, CSV o legible por humanos
- Compatible con pipelines — Canaliza desde Naabu, Nmap o cualquier herramienta que genere
host:port - Biblioteca Go — Impórtala directamente en tus aplicaciones Go
Instalación
Releases
Descarga un binario precompilado desde la página de Releases.
Desde GitHub```sh
go install github.com/praetorian-inc/nerva/cmd/nerva@latest
### Desde el código fuente```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
## Inicio rápido
Huella digital de un único objetivo:```sh
nerva -t example.com:22
# ssh://example.com:22
Obtener metadatos JSON detallados:```sh nerva -t example.com:22 --json
{"host":"example.com","ip":"93.184.216.34","port":22,"protocol":"ssh","transport":"tcp","metadata":{...}}
Canalizar desde un escáner de puertos:```sh
naabu -host example.com -silent | nerva
# http://example.com:80
# ssh://example.com:22
# https://example.com:443
La referencia completa — cada subcomando, alias y flag, incluidos los ocultos de --help — se genera en docs/CLI.md.
Uso```
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
### Ejemplos
**Múltiples objetivos:**```sh
nerva -t example.com:22,example.com:80,example.com:443
Del archivo:```sh nerva -l targets.txt --json -o results.json
**Escaneo UDP** (puede requerir root):```sh
sudo nerva -t example.com:53 -U
# dns://example.com:53
Escaneo SCTP (solo Linux):```sh nerva -t telecom-server:3868 -S
diameter://telecom-server:3868
**Modo rápido** (solo puertos predeterminados):```sh
nerva -l large-target-list.txt --fast --json
Enrutamiento de proxy con resolución DNS remota:```sh nerva -t target.internal:80 --proxy socks5://127.0.0.1:1080 --dns-order p
### Detección de configuraciones de seguridad incorrectas
Nerva puede identificar configuraciones de seguridad incorrectas comunes cuando se habilita con `--misconfigs`:```sh
nerva -t example.com:2375 --misconfigs --json
Misconfiguraciones detectadas:
| ID de hallazgo | Severidad | Descripción |
|---|---|---|
docker-unauth-api | Crítica | API de Docker accesible sin autenticación |
x11-unauth-access | Crítica | El servidor X11 permite conexiones no autenticadas |
smb-signing-not-required | Media | Firma SMB no requerida (riesgo de ataque de retransmisión) |
telnet-cleartext | Media | Telnet transmite credenciales en texto claro |
vnc-detected | Media | VNC detectado (a menudo con autenticación débil) |
ssh-password-auth | Media | El servidor permite autenticación por contraseña |
ssh-weak-cipher | Baja | El servidor ofrece cifrados débiles (RC4, 3DES, Blowfish) |
ssh-weak-kex | Baja | El servidor ofrece algoritmos de intercambio de claves débiles |
ssh-weak-mac | Baja | El servidor ofrece algoritmos MAC débiles |
ftp-cleartext | Baja | FTP transmite credenciales en texto claro |
Ejemplo de salida con misconfiguraciones:```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" } ] }
### Soporte de Proxy
Nerva admite el enrutamiento del tráfico de escaneo a través de proxies SOCKS5 y HTTP con resolución DNS configurable.
**Esquemas de proxy compatibles:**
- `socks5://` - Proxy SOCKS5 con resolución DNS local
- `socks5h://` - Proxy SOCKS5 con resolución DNS del lado del proxy (siempre)
- `http://` - Proxy HTTP CONNECT
- `https://` - Proxy HTTPS CONNECT
**Autenticación de proxy:**```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
Estrategias de resolución DNS (--dns-order):
| Opción | Estrategia | Caso de uso |
|---|---|---|
l | Solo local | DNS local estándar (predeterminado) |
p | Solo proxy | Forzar la resolución DNS del lado del proxy |
lp | Local, con fallback a proxy | Intentar local primero, usar proxy en caso de fallo |
pl | Proxy, con fallback a local | Intentar proxy primero, usar local en caso de fallo |
Nota: el esquema socks5h:// fuerza automáticamente el DNS del lado del proxy (equivalente a --dns-order p)
Ejemplo de escaneo con 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 a través de proxy:**```sh
# UDP scanning through SOCKS5 proxy (limited support)
nerva -t target.com:161 --proxy socks5://127.0.0.1:1080 --udp
⚠️ Limitaciones de UDP: UDP a través de SOCKS5 tiene soporte limitado. No todos los servidores SOCKS5 admiten la asociación UDP. Puede ocurrir una reserva local de UDP.
Escaneo paralelo con limitación de velocidad:```sh nerva -l large-target-list.txt -W 100 -H 5 -R 50 -v
**Apagado controlado** (Ctrl+C devuelve resultados parciales):```sh
nerva -l huge-target-list.txt -W 50 -v
# Press Ctrl+C to stop — collected results are still printed
Protocolos compatibles
Más de 170 plugins de detección de servicios en TCP, UDP y SCTP:
Módulos de huella HTTP (66)
Detección de tecnología para servicios web, organizados por categoría:
Cortafuegos y seguridad de red (12)
| Módulo | Descripción |
|---|---|
| Checkpoint | Check Point Security Gateway |
| Cisco ASA/FTD | Aparatos de cortafuegos/VPN de Cisco |
| FortiGate | Cortafuegos/VPN de Fortinet |
| GlobalProtect | VPN de Palo Alto Networks |
| Juniper | Cortafuegos Juniper SRX |
| OPNsense | Cortafuegos OPNsense |
| pfSense | Cortafuegos pfSense |
| SonicWall | Cortafuegos SonicWall |
| AnyConnect | VPN SSL Cisco AnyConnect |
| Cisco Expressway | Pasarela de colaboración de Cisco |
| BigIP | Balanceador de carga F5 BIG-IP |
| WinRM | Administración remota de Windows |
IA/LLM y aprendizaje automático (6)
| Módulo | Descripción |
|---|---|
| Ollama | Servidor de inferencia LLM autoalojado |
| LocalAI | Inferencia LLM autoalojada (compatible con OpenAI) |
| Open WebUI | Interfaz web para LLM (estilo ChatGPT) |
| Triton | Servidor de inferencia NVIDIA Triton |
| Weaviate | Base de datos vectorial para IA |
| ChromaDB | Base de datos vectorial |
Bases de datos y almacenes de datos (12)
| Módulo | Descripción |
|---|---|
| ArangoDB | Base de datos multimodelo |
| CockroachDB | Base de datos SQL distribuida |
| CouchDB | Base de datos de documentos de Apache |
| Elasticsearch | Motor de búsqueda y analítica |
| etcd | Almacén de clave-valor distribuido |
| Milvus | Base de datos vectorial |
| MinIO | Almacenamiento de objetos compatible con S3 |
| Pinecone | Base de datos vectorial |
| Redis Commander | Interfaz web de administración de Redis |
| TiDB | Base de datos SQL distribuida |
| YugabyteDB | Base de datos SQL distribuida |
| Qdrant | Base de datos vectorial |
DevOps e infraestructura (14)
| Módulo | Descripción |
|---|---|
| Artifactory | Repositorio de artefactos de JFrog |
| Consul | Malla de servicios de HashiCorp |
| Docker Registry | Registro de imágenes de contenedores |
| Gitea | Servicio Git autoalojado |
| Grafana | Plataforma de observabilidad |
| Harbor | Registro de contenedores |
| Jaeger | Trazabilidad distribuida |
| Jenkins | Automatización CI/CD |
| Kubernetes | API de orquestación de contenedores |
| Portainer | Interfaz de administración de Docker |
| Prometheus | Sistema de monitorización |
| Swagger/OpenAPI | Documentación de API |
| TeamCity | Servidor CI/CD |
| Vault | Gestión de secretos de HashiCorp |
Servidores web y frameworks (10)
| Módulo | Descripción |
|---|---|
| Apache HTTPD | Servidor HTTP Apache |
| Express.js | Framework web para Node.js |
| GoAhead | Servidor web embebido |
| Gotenberg | Servicio de generación de PDF |
| Guacamole | Pasarela de escritorio remoto de Apache |
| SOAP | Servicios web |
| Tengine | Servidor web de Alibaba |
| Tomcat | Apache Tomcat |
| WordPress | Plataforma CMS |
| UPnP | Universal Plug and Play |
Empresarial y de negocio (8)
| Módulo | Descripción |
|---|---|
| AEM | Adobe Experience Manager |
| Dynamics 365 | Microsoft Dynamics 365 / Power Apps |
| Oracle Service Cloud | Plataforma CRM de Oracle |
| SAP NetWeaver | Plataforma empresarial SAP |
| Splunk | Plataforma de gestión de logs |
| VMware Horizon | Infraestructura de escritorio virtual |
| QNAP QTS | Administración de NAS |
| Exchange | Microsoft Exchange Server |
Hogar e IoT (2)
| Módulo | Descripción |
|---|---|
| Home Assistant | Plataforma de automatización del hogar |
| UniFi/EdgeOS | Dispositivos de red Ubiquiti |
Otros (2)
| Módulo | Descripción |
|---|---|
| Go pprof | Endpoints de perfilado de Go |
| NATS | Broker de mensajes |
Bases de datos (20)
| Protocolo | Transporte | Puertos predeterminados |
|---|---|---|
| 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 |
Acceso remoto (6)
| Protocolo | Transporte | Puertos predeterminados |
|---|---|---|
| SSH | TCP | 22, 2222 |
| RDP | TCP/TLS | 3389 |
| Telnet | TCP | 23 |
| VNC | TCP | 5900 |
| AnyDesk | TCP | 7070 |
| TeamViewer | TCP | 5938 |
Web y API (2)
| Protocolo | Transporte | Notas |
|---|---|---|
| HTTP/HTTPS | TCP | HTTP/2, detección de tecnología mediante Wappalyzer |
| Kubernetes | TCP | Detección del servidor de API |
Mensajería y colas (10)
| Protocolo | Transporte | Puertos predeterminados |
|---|---|---|
| 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 |
Servicios de archivos y directorios (7)
| Protocolo | Transporte | Puertos predeterminados |
|---|---|---|
| FTP | TCP | 21 |
| SMB | TCP | 445 |
| NFS | TCP/UDP | 2049 |
| Rsync | TCP | 873 |
| TFTP | UDP | 69 |
| SVN | TCP | 3690 |
| LDAP | TCP/TLS | 389, 636 |
Servicios de red (11)
| Protocolo | Transporte | Puertos predeterminados |
|---|---|---|
| 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 |
Sistemas de control industrial (18)
| Protocolo | Transporte | Puertos predeterminados | Notas |
|---|---|---|---|
| Modbus | TCP | 502 | SCADA/PLC |
| S7comm | TCP | 102 | PLC Siemens |
| EtherNet/IP | TCP | 44818 | Rockwell/Allen-Bradley |
| PROFINET | TCP | 34962-34964 | Industrial Siemens |
| BACnet | UDP | 47808 | Automatización de edificios |
| OPC UA | TCP | 4840 | Interoperabilidad industrial |
| OMRON FINS | TCP/UDP | 9600 | PLC OMRON |
| MELSEC-Q | TCP | 5006, 5007 | PLC Mitsubishi |
| KNXnet/IP | UDP | 3671 | Automatización de edificios |
| IEC 104 | TCP | 2404 | SCADA de red eléctrica |
| DNP3 | TCP | 20000 | SCADA de red eléctrica |
| Codesys | TCP | 1200, 2455 | Runtime de PLC |
| Fox | TCP | 1911 | Tridium Niagara |
| PC WORX | TCP | 1962 | Phoenix Contact |
| ProConOS | TCP | 20547 | Runtime de PLC |
| HART-IP | TCP | 5094 | Automatización de procesos |
| EtherCAT | UDP | 34980 | Control de movimiento |
| Crimson v3 | TCP | 789 | HMI Red Lion |
| PCOM | TCP | 20256 | PLC Unitronics |
| GE SRTP | TCP | 18245 | PLC GE |
| ATG | TCP | 10001 | Medidores de tanques |
Telecomunicaciones y VoIP (17)
| Protocolo | Transporte | Puertos predeterminados | Notas |
|---|---|---|---|
| Diameter | TCP/SCTP | 3868 | AAA LTE/5G |
| M3UA | SCTP | 2905 | SS7 sobre IP |
| M2UA | SCTP | 2904 | Adaptación de usuario MTP2 |
| M2PA | SCTP | 3565 | Adaptación de par MTP2 |
| SGsAP | SCTP | 29118 | Fallback conmutado por circuitos |
| X2AP | SCTP | 36422 | Inter-eNodeB LTE |
| IUA | SCTP | 9900 | ISDN sobre IP |
| SIP | TCP/UDP/TLS | 5060, 5061 | Señalización VoIP |
| MEGACO/H.248 | UDP | 2944, 2945 | Pasarela de medios |
| MGCP | UDP | 2427, 2727 | Pasarela de medios |
| H.323 | TCP | 1720 | Videoconferencia |
| SCCP/Skinny | TCP | 2000, 2443 | Teléfonos IP Cisco |
| IAX2 | UDP | 4569 | Protocolo Asterisk |
| GTP-C | UDP | 2123 | Control GPRS |
| GTP-U | UDP | 2152 | Plano de usuario GPRS |
| GTP' | UDP | 3386 | Tarificación GPRS |
| PFCP | UDP | 8805 | Plano de usuario 5G |
VPN y seguridad (11)
| Protocolo | Transporte | Puertos predeterminados |
|---|---|---|
| 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 |
Acceso remoto y administración (10)
| Protocolo | Transporte | Puertos predeterminados |
|---|---|---|
| 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 |
Herramientas de desarrollo (8)
| Protocolo | Transporte | Puertos predeterminados |
|---|---|---|
| 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 |
Uso de la biblioteca
Importa Nerva en tus aplicaciones 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)
}
}
Consulta [examples/service-fingerprinting-example.go](https://github.com/praetorian-inc/nerva/blob/main/examples/service-fingerprinting-example.go) para ver un ejemplo completo y funcional.
## Casos de uso
### Pruebas de penetración
Identifica rápidamente los servicios descubiertos durante el reconocimiento para detectar posibles vectores de ataque.
### Pipelines de descubrimiento de activos
Combínalo con Naabu o Masscan para el inventario de activos a gran escala:```sh
naabu -host 10.0.0.0/24 -silent | nerva --json | jq '.protocol'
Escaneo de seguridad en CI/CD
Integrar en pipelines de despliegue para verificar que solo los servicios esperados estén expuestos.
Reconocimiento en Bug Bounty
Enumerar rápidamente servicios en los objetivos del alcance para encontrar endpoints interesantes.
Análisis de redes de telecomunicaciones
Identificar nodos Diameter en redes LTE/5G usando transporte SCTP (Linux):```sh nerva -t mme.telecom.local:3868 -S --json
## Arquitectura```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]
¿Por qué Nerva?
vs Nmap
- Valores predeterminados más inteligentes: Nerva comprueba primero el protocolo más probable según el número de puerto
- Salida estructurada: Compatibilidad nativa con JSON/CSV para facilitar el análisis e integración en pipelines
- Enfocado: Solo fingerprinting de servicios — combínalo con escáneres de puertos dedicados para el descubrimiento
vs zgrab2
- Detección automática: No es necesario especificar el protocolo de antemano
- Uso más sencillo:
nerva -t host:portvsecho host | zgrab2 http -p port
Solución de problemas
Sin salida
Causa: El puerto está cerrado o no se ha detectado ningún servicio compatible.
Solución: Verifica que el puerto esté abierto:```sh nc -zv example.com 80
### Errores de tiempo de espera
**Causa**: El tiempo de espera predeterminado de 2 segundos es demasiado corto para servicios lentos.
**Solución**: Aumentar el tiempo de espera:```sh
nerva -t example.com:80 -w 5000 # 5 seconds
Servicios UDP no detectados
Causa: El escaneo UDP está deshabilitado por defecto.
Solución: Habilítalo con la opción -U (puede requerir root):```sh
sudo nerva -t example.com:53 -U
### SCTP no funciona
**Causa**: SCTP solo es compatible con Linux.
**Solución**: Ejecutar en un sistema o contenedor Linux:```sh
docker run --rm nerva -t telecom:3868 -S
Terminología
- Servicio: Un servicio de red que se ejecuta en un puerto (SSH, HTTP, PostgreSQL, etc.)
- Fingerprinting: Detección e identificación del tipo de servicio, versión y configuración
- Plugin: Un módulo de detección específico de protocolo
- Modo rápido: Escaneo únicamente del puerto predeterminado para cada protocolo (optimización 80/20)
- Transporte: Protocolo de capa de red (TCP, UDP o SCTP)
Soporte
Si encuentras útil Nerva, considera darle una estrella:
Contribuciones
¡Aceptamos contribuciones! Consulta CONTRIBUTING.md para obtener las directrices.
Licencia
Apache 2.0 — consulta LICENSE para más detalles.
Agradecimientos
Nerva es un fork mantenido de fingerprintx, desarrollado originalmente por la clase de becarios de Praetorian de 2022: