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

Статья Создание Brute/Checker на HTTP запросах с помощью OpenBullet | ЧАСТЬ 3 | ОБХОДИМ КАПЧУ | CAPTCHA BYPASS

Leonid Filatov

(L3) cache
Пользователь
Регистрация
28.09.2020
Сообщения
154
Реакции
240
Гарант сделки
2
Автор: Leonid Filatov
Эксклюзивно для форума: xss.pro
Часть: [3/3]
Ссылка на первую статью: xss.pro/threads/125338/
Ссылка на вторую статью: xss.pro/threads/125492/

Предисловие
Доброго времени суток, бойзы и гёрлзы!
В предыдущих двух статьях
(см. самый верх статьи) мы узнали что такое HTTP запросы и как работать с ними, узнали что такое защита в виде CSRF токена и успешно обошли её.
После чего мы создали Brute/Checker с помощью OpenBullet 2, который как раз таки обходит защиту в виде CSRF токена.
Если вы новичок, то чтобы вы лучше понимали о чём здесь идёт речь я настоятельно рекомендую вам ознакомиться с первыми двумя статьями! Потому что сегодня мы будем делать очень много похожих действий и заново объяснять это всё я не вижу смысла!
Заранее прошу прощения, если будет какое-то количество графомании и самоповторов, стараюсь всё разжевать.

Итак, давайте теперь сразу к делу. Сегодня мы будем обходить ReCaptcha/HCaptcha и т.д с помощью встроенных возможностей OpenBullet 2.

Что нам понадобится в этом уроке?
Знания:
  • Ссылка на первую статью: xss.pro/threads/125338/ - если ещё не читали.
  • Ссылка на вторую статью: xss.pro/threads/125492/ - если ещё не читали.
  • Понимание что такое капча и какие вообще её виды бывают: habr.com/ru/articles/846458/ - это поможет нам определить какая капча стоит на сайте, это будет нужно для успешного решения капчи, ведь мы должны правильно передать сервису решения капчи с какой именно капчей мы работаем.
  • Что такое Bearer-token: ru.hexlet.io/qna/glossary/questions/bearer-token-chto-eto - данная информация будет нужна на Этапе 4.3 в этой статье.
Цель для атаки:
  • Сегодняшней целью выступит сайт Bitmedia.io. У них как раз на входе есть ReCaptcha 2, а из личного кабинета можно спарсить баланс на сайте, что позволит нам прикрутить чекер!
1730238311810.png

Сервисы решения капчи:
  • Если вам нужно прогонять НЕ МИЛЛИОНЫ строк, то лучше использовать сервисы по решению капчи, а именно RuCaptcha/CaptchaGuru и так далее (полный список можете посмотреть в самом OB2). Сегодня мы будем использовать CaptchaGuru, потому что он дешевле!
  • Для брута больших объёмов аккаунтов я бы лучше рекомендовал купить лицензию XEvil. Либо взять у кого-нибудь в аренду под гадание нужного вам типа капчи, тип капчи заранее нужно уточнять перед арендой!
Дополнительно:
  • Валидный аккаунт от сайта Bitmedia.io. Регистрируем сами на временную почту, либо находим аккаунт логах.
  • Раздел функций под названием "Captchas", который содержит в себе список со всеми типами капч, которые поддерживает OpenBullet 2.
  • В нашем случае сайт использует ReCaptcha 2!
1730306950423.png


1730306959931.png

>Этап 0. Настраиваем OpenBullet 2 для обхода Captcha.<
Перед настройкой проекта для работы с капчей сначала настройте проект для работы с mail:pass и прокси (см. вторую статью)
Сначала выберем сервис, с помощью которого мы будем гадать капчу. Как я уже сказал ранее - я буду использовать CaptchaGuru.
  • Открываем OpenBullet 2.
  • Нажимаем "RL Settings".
1730252744076.png
  • Находим раздел "Captchas".
  • В поле "Timeout for captcha solutions" вводим значение от 120 до 300 секунд (2-5 мин). - Здесь мы указываем количество секунд, которое мы даём скрипту на решение капчи. Если не удасться получить токен в течении этого времени, то скрипт завершится ошибкой.
  • Ставим галочку в чекбокс "Check the captcha balance before solving". - Перед стартом скрипт будет проверять наличие баланса на сервисе решения капчи
  • Рядом с полем "Captcha Service" есть выпадающий список, выбираем там свой сервис.
  • В поле "API Key" Вводим свой API ключ, который мы получили на сайте сервиса решения капчи.
1730312299025.png
  • Жмём на кнопку "$ Check Balance" и нам должен показаться наш баланс. Если баланс не отображается, то внимательнее смотрите на настройки.
1730253352485.png
  • Снизу жмем "Save" и сохраняем настройки.
1730253697861.png

>Этап 1.1. Ловим и разбираем POST запрос на авторизацию.<
Итак, давайте теперь найдём наш POST запрос на авторизацию и посмотрим его содержимое.
  • Как и в первой статье сначала находим ссылку на страницу авторизации. Через Google Dork в этом случае не находится, просто нажимаем на кнопку "Login" в правом верхнем углу и попадаем на страницу авторизации, а именно - "bitmedia.io/app/login".​
1730291824373.png
  • Открываем сетевой монитор (CTRL + SHIFT + E), после чего вводим случайные данные, проходим капчу и жмем на кнопку "Login".​
  • Видим наш запрос, нажимаем на него.​
1730292234597.png
  • Открываем вкладку"Headers" и разворачиваем "Request Headers", после чего видим, что запрос отправляется на ссылку "https://bitmedia.io/api/auth/login", сайт использует HTTP версии 2.0, а так же тип отправляемого контента в этот раз у нас "application/json".
1730292479212.png
  • Теперь открываем вкладку "Request" и можем видеть там, что в запросе кроме "email" и "password" вместе с ними ОБЯЗАТЕЛЬНО нужно отправить ещё и "captchaToken".
1730293989234.png
  • После нажатия на "Raw" получаем настоящий вид нашего запроса:
{"email":"caseqafoj.tomocani@labworld.org","password":"41224142124","captchaToken":"03AFcWeA7_Jz_HGZ7y............."}

>Этап 1.2. Что такое captchaToken и как его получить?<
Для получения captchaToken и успешного обхода капчи нужно сначала найти sitekey на сайте - это уникальный ключ, связывающий капчу конкретно с этим сайтом. Затем этот ключ отправляется в сервис решения капчи, где капча решается, и на выходе возвращается captchaToken. Этот captchaToken мы подставляем в запрос на сайт, чтобы пройти проверку и успешно получить доступ.

Таким образом сайт считает, что капча была решена настоящим пользователем, и разрешает вход. Ниже будет немного терминологии и порядок действий для закрепления.

Что такое captchaToken?
сaptchaToken - это уникальный код, который подтверждает, что капча была решена. Он нужен, чтобы сайт «поверил», что заходит реальный пользователь, а не бот. После успешного решения капчи мы получаем captchaToken и можем использовать его для входа на сайт.
Что такое sitekey?
Sitekey - это статичный (НЕ ДИНАМИЧЕСКИЙ) ключ, который привязывает капчу к конкретному сайту. Он есть на каждой странице с капчей и находится в HTML-коде / либо в запросах (сетевом мониторе). Сайт с помощью этого ключа «запрашивает» капчу от сервиса, например, reCAPTCHA от Google.
Процесс обхода капчи кратко (теория):
  • Шаг 1: Найдите sitekey на странице, где происходит вход (в HTML-коде страницы, либо в запросах).
  • Шаг 2: Отправьте sitekey в сервис решения капчи (например, RuCaptcha или CaptchaGuru). Сервис решает капчу и возвращает captchaToken.
  • Шаг 3: Подставьте полученный captchaToken в запрос на вход. Сайт принимает token, считая, что капча решена пользователем.
Глобальные задачи на урок:
  • Изучить встроенные возможности OpenBullet для работы с капчей.
  • Получить sitekey и сохранить его в переменную.
  • Создать Brute для сайта bitmedia.io с обходом капчи при помощи sitekey.
  • Прикрутить Checker после успешного входа в аккаунт через API сайта с использованием Bearer токена.

>Этап 2. Ищем sitekey для дальнейшего использования.<
Sitekey обычно найти очень просто. Это делается двумя способами, давайте разберем их.

СПОСОБ 1. Поиск SITEKEY в HTML коде страницы авторизации.
Данный метод вообще почти ничем не отличается от получения CSRF токена, который мы находили в моей второй статье [кликабельно] на этапе 3.
На некоторых сайтах sitekey хранится прямо в HTML коде страницы, на которой расположена капча. Но так работает не на всех сайтах, например, у нашей сегодняшей цели sitekey НЕ РАСПОЛОЖЕН прямо в коде страницы.

А так ищем его по способу из второй статьи, только вместо "CSRF" в ответе от GET запроса на страницу авторизации ищем "data-sitekey", либо "sitekey". На этом отличия заканчиваются, поэтому не вижу смысла объяснять это по сто раз.

СПОСОБ 2. Поиск SITEKEY в запросах.
У нашей сегодняшей цели как раз таки можно выловить sitekey в запросах. Для этого нам нужно:
  • Обновляем страницу с авторизацией (F5). Это нужно, чтобы сбросить уже решенную нами капчу (решали, когда "входили" в аккаунт на этапе 1.1).​
  • Открываем сетевой экран (CTRL + SHIFT +E).​
  • Нажимаем на капчу, чтобы открылось окно решения капчи.​
1730295245190.png
  • Видим в сетевом экране, что из нашего браузера исходит POST запрос на домен www.google.com, в котором в ссылке есть данные в виде "reload?k=6LfBxPscAAAAAG8AqZKXuT-VLhng8QVFCnNfq1eU"​
1730295467056.png
  • Вот всё что идёт после "k=", а именно "6LfBxPscAAAAAG8AqZKXuT-VLhng8QVFCnNfq1eU" - это и есть наш sitekey. Мы успешно его получили, запишем его.​
Можете провернуть все действия в данном этапе несколько раз и убедиться, что этот ключ всегда остаётся таким же!

>Этап 3. Получаем captchaToken в OpenBullet 2 и сохраняем его в переменную.<
Итак, мы уже поняли, что наш sitekey на сайте bitmedia.io это "6LfBxPscAAAAAG8AqZKXuT-VLhng8QVFCnNfq1eU".
Теперь давайте получим captchaToken с помощью этого ключа.

Наши действия:

  • Создаём конфиг под наш сайт.​
  • Записываем USERNAME и PASSWORD в переменные.​
  • Получаем случайный юзерагент Windows и сохраняем его в переменную USER_AGENT.​
  • Заходим в раздел "Captchas" и выбираем кубик "Solve ReCaptcha V2"
1730306959931.png

Теперь в настройках "Solve ReCaptcha V2" пишем следующее:
  • Output Variable - пишем RECAPTCHA_RESULT, в эту переменную будет сохраняться captchaToken, который мы получим от CaptchaGuru.
  • Site Key - 6LfBxPscAAAAAG8AqZKXuT-VLhng8QVFCnNfq1eU
  • Site Url - тут пишем https://bitmedia.io/app/login. Это должна быть страница входа, на которой есть капча.
  • User Agent - пишем <USER_AGENT> и выбираем режим работы с переменными.
На выходе должно быть так:
1730310170954.png

Для данного проекта настройки капчи закончились, на этом всё.
Но давайте ещё обсудим чекбоксы "Enterprise", "Is Invisible" и "Use Proxy".
  • Enterprise - Captcha Enterprise использует продвинутый анализ поведения и систему оценки риска, интегрируется с другими мерами безопасности, и часто невидима для пользователя. Отличить её можно по специфическим меткам в коде и большему числу запросов к капча-серверу. Всегда пробуйте сначала без этой галочки, она редко где нужна.
  • Is Invisible - Установите этот чекбокс только в том случае, если на странице с формой входа капча визуально отсутствует, но появляется требование решения капчи (требуется CaptchaToken) после отправки POST запроса на авторизацию.
  • Use Proxy - Этот чекбокс тогда, когда мы мы хотим проксировать запросы к сервису решения капчи. То есть решение капчи и последующий вход с аккаунта будут просиходить с одного IP!
Теперь давайте проверим как скрипт отработает! Сохраняем его и жмем "Start".

Получение токена может занять время
. (Максимальное кол-во времени мы указали на Этапе 0!)
1730311971950.png

Как мы можем видеть на скринштоте - мы успешно получили токен и сохранили его в пременную RECAPTCHA_RESULT.
Сейчас нам осталось только добавить полученный токен в POST запрос на авторизацию!

>Этап 4.1. Создание Brute/Checker. Используем полученный captchaToken. Авторизация.<

Давайте теперь отправим POST запрос, в котором мы будем использовать наш captchaToken.
  • Создаём кубик "HTTP Request"
  • В поле "Label" пишем: ACCOUNT AUTH​
  • В поле "URL" пишем: https://bitmedia.io/api/auth/login
  • В окне "Method" выбираем "POST"​
  • В поле "HTTP VERSION" пишем: 2.0​
  • В поле "Content" выбираем режим работы с переменными и пишем - {"email":"<USERNAME>","password":"<PASSWORD>","captchaToken":"<RECAPTCHA_RESULT>"}​
  • В поле "Content Type" пишем: application/json​
  • В поле "Custom Headers" пишем:​
Код:
User-Agent: <USER_AGENT>
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br, zstd
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
TE: trailers
  • В окне "HTTP Library" выбираем "SystemNet"
Что должно получиться на выходе:
1730315575398.png


1730315597122.png

Теперь сохраняем проект, загружаем валидный аккаунт от сервиса в OB2 и жмём "Start". Ждём пока скрипт отработает и смотрим что выйдет в логе.

1730319543840.png


Как мы видим - по результатам выходит у нас всё очень даже хорошо! Мы успешно авторизовались в аккаунте, а как бонус мы ещё прям сразу после авторизации видим очень много полезной информации для прикручивания чекера!

А именно:
JSON:
"success":true - Маркер того, что мы успешно вошли в аккаунт. Используем его для KEYCHECK, чтобы определить аккаунт как GOOD.
"fullName":"Victor Daniel" - Имя и фамилия владельца аккаунта.
"hasBtcCampaigns":false - Показывает, есть ли на аккаунте запущенные рекламные компании.
"customerType":"advertiser" - Тип пользователя (advertiser/publisher)
"token":"eyJhbGciOiJIUzI1NiI...." - [B]Это [/B][URL='https://ru.hexlet.io/qna/glossary/questions/bearer-token-chto-eto'][B]Bearer токен авторизации[/B][/URL][B]![/B] На некоторых сайтах это очень важная штука! [B][U]Например на том, который мы делаем сейчас. Он потребуется нам в будущем, чтобы успешно сделать чекер баланса аккаунта.[/U][/B]

>Этап 4.2. Создание Brute/Checker. Определние GOOD/BAD, парсинг и сохранение нужных значений из ответа от сайта.<
На этом этапе нам предстоит то, чем мы занимались в первых двух уроках, поэтому я пробегусь быстренько, а вы просто смотрите скриншоты и повторяйте за мной!

1. ОПРЕДЕЛЕНИЕ GOOD/BAD:
  • Создаём кубик "Keycheck"​
  • Добавляем определение BAD - "success":false ИЛИ Email or password is incorrect
  • Добавляем определение GOOD - "success":true
1730320167493.png

2. ПАРСИНГ НЕОБХОДИМЫХ ДАННЫХ:
Сейчас мы спарсим fullName, hasBtcCampaigns, customerType и token.
  • Создаём четыре кубика "Parse".
  • Делаем так же, как на скриншотах ниже.​
1730320494118.png
1730320524736.png
1730320560117.png
1730320614594.png

>Этап 4.3. Создание Brute/Checker. Ищем запрос, который отвечает за отображение баланса.<
Мы успешно вошли в аккаунт, спарсили все нужные нам значения и сохранили их в переменные.
Если вы читали предыдущие две части статей, то наверняка знаете, что баланс на сайте можно спарсить просто сделав после успешной авторизации GET запрос на страницу, где в HTML коде страницы есть элемент, который содержит баланс, после чего через функцию "Parse" просто вытаскиваем баланс через "LR" или "XPath".
Но в этот раз это не так! Ведь не просто так я писал ранее, что почти к каждому сайту нужен свой подход!

ЧТО ЗДЕСЬ НЕ ТАК? ДАВАЙТЕ ПРОВЕРИМ:
  • Входим в аккаунт вручную.
  • Заходим на страницу, где отображаются балансы. В нашем случае ссылка вот эта - bitmedia.io/app/profile/balance.​
1730322930732.png
  • Жмем на значение баланса ПКМ и открываем Inspect (Q).​
1730323076016.png
  • Видим, что баланс находится в элементе "<span class="balance-amount"><span class="info-value-amount">$ 0</span></span>".​
  • Открываем сетевой монитор (CTRL + SHIFT + E).​
  • Жмем "F5".​
  • Видим GET запрос, открываем его.​
1730322484522.png
  • Заходим во вкладку "Response" и ставим галочку "Raw". (Мы используем Mozilla Firefox)​
1730322592756.png
  • Как мы видим, мы получили в ответ следующий код:​
HTML:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <meta name="description" content="" data-react-helmet="true">
    <meta name="keywords" content="" data-react-helmet="true">
    <meta property="og:title" content="" data-react-helmet="true"/>
    <meta property="og:description" content="" data-react-helmet="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, shrink-to-fit=no, user-scalable=no">
    <meta name="baidu-site-verification" content="code-sSgiBJkYyG" />
    <meta property="msapplication-config" content="/browserconfig.xml">
    <link rel="mask-icon" href="/static/favicon/favicon.svg">
    <link rel="icon" href="/static/favicon/favicon-32x32.png" sizes="32x32">
    <link rel="icon" href="/static/favicon/favicon-96x96.png" sizes="96x96">
    <link rel="icon" href="/static/favicon/favicon-144x144.png" sizes="144x144">
    <link rel="apple-touch-icon" href="/static/favicon/apple-touch-icon.png" sizes="180x180">
    <link rel="manifest" href="/site.webmanifest">
 
    <link rel="canonical" href="https://bitmedia.io/404" />
 
 
    <meta name="robots" content="noindex, follow" data-react-helmet="true"/>
 
    <style>
        .loader-main-page {
            display: none;
            background-color: #fff;
            position: fixed;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            z-index: 9998;
        }
        .dom-loading, .content-loading {
            height: 100%;
            overflow: hidden
        }
        .dom-loading > .loader-main-page, .content-loading > .loader-main-page {
            display: block;
        }
        .content-loading > .loader-main-page {
            background-color: transparent;
        }
        .content-loading > .loader-main-page:after {
            content: '';
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            background-color: #000;
            opacity: 0.7;
        }
        .loader-main-page > .loader-img {
            display: block;
            position: absolute;
            left: calc(50% - 50px);
            top: calc(50% - 50px);
            bottom: auto;
            z-index: 9999;
        }
        .container-loader.dom-loading ~ .wrapper {
            max-height: 100vh;
            overflow: hidden;
        }
    </style>
    <script type="556ed04fb028240e3ff0b0fa-text/javascript">
        var _hmt = _hmt || [];
        (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?e3d4c1f917813b13f33ea7f2db91e148";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>
    <!-- Google Tag Manager -->
    <script type="556ed04fb028240e3ff0b0fa-text/javascript">
        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});
        var f=d.getElementsByTagName(s)[0],
            j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';
        j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
        f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer', 'GTM-WBTKJ97');
    </script>
    <!-- End Google Tag Manager -->
    <!-- Tracking -->
    <script type="556ed04fb028240e3ff0b0fa-text/javascript">
      window.__kl__tr__Id='603f5ad8305dc000795ad0de',
      function(){
        var t=document.createElement('script');
        t.type='text/javascript',t.async=!0,t.src='https://s3-us-west-2.amazonaws.com/sitetrack/klenty_track.js';
        var e=document.getElementsByTagName('script')[0];
        e.parentNode.insertBefore(t,e)
      }();
    </script>
    <!-- End Tracking -->
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript>
    <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WBTKJ97" height="0" width="0" style="display:none;visibility:hidden"></iframe>
</noscript>
<!-- End Google Tag Manager (noscript) -->
<script type="556ed04fb028240e3ff0b0fa-text/javascript">
    document.body.classList.add("loader-visible");
    window.addEventListener('load', function () {
        setTimeout(function () {
            document.getElementById('preLoader').classList.remove('dom-loading');
            document.body.classList.remove("loader-visible");
        }, 550);
    });
</script>
<div class="container-loader dom-loading gray-bg" id="preLoader">
    <div class="loader-main-page">
        <img src="/app/react/preloader_icon.gif" class="loader-img" alt="preloader" width="100" height="100">
    </div>
</div>
<div id="root">Loading...</div>
<script src="/app/react/js/bundle.3adee7b.js" type="556ed04fb028240e3ff0b0fa-text/javascript"></script>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="556ed04fb028240e3ff0b0fa-|49" defer></script></body>
</html>
  • Скопируйте полученный код в любой удобный текстовый редактор, нажмите "CTRL + F", после чего вставьте туда span class="info-value-amount", или $ 0 и попробуйте найти что-нибудь.
  • Вы ничего не нашли, верно? Ведь сайт не отдаёт нам баланс в GET запросе на страницу с балансом!
ЧТО ЖЕ ДЕЛАТЬ В ЭТОЙ СИТУАЦИИ? ДАВАЙТЕ РАЗБЕРЁМСЯ:
Забиваем болт и идём курить бабмбук, ведь у нас ничего не получится.
На самом деле всё очень легко! НАМ ПРОСТО НУЖНО НАЙТИ ВЕРНЫЙ GET ЗАПРОС. (Капитан очевидность в деле!)

Порядок действий:
  • Входим в аккаунт вручную.
  • Заходим на страницу, где отображаются балансы. В нашем случае ссылка вот эта - bitmedia.io/app/profile/balance.​
  • Открываем сетевой монитор (CTRL + SHIFT + E).​
  • Жмем "F5".​
  • Видим, что кроме первого GET запроса, который в ответе отображает нам мусорный код у нас есть ещё один очень похожий GET запрос, только вот тип контента там JSON.​
1730324150394.png
  • Открываем этот запрос и видим, что он работает со ссылкой "https://bitmedia.io/api/user/balance", а не "https://bitmedia.io/app/profile/balance". Из этого делаем вывод, что сайт использует API для получения баланса пользователя.
  • Ещё в запросе видим, что в его заголовках сайту передаётся Bearer токен авторизации, который мы получили после успешного входа в аккаунт (см. Этап 4.2). Мы должны будем добавить наш полученный Bearer токен в заголовки при отправке запроса. Если вы забыли что такое Bearer токен, то просто пролистайте в самый верх статьи. Там будет ссылка на подробную статью!
1730324913631.png

>Этап 4.4. Создание Brute/Checker. Используем полученную информацию для прикручивания чекера.<

СОБИРАЕМ НУЖНУЮ ИНФОРМАЦИЮ В КУЧУ:

На данный момент мы имеем:

  • Ссылка, которая адресуется к API сайта Bitmedia, которая позволяет получать баланс аккаунта - https://bitmedia.io/api/user/balance.
  • Bearer токен авторизации, который мы сохранили в переменную "AUTH_TOKEN".
  • Требуемые заголовки, которые мы сейчас приведём в нужный вид:
HTML:
User-Agent: <USER_AGENT>
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br, zstd
Referer: https://bitmedia.io/app/profile/balance
Authorization: Bearer <AUTH_TOKEN>
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=4
TE: trailers
Мы установили наш User Agent из переменной <USER_AGENT> и добавили наш Bearer токен из переменной <AUTH_TOKEN> в "Authorization: Bearer " (Bearer не нужно удалять).

ПОЛУЧАЕМ БАЛАНС АККАУНТА:
  • Создаём кубик "HTTP Request"
  • В поле "Label" пишем: PARSE BALANCE​
  • В поле "URL" пишем: https://bitmedia.io/api/user/balance
  • В окне "Method" выбираем "GET"​
  • В поле "HTTP VERSION" пишем: 2.0​
  • В поле "Content Type" пишем: application/json​
  • В поле "Custom Headers" пишем те заголовки, которые мы привели в нужный вид.​
  • В окне "HTTP Library" выбираем "SystemNet"
1730325975482.png


1730315597122.png

На выходе получаем результат:
JSON:
{"success":true,"data":{"btc":0,"btcPending":0,"usd":0,"balanceCampaigns":0,"publisherUsd":0,"usdPending":0,"balanceReferralUSD":0,"balanceReferralUSDPending":0},"error":""}
1730332666786.png

Бинго! Мы успешно получили:
  • "success": true," - сайт дал нам ответ, что он успешно обработал запрос.
  • "btc":0," - баланс аккаунта в BTC.
  • "btcPending":0, - монеты BTC, которые ещё идут на аккаунт.
  • "usd":0, - баланс аккаунта в USD.
  • "balanceCampaigns":0, - баланс всех рекламных компаний, запущенных на аккаунте.
  • "usdPending":0, - деньги в USD, которые ещё идут на аккаунт.
  • "balanceReferralUSD":0, - баланс за приведённых рефералов.
  • "balanceReferralUSDPending":0 - баланс за приведённых рефералов, который ещё не доступен (холд).
Нам осталось только спарсить и сохранить эти данные в переменные для вывода в лог с помощью функции "Parse".


Но ради эксперемента давайте попробуем удалить из нашего запроса Bearer токен, отправим запрос посмотрим на результат.
Вот что нам ответил сервер:

JSON:
{"message":"Not authorized to access this resource"}
1730333915143.png
Как можно судить по сообщению, которое мы получили в логе - сайт НЕ ДАЁТ НАМ ВЫПОЛНИТЬ ДЕЙСТВИЕ, потому что не видит у нас токена авторизации и соответственно говорит нам, ЧТО МЫ НЕ АВТОРИЗОВАНЫ!

>Этап 4.5. Создание Brute/Checker. Сохраняем балансы по переменным после парсинга для вывода в лог.<
На этом этапе нам предстоит то, чем мы занимались в первых двух уроках, поэтому я пробегусь быстренько, а вы просто смотрите скриншоты и повторяйте за мной!
Сейчас мы спарсим btc, btcPending, usd, usdPending и balanceCampaigns.
  • Создаём пять кубиков "Parse".
  • Делаем так же, как на скриншотах ниже.​
1730334506571.png
1730334522392.png
1730334548745.png
1730334562590.png
1730334576203.png

На этом разработка конфига окончена! Можем спокойно запускать наш конфиг в многопотоке и лутать балансы рекламных кабинетов с которых можно пускать трафик на нужное вам направление! Мне лично выпадал баланс более чем на 1к$ просто с логов, которые я нашёл на раздаче.

>Этап 5. Конец. Итоги.<

Спасибо за то, что уделил(а) время на прочтение этой статьи! Я надеюсь, что этот материал был полезен.
Изначально моей целью было в максимально сжатые сроки научить новичков в нашем деле создавать для себя не супер сложные Бруты/Чекеры на HTTP запросах и экономить на этом свои шекели.
И я думаю у меня получилось это сделать, так как я старался разжевать всё максимально подробно и без лишней информации, которая вам врядли пригодится на старте!

Не буду изменять свои традициям и прикреплю исходник конфига, ковыряйтесь кому интересно:
Код:
Ссылка -> mega.nz/file/cC8QAD4Z#2hxbs-8OFfDD-eF4AIpZiIzrKAEpceGe5Te-s3LPVak
Пароль от архива -> xss.pro (обязательно большими буквами)
Конфиг закидывать по пути -> OpenBullet2\UserData\Configs

В следующих статьях в этом направлении (бруты/чекеры/парсеры) я расскажу как создавать конфиг для OpenBullet НЕ НА HTTP ЗАПРОСАХ, а через эмуляцию браузера с помощью Selenium/Puppeteer. Такой подход не всегда работает быстрее чем софт на HTTP запросах, но зато прёт как танк - медленно, но верно.

Хоть сейчас и в моде автоматизация антидетект браузеров с помощью BAS/Python, но нам ещё рано до этого, ведь я всё же хочу дать базовые навыки для старта. И для этого OpenBullet подойдёт очень хорошо, а человеку с опытом разработке на языках программирования не составит труда перенести все эти "кубики" в код, ИМХО.
Рано или поздно мы дойдём и до автоматизации антидетект браузеров, но как говорил классик: "это уже совсем другая история"

Удачи, путник!
 

Вложения

  • 1730253127800.png
    1730253127800.png
    14.9 КБ · Просмотры: 32
  • 1730322902666.png
    1730322902666.png
    15.5 КБ · Просмотры: 23
  • 1730331922297.png
    1730331922297.png
    33.2 КБ · Просмотры: 27
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
бро у тебя круто получается пиши чаще
 
Последнее редактирование модератором:
Прочитал все твои статьи, они просто бомба, продолжай пожалуйста! Я года 3 назад учился писать на приваткипере и если бы были такие манчики я бы потратил на изучение пару дней а не пару недель поиска полезной инфы по всем форумам ))
 


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