Когда я только увидел что обьявлен новый конкурс на ХСС, сразу решил что буду участвовать. Однако возник вопрос, с каким проектом лучше всего зайти в конкурс. Я долго выбирал между тем, чтобы написать мессенджер на замену Токса с обнаруженной RCE, или же написать брут, которых я написал целую кучу и тележку на Delphi. Но понял, что начни делать я месседжер то я точно не успею, да и опыт написания брутов/чекеров у меня весьма обширный. Я писал их на любой вкус и цвет, разбирал мобильные приложения, разбирался в шифрования на различных сайтах. С учетом всех этих аспектов я понял, что я буду делать. Но вопрос был в другом, брут должен быть по настоящему уникальным, а не просто еще одним брутом под один сайт с загрузкой базы и проксей.
Преимущества:
1. Все в одном месте
Когда часто занимаешься написанием брутов, у тебя скапливается целая куча всего — скомпилированные бруты с результатами, исходники. Это всё разбросано по разным папкам и как-то неудобно. А если добавить к этому еще какую-то фичу, приходится заходить в каждый софт, дописывать и компилировать, что забирает уйму времени.
2. Современный стек
Обычно бруты пишут на Delphi или C#, но эти языки уже немного устарели для этой задачи. Либо же бруты пишут с использованием OpenBullet или Private Keeper, и таких была еще целая куча, но остальные как-то не сильно прижились. Я выбрал Golang за его выдающуюся производительность при высоких нагрузках и эффективную работу в многопоточке. Это может быть не тот же ООП-язык, но для поставленных целей он отлично подходит.
3. Кросс-платформенность
Большинство брутов создаются под Windows для удобства конечного пользователя. Но использование Golang позволяет компилировать его под различные операционные системы без проблем. Так что помимо Windows, мы можем легко работать на серверах под Linux, что добавляет гибкости и многофункциональности.
4. Web-морда вместо GUI
Те, кто брутит, обычно используют выделенные серверы с Windows, управляя ими через RDP. Это дорого и не всегда удобно. Работать с брутом как с веб-сайтом гораздо удобнее. Открываешь вкладку в браузере и работаешь там.
5. Сохранение всех настроек в пресеты
Для того чтобы не вводить настройки каждый раз заново, я реализовал пресеты. Указал источник прокси, их тип, и потом просто выбираешь этот пресет. Также сохраняется остаток, результаты можно скачать в txt или xlsx формате. Также если брут был остановлен по какой-либо причине его можно запустить повторно и не нужно брать остаток запихивать его по новому и прописывать все настройки снова, что как по мне тоже очень удобно.
6. Никаких ограничений ядра для разработчиков
В универсальных брутах накладываются определенные ограничения на разработчиков проектов. У меня модуль — это микросервис с одним эндпоинтом, и его можно написать на любом компилируемом языке. Входные данные в него, он выполняет свою магию и говорит гуд, бед, ошибка и так далее. Никаких ограничений ядра для разработчиков.
Инструкция по использованию
Алгоритм использования программы примерно следующий:
- Загружаете базку
- Создаете новый прокси пресет
- Подгружаете модуль
- Создаете сессию, выбираете то, что создали выше и после чего стартуете.
Комбо листы
Для удобства хранения баз данных я добавил возможность создавать папки и группировать базы внутри них. Учитывая, что баз данных может быть много и по разным темам, это сделает навигацию проще. Просто кликните правой кнопкой мыши в свободном месте и выберите "Создать папку" или "Создать комбо-лист".
Чтобы создать папку, достаточно ввести название папки в появившемся модальном окне после нажатия правой кнопки мыши.
Комбо-лист работает немного по-другому. Он позволяет объединить несколько файлов или ссылок, чтобы сформировать один общий список. Например, вы можете указать файл на сервере и ссылку на Sendspace, где также хранится база данных, и получить один комбо-лист с данными из нескольких источников. Вы также можете указать одну ссылку или файл, в зависимости от вашего удобства. При создании комбо-листа нужно указать тип данных, которые будут включены в него.
Пока что, в настоящее время можно только указывать прямые ссылки на файлы, что действительно удобно, если ваши базы данных хранятся в облаке. Второй вариант загрузки баз из файла, который находится на той же машине, где запущен софт. Пока не сделал возможность выбирать файл с той тачки, где сидит пользователь. Я решил не включать эту функцию пока что, потому что знаю, что некоторые пользователи загружают огромные базы с несколькими миллионами строк и оставляют это на ночь. Загрузить такие большие базы данных сюда было бы довольно сложно, поэтому я решил отложить эту функцию на потом. Однако, если вы запускаете софт на той же машине, где и находитесь вы, то указание пути к файлу не представляет проблем.
Если хотите удалить папку, то сначало надо удалить вложенные в нее элементы. Если хотите удалить комбо лист, то не должно быть никаких связанных с ним сессий. Если на ФО есть клауд, софт его не обойдет, по этому смотрите чтоб клаудфлара не было на ресурсе куда залита базка.
Прокси пресеты
Тут это выглядит примерно следующим образом, собственно имеет определенную схожесть с комбо-листами, только здесь я не стал делать папки. Как правило прокси грузят либо из файла, каждый раз разные, либо по АПИ ссылке всяких сервисов таких как адвансы, бесты или авм, вообщем по вкусу и цвету... и там уже они в режиме реального времени обновляются с какой-либо переодичностью. Бывали и такие случаи когда прокси записывают в файлик на диске и уже из него обновляют с определенной переодичностью в бруте. В этом плане использовать пресеты удобно использовать. На случай если это разовая загрузка из файла, в котором прокси быстро сдохнут, то можно не создавать пресет, а сразу грузить прокси в сессии, для этого есть отдельная кнопка в сессиях, выбираете ее и грузите там уже свой файл с диска.
Но все же давайте вернемся к пресетам.
При использовании пресета для загрузки прокси по ссылке или из файла на диске, вы указываете наименование пресета. Если прокси будут обновляться с определенной периодичностью, вы ставите галочку напротив интервала и указываете время в секундах.
Таймаут соединения с сайтом для прокси подразумевается как обычно, это время ожидания ответа от сервера при подключении к нему.
Как и в случае с комбо-листами, вы можете указать несколько источников, из которых будут браться прокси. Если файл находится на вашей тачке, то автообновление прокси для него не будет работать, и программа будет всегда брать данные из загруженного вами файла. Это вполне логично.
Для удаленных файлов и ссылок автообновление будет активно. Вы можете выбрать несколько типов прокси: HTTP/S, SOCKS4, SOCKS5. Это означает, что в одной сессии брута могут использоваться сразу несколько разных типов прокси. Это удобно, так как вы можете указать несколько ссылок с разными типами прокси, и программа будет использовать их все вместе.
Модули
Собственно сама вкладка очень простая, жмякаете добавить, загружаете файлик модуля и он подтягивает его в эту вкладку. А вот как делать сами модули, это уже отдельная история.
Модуль представляет собой независимый микросервис со своей собственной спецификацией написания. Хотя модуль можно писать на любом языке программирования, я бы все-таки рекомендовал использовать Go, поскольку он компилируется в единый исполняемый файл и легко запускается на любой платформе. Однако следует помнить, что если ваш BruteCore запущен на Linux, то модуль также должен быть скомпилирован под Linux, и аналогично для Windows.
Когда вы загружаете модуль, он запускается с параметром "-getinfo", и модуль должен вернуть JSON следующего формата:
JSON:
{
"name": "TestModule",
"version": "1.0.0.0",
"author": "0xUser",
"data_type": 9
}
Поле "data_type" определяет тип данных комбо-листа, с которым работает модуль. Вот возможные значения:
Код:
4 DATA_TYPE EMAIL
5 DATA_TYPE USERNAME
6 DATA_TYPE PASSWORD
7 DATA_TYPE PIN
8 DATA_TYPE USERNAME:PASSWORD
9 DATA_TYPE EMAIL:PASSWORD
10 DATA_TYPE DATA
Все вышеперечисленные типы вы можете найти в таблице reference в БД которая лежит рядом с проектом. Если какого-либо поля из выше приведенного формата json нету в модуле, BruteCore установит значение none, как выше на картинке в поле “Версия”. Сами модули сохраняются в папке modules рядом с софтом.
Если какого-либо поля из вышеприведенного JSON отсутствует в модуле, BruteCore установит его значение в "none".
Модули сохраняются в папке "modules" рядом с программой.
При запуске модуля для перебора, он вызывается с аргументом "-port", указывающим порт, на котором должен быть запущен микросервис.
Модуль должен иметь эндпоинт POST "/ExecuteModule", который принимает JSON следующего формата:
JSON:
{
"email": "0xUser@0xuser.cf",
"username": "0xUser",
"password": "xss.password",
"pin": "1234",
"data": "example_data",
"timeout": 15000,
"proxy_host": "127.0.0.1",
"proxy_port": 8080,
"proxy_type": 18
}
Практически все поля являются опциональными. Практически все поля являются опциональными, некоторые из них могут отсутствовать, например если брут идет без прокси то соответствующих полей в json не будет, если был выбран 9 тип комбо-листа то будут присутствовать поля email и password и уже соответственно по разным типам комбо-листа. Сервис проводит определенные действия с данными и возвращает JSON следующего вида:
JSON:
{
"status": 25,
"log": "proxy: 127.0.0.1:8080 \n some additional data in log"
}
Поле log является опциональным и впринципе может отсутствовать если оно вам не нужно. Статус может иметь следующие значения:
Код:
25 RESULT Хорошие
26 RESULT Плохие
27 RESULT Ошибки Соединения
28 RESULT Ошибки ПО
29 RESULT Капча
30 RESULT С балансом
31 RESULT Пустышки
32 RESULT Зарегестрирован
33 RESULT Залимиченные
По идее всю основную работу делают модули, сам же БрутКор выступает в роли некоего оркестратора, который запускает нужный сервис, поддерживает его в рабочем состоянии, отправляет на него входные данные, дальше происходит модульная магия, “особые физико-математические вычисления” в результате которых мы и узнаем гуд, бэд это или еще что-то.
ВАЖНО!! Поскольку мы работает уже с скомпилированными модулями, там могут быть всякие “закладки”, ведь тут для разработчика нет абсолютно никаких ограничений в плане того какой код писать какие библиотеки использовать и т.д., поэтому стоит быть очень аккуратным и использовать модуль только от доверенных людей, либо писать модули самому. Береженного бог бережет!
Ниже в статье вы можете найти пример готового модуля и использовать его как шаблон для написания своих модулей.
Сессии
В сессиях все относительно просто, создаете новую сессию кнопочкой добавить потом нажимаете на стрелочку справа и переходите к деталям конкретной сессии.
Выбираете комбо-лист который хотите брутить, после чего вы можете выбрать прокси либо из готового пресете, либо уже загрузить из файла, который есть на тачке с которой вы подключаетесь, если хотите брутить без прокси то ничего не выбираете и брут будет идти без прокси. Выбираете модуль, проставляете нужное вам количество потоков и запускаете.
Менять прокси лист, комбо лист или модуль во время перебора вообще не желательно. Но вы можете поменять количество потоков прям во время работы, софт автоматически подхватит количество потоков и при необходимости избавится от лишних, либо создаст новые неостающие. Что бы получить статистику по бруту нужно нажимать на кнопку обновить справа от слова статистика, да возможно это не удобно, может следовало сделать что бы он по вебсокетам обновлял статистику, ну хз, не захотел делать дополнительную нагрузку на софт. Результаты соответственно можно посмотреть нажав на кнопку результаты, откроется следующая вьюшка.
Собственно здесь обычная пагинация по результатам, выбираете что хотите посмотреть, сколько должно отображаться записей разом и уже смотрите.
Результат можно скачать в друх форматах, либо txt, либо xlsx, думаю кто работал с экселем обязательно заценит. Если по гудам были какие-то логи то они будут в правой колонки с логом. Тут уже зависит от проекта который вы запускаете.
Инструкция по использованию
Устанавливаем Node.js с официальнго сайта https://nodejs.org/en/download.
Устанавливаем Vue-cli командой npm install -g @vue/cli.
Устанавливаем Golang с официального сайта https://go.dev/doc/install.
Качаем исходник фронтенда и бэкенда.
В папке с фронтом запускаем npm i в папке с бэком go mod tidy и go mod vendor.
Если планируете запускать BruteCore у себя на тачке локально, то нужно сделать следующее:
- В папке с фронтом запускаете команду npm run serve
- В папке с бэком запускаете команду go run .
- Переходите в браузере по localhost:8080
- Готово
- В папке с фронтом, в файле src\main.js, на 12 строке меняете http://127.0.0.1:985 на свой домен или адрес сервера (например: http://0xuser.cf, http://255.255.255.255)
- В папке с фронтом запускаете npm run build, вьюшка соберет все исходники и создастся папка dist, в которой будут лежать все необходимое для фронта.
- В папке с исходник бекенда, в файле “.env” меняем значения AUTH_ADMIN_LOGIN, AUTH_ADMIN_PASSWORD, AUTH_VIEWER_LOGIN, AUTH_VIEWER_PASSWORD, JWT_KEY на свои, также нам нужно поменять значение JWT_KEY на любую строку, это ключ которым будут шифроваться jwt токены на сервере.
- В папке с бэком устанавливаем переменные окружения “set goos=linux, set goarch=amd64”, если на вашем серваке какая-то другая архитектура, то указываете свою архитектуру.
- Собираем бэк командой “go build main.go”
sudo apt updatesudo apt upgradeНакатываем nginx командой:
sudo apt nginxКопируем содержимое папки dist в папку /var/www/front.brutecore
Копируем скомпилированный main, .env, BruteCore.sqlite в папку /var/www/back.bruteforce
После запускаем команду
chmod +x mainВ папке /etc/nginx/sites-available создаем файл brutecore со следующим содержимым, где server_name localhost, “localhost” меняем на свой домен или адрес сервера:
NGINX:
server {
listen 80;
server_name localhost;
charset utf-8;
root /var/www/front.brutecore;
index index.html;
#Always serve index.html for any request
location /Health {
proxy_pass http://127.0.0.1:985/Health;
}
location /api {
proxy_pass http://127.0.0.1:985/api;
}
location / {
root /var/www/front.brutecore;
try_files $uri /index.html;
}
error_log /var/log/nginx/vue-app-error.log;
access_log /var/log/nginx/vue-app-access.log;
}
sudo ln -s /etc/nginx/sites-available/brutecore /etc/nginx/sites-enabled/Также редактируем файл /etc/nginx/nginx.conf
Находим вот эти строки и раскоменчиваем их
Также нам надо рядом добавить строку:
client_max_body_size 20M;Это нужно что бы nginx сжимал стили и прочие скрипты, а также что бы мы могли без проблем загружать модули на сервер.
Перезапускаем nginx командой:
sudo systemctl restart nginxПосле чего запускаем бэкенд комагдой
sudo nohup ./main &, и переходим в браузере по адресу нашего сервера или домена. Если все сделали правильно, то должно появиться окно входа и мы без проблем в нем авторизовываемся. Если после входа в Учетку будете получать ошибку “failed to initialize database, got error Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub” то тогда нужно установить гошку на сервак, потом установить туда же gcc/g++ компилятор командой
sudo apt-get install build-essential и после чего уже билдить приложение на серваке и оно будет работать.Все исходники можно скачать по ссылке https://www.sendspace.com/file/2ujpbd
Специально развернул демку что бы можно было посмотреть как оно выглядит уже задеплоенное http://45.83.122.198/ Логин XSSViewer, Пароль: xss.is1pass
