Загрузка...

Private Keeper OpenBullet BAS Разбор шифрования APK приложения для новичков

Тема в разделе Private Keeper, BAS, OB создана пользователем kageno 22 фев 2021. (поднята 28 июл 2022) 4170 просмотров

  1. kageno
    kageno Автор темы 22 фев 2021 1627 12 дек 2016
    Всех приветствую. Разберем не сложное приложение: Litres
    Все что вы увидите в этой статье это не призыв к действию, а только материал для ознакомления

    Список софта, который мы будет использовать:
    Python3 - нужен для Frida (не забудьте поставить галочку Add to Path во время установки)
    Frida - фреймворк, который поможет нам быстро снять SSL pinning
    ADB - через него будем запускать Frida
    Jadx - показывает код apk приложения
    Fiddler - софт для снифа
    Genymotion / MuMu / Nox / Bluestacks - андроид эмулятор

    Код
    Пишем в гугле "litres google play", переходим на сайт маркета
    [IMG]
    Код
    Опускаем страницу ниже отзывов и видим(выделено красным). Копируем:
    [IMG]
    Код
    Идем в гугл и пишем "litres apk 3.35-gp", переходим на любой сайт и скачиваем

    [IMG]

    Закидываем apk в наш эмулятор или скачиваем это же приложение из Play Market

    [IMG]


    Открываем консоль(cmd) и пишем:

    Код
    adb shell
    Код
    cd data/local/tmp
    Код
    ./frida &
    Консоль не закрываем

    Заходим в эмулятор и открываем наше приложение(Litres)
    Открываем новую консоль и пишем:
    Код
    frida-ps -U
    Находим в списке и копируем:
    Код
    ru.litres.android
    Запускаем Fiddler / Charles:

    [IMG]

    Открываем третью консоль и пишем
    Код
    frida -U -f ru.litres.android -l Desktop/frida/code.js --no-pause
    Desktop/frida/code.js - путь к скрипту frida(кликабельно)

    Frida запустила нам приложение, открываем эмулятор и пробуем авторизоваться, чтобы посмотреть на трафик.
    Код
    Вот что получилось в Fiddler:
    [IMG]
    [CODE]Ищем именно тот запрос, который отвечает за авторизацию(т.е. где передаются введенные нами почта и пароль):[/CODE][IMG]
    [CODE]Выделяем POST данные и ПКМ -> "Send To TextWizard":[/CODE][IMG]

    [IMG]
    [CODE]Я нашел онлайн JSON Viewer и запихнул данные, чтобы удобнее было анализировать:[/CODE][IMG]

    Непонятные данные:
    [CODE]"sid" - session id, но пока что не понятно откуда берется
    "sha" - какой-то хеш, дальше будем разбирать
    "time" - отформатированный timestamp, без смещения, т.к. у меня такое же время
    "user_id" - пока что не понятно откуда он берется[/CODE]
    [CODE]Нажимаем Ctrl + F в фидлере и пишем "sid":[/CODE][IMG]
    [CODE]Нажимаем "Find Sessions" и переходим в первый запрос где был найден sid[/CODE][IMG]
    [CODE]Отсюда мы видим, что "sid" мы получаем от сервера. Теперь анализируем то, что мы отправляем:[/CODE][IMG]
    [CODE]"pwd" - непонятно откуда берется
    "login" - какой-то странный uuid
    Кроме этих двух пунктов ничего нового нет, идем дальше[/CODE]

    [CODE]В запросе авторизации "user_id" был равен 852385973. Теперь делаем как и с "sid"(ищем 852385973 через Ctrl + F):[/CODE][IMG]
    [CODE]Теперь приводим, данные которые мы отправляем, в порядок:[/CODE][IMG]
    [CODE]"sid" мы разобрали в предыдущем спойлере и после его получения мы с помощью него получаем "user_id"
    Остальные данные уже нам известны, ничего нового, идем дальше[/CODE]

    [CODE]"time" и "sha" разберем с след. спойлере "Смотрим шифрование"[/CODE]

    [CODE]Открываем Jadx:[/CODE][IMG]
    [CODE]Перетаскиваем туда наше apk приложение:[/CODE][IMG]
    [CODE]После того как загрузит, нажимаем на "волшебную палочку":[/CODE][IMG]
    [CODE]Ждем, пока приложение декомпилируется:[/CODE][IMG]
    [CODE]Ставим такие же галочки, как у меня и вписываем в поисковую строку "sha":[/CODE][IMG]

    [CODE]У нас есть 2 результата.
    Первый результат сразу отпадает, т.к. судя по пути это апи Вконтакте.
    Остается один вариант, кликаем два раза ЛКМ по второму результату[/CODE]Нас перекидывает в код и главное на что мы должны обратить внимание это:

    [IMG]

    [CODE]Обратите внимание на hashMap.
    Судя по всему это map в котором как раз и билдится наш запрос на авторизацию. Нас интересует "time" и "sha".[/CODE]
    [CODE]Для начала посмотрим на "time".
    У нас есть hashMap.put("time", _dateToString)
    Метод put означает, что мы кладем в hashMap ассоциацию. Т.е. мы ассоциируем строку "time" с переменной _dateToString.[/CODE]Чтобы понять, что на данном этапе хранит данная переменная нужно посмотреть в Fiddler данные нашего запроса:

    [IMG]

    [CODE]Т.к. "time" ассоциируется c переменной _dateToString, и у нас в запросе есть вот такая строка:
    "time": "2021-02-22T09:40:12-05:00"
    Это означает, что _dateToString = "2021-02-22T09:40:12-05:00".
    Этот момент нужно запомнить, идем дальше[/CODE]

    [CODE]Возвращаемся в Jadx:[/CODE][IMG]
    [CODE]Дальше нас интересует хеш. Смотрим на 98-ую строку и видим, что со строкой "sha" у нас ассоциируется переменная sha256.[/CODE]Теперь смотри на 95-ую строку, где объявляется переменная. Видим метод getSHA256, который как раз и шифрует строку
    [CODE]a2.toString()[/CODE]Поднимаем глаза на 94-ую строку и видим как создается переменная с типом StringBuilder, которая сразу вызывает ф-цию:

    [IMG]
    [CODE]Зажимаем Ctrl и наводимся на j.b.b.a.a.a, потом у нас подчеркнется a и нажимаем по ней ЛКМ.
    Нас перекидывает в эту функцию:[/CODE][IMG]
    [CODE]Эта ф-ция создает как раз таки StringBuilder, кладет в него аргумент(str) и возвращает его.
    Т.е. на пред. скрине на строке 94 у нас StringBuilder в котором при объявлении уже находится _dateToString[/CODE]Дальше идет строка 94(2):
    [CODE]a2.append(b())[/CODE]Эта строка добавляет в наш StringBuilder(в котором уже лежит 2021-02-22T09:40:12-05:00) возвращаемое значение после вызова ф-ции b()
    Переходим в эту ф-цию задержав Ctrl и нажав ЛКМ по ней и вот что мы видим:

    [IMG]
    [CODE]Данная ф-ция проверяет, является ли это приложением школьным(у litres есть apk для школ). Если оно есть таковым, то возвращает "2vHzgx.....Tei"
    В ином случае возвращает "AsAAfd.....^]"[/CODE]Т.к. у нас не школьное приложение, то нас интересует вторая строка, а именно
    [CODE]AsAAfdV000-1kksn6591x:[}A{}<><DO#Brn`BnB6E`^s\"ivP:RY'4|v\"h/r^][/CODE]Обратите пожалуйста внимание на экранирование символов:

    [IMG]
    [CODE]Если не убрать два обратных слеша, то хэш НЕ будет совпадать!!![/CODE][CODE]Структурируем информацию:[/CODE][IMG]

    Строка 94(1):
    [CODE]StringBuilder содержит только 'time", к примеру
    2021-02-22T09:40:12-05:00[/CODE]Строка 94(2):
    [CODE]В StringBuilder кладется результат ф-ции b()
    В нашем случае это строка "AsAAfdV000-1kksn6591x:[}A{}<><DO#Brn`BnB6E`^s"ivP:RY'4|v"h/r^]"
    Теперь переменная a2 выглядит так:
    2021-02-22T09:40:12-05:00
    AsAAfdV000-1kksn6591x:[}A{}<><DO#Brn`BnB6E`^s"ivP:RY'4|v"h/r^]
    [/CODE]Строка 95:
    [CODE]a2.toString() конвертирует наш StringBuilder в строку. Это означает, что все его элементы просто склеиваются в одну строку.[/CODE]Т.е. a2.toString() это строка, которая выглядит вот так:
    2021-02-22T09:40:12-05:00AsAAfdV000-1kksn6591x:[}A{}<><DO#Brn`BnB6E`^s"ivP:RY'4|v"h/r^]

    [CODE]Вернемся к нашему запросу на авторизацию, чтобы сверить хэш наш и приложения:[/CODE][IMG]

    Берем "time" отсюда:

    [CODE]2021-02-22T09:40:24-05:00[/CODE]Склеиваем с AsAAfdV000-1kksn6591x:[}A{}<><DO#Brn`BnB6E`^s"ivP:RY'4|v"h/r^] и получается

    2021-02-22T09:40:24-05:00AsAAfdV000-1kksn6591x:[}A{}<><DO#Brn`BnB6E`^s"ivP:RY'4|v"h/r^]

    [CODE]Дальше заходим на любой сайт, чтобы захэшировать в sha256:[/CODE][IMG]

    Сверяем хэш в запросе и наш результат. Радуемся :)

    Если статья понравится, то напишу другую(или дополню эту) с тем,
    как применить информацию в этой статье и написать проект на Private Keeper'e
     
  2. Шиноби
    Шиноби 22 фев 2021 Скупаю ключи - XBOX ROBLOX FORTNITE OVERWATCH и др 424 20 мар 2019
    Гений
     
  3. Basta_Darkbot_inactive3935247
    Basta_Darkbot_inactive3935247 24 фев 2021 Заблокирован(а) 0 22 фев 2021
    для чего сток мозго еба не легче ssl pining юзать
     
    1. Посмотреть предыдущие комментарии (1)
    2. Basta_Darkbot_inactive3935247
      _Skill_, как да шифрования защиту многих апк можно обойти ssl pining
    3. _Skill_
      Basta_Darkbot_inactive3935247, ты вообще не о том говоришь, ссл пиннинг - это защита в приложении от снифа. Он к шифровкам никак не относится
  4. GRAFON11
    GRAFON11 24 фев 2021 68 7 июн 2017
    "...для новичков"
     
    1. Посмотреть предыдущие комментарии (1)
    2. kageno Автор темы
      GRAFON11, Это всё вещи про которые дискутировать нет смысла. В данной сфере эта статья, наверное, самый минимум, который нужно знать.
    3. _Skill_
      kageno, ты чего, это к счастью конечно, а то ведь хлеб отберут
  5. Melancholy
    Melancholy 7 апр 2021 Заблокирован(а) 3463 31 май 2018
    Кайфарик [IMG]
     
  6. IronicallyDevil
    IronicallyDevil 14 июн 2021 Заблокирован(а) 0 27 мар 2021
    мужик, мы ждём продолжение. Тема годная
     
  7. sbouton
    sbouton 21 авг 2022 Заблокирован(а) 0 1 апр 2022
    А есть мануал для сайтов, как разобрать содержание *.js ссылки , в которой генерируется signature и она например состоит из email + pass + time и шифруется в md5 ? Нужно понять чему какая переменная равна. Модет есть онлайн сервис, чтобы в ставить js код и узнать и в BAS повторить генерацию этой переменной , через "Выполнить код" ?
     
    1. kageno Автор темы
      sbouton, зависит от ситуации. Обычно js реверсится через "Средства разработчика"(F12). Ставятся брейк поинты и можно узнать значения каждой созданной переменной. Я конечно не совсем понимаю зачем тебе js ссылка. Но а так можно запустить на локалке или JS онлайн редакторе любом скрипт.
Загрузка...
Top