
nerva v1.69.2
Быстрый CLI для идентификации сервисов по 170+ протоколам (TCP/UDP/SCTP) — разработан компанией Praetorian
Nerva
Nerva: быстрый CLI для фингерпринтинга сервисов
Возможности • Установка • Быстрый старт • Использование • Протоколы • Библиотека • Сценарии использования • Устранение неполадок
Высокопроизводительный фингерпринтинг сервисов, написанный на Go. Определяйте 170+ сетевых протоколов через транспорты TCP, UDP и SCTP с извлечением подробных метаданных.
Nerva быстро обнаруживает и идентифицирует сервисы, работающие на открытых сетевых портах. Используйте её вместе со сканерами портов, такими как Naabu, для фингерпринтинга обнаруженных сервисов или интегрируйте её в свои конвейеры безопасности для автоматизированной разведки.
Возможности
- 170+ плагинов протоколов — базы данных, удалённый доступ, веб-сервисы, обмен сообщениями, промышленные и телекоммуникационные протоколы
- 76 HTTP-фингерпринтеров — обнаружение веб-технологий, включая межсетевые экраны, базы данных, серверы AI/LLM и многое другое
- Обнаружение ошибок конфигурации безопасности — выявление распространённых проблем безопасности, таких как неаутентифицированные API и протоколы с передачей данных в открытом виде (
--misconfigs) - Поддержка нескольких транспортов — TCP (по умолчанию), UDP (
--udp) и SCTP (--sctp, только Linux) - Поддержка прокси — прозрачная маршрутизация трафика сканирования через SOCKS5 или HTTP-прокси с настраиваемым разрешением DNS
- Подробные метаданные — извлечение версий, конфигураций и сведений, значимых для безопасности, из каждого сервиса
- Быстрый режим — сканирование только портов по умолчанию для оперативной разведки (
--fast) - Гибкий вывод — форматы JSON, CSV или удобочитаемый для человека
- Удобство для конвейеров — передача данных из Naabu, Nmap или любого инструмента, выводящего
host:port - Библиотека Go — импорт непосредственно в ваши приложения на Go
Установка
Релизы
Скачайте готовый бинарный файл со страницы Releases.
Из 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":{...}}
Pipe из сканера портов:```sh
naabu -host example.com -silent | nerva
# http://example.com:80
# ssh://example.com:22
# https://example.com:443
Полный справочник — каждая подкоманда, псевдоним и флаг, включая скрытые от --help — генерируется в 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
### Примеры
**Несколько целей:**```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
### Обнаружение ошибок конфигурации безопасности
Nerva может выявлять распространённые ошибки конфигурации безопасности при включении флага `--misconfigs`:```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 не требуется (риск relay-атаки) |
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: Поддержка UDP через SOCKS5 ограничена. Не все 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)
Определение технологий для веб-сервисов, организованное по категориям:
Межсетевые экраны и сетевая безопасность (12)
| Модуль | Описание |
|---|---|
| Checkpoint | Check Point Security Gateway |
| Cisco ASA/FTD | Межсетевые экраны/VPN-устройства Cisco |
| FortiGate | Межсетевой экран/VPN Fortinet |
| GlobalProtect | VPN Palo Alto Networks |
| Juniper | Межсетевые экраны Juniper SRX |
| OPNsense | Межсетевой экран OPNsense |
| pfSense | Межсетевой экран pfSense |
| SonicWall | Межсетевые экраны SonicWall |
| AnyConnect | SSL VPN Cisco AnyConnect |
| Cisco Expressway | Шлюз для совместной работы Cisco |
| BigIP | Балансировщик нагрузки F5 BIG-IP |
| WinRM | Windows Remote Management |
ИИ/LLM и машинное обучение (6)
| Модуль | Описание |
|---|---|
| Ollama | Сервер вывода LLM для самостоятельного размещения |
| LocalAI | Вывод LLM для самостоятельного размещения (совместим с OpenAI) |
| Open WebUI | Веб-интерфейс для LLM (в стиле ChatGPT) |
| Triton | NVIDIA Triton Inference Server |
| Weaviate | Векторная база данных для ИИ |
| ChromaDB | Векторная база данных |
Базы данных и хранилища данных (12)
| Модуль | Описание |
|---|---|
| ArangoDB | Мультимодельная база данных |
| CockroachDB | Распределённая SQL-база данных |
| CouchDB | Документная база данных Apache |
| Elasticsearch | Поисковый и аналитический движок |
| etcd | Распределённое хранилище ключ-значение |
| Milvus | Векторная база данных |
| MinIO | Объектное хранилище, совместимое с S3 |
| Pinecone | Векторная база данных |
| Redis Commander | Веб-интерфейс управления Redis |
| 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 |
Веб-серверы и фреймворки (10)
| Модуль | Описание |
|---|---|
| Apache HTTPD | Apache HTTP Server |
| Express.js | Веб-фреймворк Node.js |
| GoAhead | Встраиваемый веб-сервер |
| Gotenberg | Сервис генерации PDF |
| Guacamole | Шлюз удалённого рабочего стола Apache |
| SOAP | Веб-сервисы |
| Tengine | Веб-сервер Alibaba |
| Tomcat | Apache Tomcat |
| WordPress | Платформа CMS |
| UPnP | Universal Plug and Play |
Корпоративные и бизнес-решения (8)
| Модуль | Описание |
|---|---|
| AEM | Adobe Experience Manager |
| Dynamics 365 | Microsoft Dynamics 365 / Power Apps |
| Oracle Service Cloud | CRM-платформа Oracle |
| SAP NetWeaver | Корпоративная платформа SAP |
| Splunk | Платформа управления логами |
| VMware Horizon | Инфраструктура виртуальных рабочих столов |
| QNAP QTS | Управление NAS |
| Exchange | Microsoft Exchange Server |
Домашние и IoT-устройства (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 |
Веб и 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 | Siemens PLC |
| EtherNet/IP | TCP | 44818 | Rockwell/Allen-Bradley |
| PROFINET | TCP | 34962-34964 | Промышленные системы Siemens |
| BACnet | UDP | 47808 | Автоматизация зданий |
| OPC UA | TCP | 4840 | Промышленная совместимость |
| OMRON FINS | TCP/UDP | 9600 | OMRON PLC |
| MELSEC-Q | TCP | 5006, 5007 | Mitsubishi 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 | Phoenix Contact |
| 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 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 |
| MEGACO/H.248 | UDP | 2944, 2945 | Медиашлюз |
| MGCP | UDP | 2427, 2727 | Медиашлюз |
| H.323 | TCP | 1720 | Видеоконференции |
| SCCP/Skinny | TCP | 2000, 2443 | IP-телефоны Cisco |
| 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/main/examples/service-fingerprinting-example.go) для полного рабочего примера.
## Сценарии использования
### Тестирование на проникновение
Быстрое определение сервисов, обнаруженных в ходе разведки, для выявления потенциальных векторов атак.
### Конвейеры обнаружения активов
Объедините с Naabu или Masscan для крупномасштабной инвентаризации активов:```sh
naabu -host 10.0.0.0/24 -silent | nerva --json | jq '.protocol'
Сканирование безопасности CI/CD
Интегрируйте в конвейеры развёртывания, чтобы убедиться, что открыты только ожидаемые сервисы.
Разведка для Bug Bounty
Быстро перечисляйте сервисы по целевым областям, чтобы находить интересные конечные точки.
Анализ телекоммуникационных сетей
Определяйте узлы Diameter в сетях LTE/5G с использованием транспорта SCTP (Linux):```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:portпротивecho 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 года: