Отлавливаем трафик защищенных Android приложений / Android reversing

Грач

RAID-массив
Пользователь
Регистрация
01.10.2018
Сообщения
60
Оценка реакций
63
Баллы
26
Telegram


Перехватываем HTTP/s трафик Android.

Звучит просто, но так ли это на самом деле ?

Глава 0. Инструмент
  • Fiddler - отладочный прокси сервер
  • Apk Easy Tool - при помощи нее мы сможем декомпилировать, компилировать и подписывать apk приложения для Android. (как скачать: screen)
  • JavaDecompilers.com - онлайн декомпилятор apk приложений в java source code.
  • XYplorer - файловый менеджер Windows с удобным поиском содержимого в файлах.
  • Notepad++ - просто удобный текстовый редактор.
  • Memu emulator - Android эмулятор основанный на виртуальной машине HyperV
Глава 1. Перехватываем трафик не защищенных приложений.*

Fiddler нам понадобится для того что бы перехватывать трафик при помощи технологии MitM

Устанавливаем Fiddler и настраиваем его:
Tools -> Options (screen)​
  • HTTPS (screen правильных настроек)
    • HTTPS CONNECTs: перехват https подключений (потребуется установка сертификата - устанавливаем)
      • Decrypt HTTPS traffic: расшифровка шифрованного https трафика
      • Ignore server certificate errors (unsafe): игнорирование ошибок
  • Connections (screen правильных настроек)
    • Port: выбираем более удобный для вас, я оставляю по умолчанию "8888"
    • Allow remote computers to connect: разрешаем другим устройствам удаленно цепляться к вашему отладочному Proxy (в роли удаленного устройства у нас будет выступать anroid эмулятор/реальное устройство в вашей WiFi сети)
Rules (screen настройки описанные здесь не обязательны, но я считаю что если вы будите использовать именно их вам будет более удобно и проще работать с Fiddler)​
  • Hide image requests - скрываем из списка все подключения связанные с картинками
  • Hide connects request - скрываем подключения к тоннелям и так далее
  • Remove encodings - в процессе перехвата трафика мы будем получать его в чистом виде, благодаря тому что эта функция автоматически удаляет все кодировки, распаковывает GZIP.
После всех настроек нужно перезапустить Fiddler, а так же узнать свой локальный IP адрес, в Fiddler для этого отделено небольшое пространство - screen.​
В моем случае адрес Proxy будет таков: 192.168.100.4:8888 - вам нужно запомнить это!​

Установка эмулятора Android и его настройка:

Эмулятор потребуется нам для запуска на нем Android приложений что бы отлавливать трафик с приложений, если вы не хотите использовать эмулятор вы можете настроить свое Android устройство по этой же инструкции.
Во время настройки устройства Fiddler должен быть настроен и запущен.

  • Настройка Proxy WiFi
    • Открываем настройки Android и выбираем пункт настроек WiFi (screen)
    • Подключаемся к WiFi сети в которой находится ваш ПК, нажимаем по подключенной сети и удерживаем (1. screen 2.screen), в появившемся окне выбираем пункт "Изменить сеть"
    • Устанавливаем галочку "Расширенные настройки"(screen) -> установка прокси сервера вручную (screen) -> устанавливаем адрес прокси и port которые получили ранее и сохраняем настройки (screen)
  • Установка сертификата Fiddler в доверенные на устройстве
    • Открываем браузер и вводим в адресной строке адрес нашего прокси сервера
    • Скачиваем файл сертификата и устанавливаем его (1.screen 2. screen)
Настройка устройства окончена. Можем открыть https://google.com для проверки: screen. В Fiddler мы можем наблюдать отловленный http и https трафик в расшифрованном виде.​
В большинства приложениях мы можем отловить HTTP/s трафик по инструкции описанной выше без каких либо проблем, но все чаще разработчики приложений используют "SSL Pinning" что бы никто кроме них и их сервера не мог анализировать HTTP/s трафик с приложения, в этом случае обычной MitM атакой мы на обойдемся - нам потребуется сделать патч функций которые проверяют подлинность сертификата, об этом ниже и пойдет речь.​
Приложение над которым мы будем работать: Kohls, в данном приложение имеется алгоритм проверки подлинности установленных сертификатов на устройстве, в случае обнаружение поддельного сертификата приложение обрубает связь, наша цель найти функцию/и которая проверяет подлинность, модифицировать алгоритм работы так что бы она всегда возвращала положительный результат.

Глава 3. Decompiling Android application

Так как наша цель это изменения кода программы для последующий сборки и использования нам потребуется 2 вида исходного кода приложения:​
  1. Java source - "оригинальный" код на котором было написано приложение, декомпилятор ".apk" имеет такой алгоритм: apk->smali->java. Исходный код Java нам потребуется для удобного чтения кода приложения, его компилировать и изменять мы не будем.
  2. Smali source - android приложение изначально пишется на Java, но dalvik (виртуальная машина Android) компилирует Java код в машинный код Smali, таким образом для того что бы изменить приложение и собрать его обратно нам нужно редактировать именно Smali что бы потом собрать его обратно.
Для начала нам требуется скачать целевое приложение, в нашем случае как было сказано выше это Kohls.​
Давайте создадим директорию под именем Kohls Decompiling (советую поместить эту папку в путь который не будет содержать латиницы во избежании конфликтов кодировок), и в этой папке создадим такие директории:​
  • smali
    • original smali - в этой директории мы будем хранить не измененный Smali код для того что бы откатится назад в случае краха :)
    • modificate smali - тут мы будем хранить модифицированный Smali код
  • java - в эту папку поместим Java исходник приложения
  • new apk - здесь будут измененные apk
В эту же папку поместим скачанный ранее apk файл приложения и дадим ему название "kohls.apk". Что получилось у меня: screen, конечно вы можете не делать этого, но для удобства в будущем я советую поступить именно так.

Decompiling Android application -> Java souce code:
  1. Открываем сайт JavaDecompilers.com, справа в меню выбираем раздел APK Decompiler (screen), далее выбираем файл исходный код которого мы хотим получить и жмем кнопку Upload and Decompile (screen), дожидаемся загрузки файла на их сервер и окончания процесса, по итогу вам нужно скачать архив с java source кодом приложения (screen)
  2. Полученный архив распаковываем в ранее созданную папку Kohls Decompiling -> java (screen)
Decompiling Android application -> Smali souce code:
Для получения машинного кода Android из приложения нам потребуется Apk Easy Tool - данная программа является графической оболочкой APKTool, скачиваем программу по ссылке в начале статьи.
Я создал отдельную папку в ранее созданной директории, и получил такой путь к Apk Easy Tool - Kohls Decompiling -> ApkEasyTool (screen).​
Теперь давайте запустим программу (в случае если у вас Windows x64 любой из двух, в ином случае файл под названием apkeasytool.exe), приступим к настройкам:​

  • Если после запуска появилось окно с предложением автоматической установки папок - отказываемся, мы будем настраивать все сами (screen):
    • Указываем настройки как на screenshot
  • Далее нам нужно указать APKTool которым будет управлять ApkEasyTool, скачиваем последнюю версию (screen). Закрываем ApkEasyTool, заходим в папку Kohls Decompiling -> ApkEasyTool -> Apktool - удаляем все что там находится и закидываем в нее файл скачанный пунктом ранее. Вновь открываем ApkEasyTool и выбираем в настройках версию APKTool (screen).
  • Указываем CMD mode - Normal (Default, screen)
  • В вкладке ApkTool указываем настройки как на screenshot - в исходный код не будем записывать информацию о процессе отладки, а так же отказываемся от декомпиляции ресурсов (могут быть проблемы при их компиляции), устанавливаем настройку в компиляторе которая позволит в дальнейшем если потребуется производить отладку приложения.
  • В вкладке Sign устанавливаем автоматическую подпись файла после его компиляции (screen)
Настройка ApkEasyTool окончена, возвращаемся на основную вкладку и загружаем apk для декомпиляции (screen), нажимаем кнопку Decompile (screen) и ожидаем (screen), в среднем декомпиляция приложения занимает в районе 2-3 минут, по окончанию работы вы увидите уведомление (screen). Мы можем открыть папку с smali source кодом нашего приложения нажатием на кнопку "Decompiled APK directory", или открыв руками путь к созданной ранее директории Kohls Decompiling -> smali -> modificate smali, скопируем созданную папку "kohls" в Kohls Decompiling -> smali -> original smali тем самым создав backup оригинального smali кода.​
По итогу мы имеем такое древо папок:​
Сразу уточню, что редактировать smali код мы будем тот который находится в папке Kohls Decompiling -> smali -> modificate smali, потому что именно из нее ApkEasyTool компилирует новый APK.​
Глава 4. Ищем функцию, изменяем ее и собираем приложение обратно

Как и говорилось ранее искать функции которые проверяют подлинность сертификата и изучать их мы будем в Java source code приложения - таким образом мы будем лицезреть более читаемый и понятный код, а изменять и собирать обратно мы будем smali source code приложения.​

Поиск функции которая проверяет подлинность сертификата в Java Source Code:
В данной статье я опишу 1 из методов поиска функций/и которые проверяют подлинность сертификатов установленных на устройстве (SSL Pinning), этот способ действует в 60-70 % случаев.​
С различными методами реализации SSLPinning вы можете ознакомится в этой статье.​
Мы будем искать ключевые слова:​
pinning
certificate pinning
по всем классам и файлам в исходном коде приложения, для удобного и быстрого поиска мы будем использовать программу XYplorer, открываем директорию с Java исходником в программе, и открываем вкладку Contens, в поле ввода пишем интересующий нас ключ для поиска (я выбрал "pinning" - он более универсален) и ищем файлы (screen).​
В результате поиска можем видеть такую картину: screen
Теперь нам нужно открыть каждый файл и поискать в нем функцию которая проверяет подлинность сертификатов, к примеру такие классы мы можем сразу отбрасывать, наша цель найти функцию где есть текст с ошибкой о проблеме с сертификатом, к примеру что то такое: Certificate pinning failure!, зачастую ошибки в Java Code формируются таким образом что сначала создается String переменная куда потом будет помещен текст ошибки, к примеру:​
Код:
StringBuilder append = new StringBuilder().append("Certificate pinning failure!").append("\n  Peer certificate chain:");
или через обертку "throw/catch":​
Код:
throw new IllegalArgumentException("Certificate pinning requires X509 certificates");
На основе этой информации нам нужно найти максимально подходящие функции, по итогу я нашел единственный подходящий класс: C6565k.java (имена могут отличаться от версии к версии самого android приложения), так же при поисках я учитывал местоположение класса, найденный мною класс по ключу находится в директории source\okhttp3 - okhttp3 это сетевая библиотека, и скорее всего именно этот класс находящийся в ее директории отвечает за проверку подлинности сертификатов, давайте взглянем что под капотом? Исходный код из найденного мною файла.​
В нем я нашел функции: m22766a и m22761a в этих функциях я нашел вывод ошибок о поддельном сертификате (screen), но функция m22761a вызывается в функции m22766a (screen), зная это мы не будем рассматривать редактирование функции m22761a, а будем сразу работать над функций m22766a (отдельно сама функция), кратко опишу алгоритм ее работы:​
функция получает список установленных пользователем сертификатов, и проверяет каждый на подлинность, в случае обнаружения хотя бы 1 поддельного сертификата мы получим ошибку.​
Все что нам нужно сделать это преждевременно до получения сертификатов и их проверки завершить функцию, к примеру так, таким образом функция не успеет получить список сертификатов установленных пользователем и соответственно выдать нам ошибку :) Осталось изменить функцию в Smali Source и собрать приложение!​
Поиск найденное ранее функции в Smali Source Code и ее модификация:
Smali это машинный язык для виртуальной машины dalvik, и его код сильно отличается от Java, список opcodes (команд, и так далее) вы можете найти здесь.​
Давайте откроем наш Smali source в XYplorer Kohls Decompiling -> smali -> modificate smali -> kohls
Попробуем найти класс по тексту ошибки в найденной ранее функции "Certificate pinning failure!", по итогу мы нашли всего 1 класс, который находится в той же директории что и класс в Java source: screen
Давайте откроем его(код всего класса) и найдем нашу функцию (функция). Теперь нам нужно найти в списке opcodes команду которая вернет функцию без определенного значения, в нашем случае это return-void, пропатчим smali функцию точно так же как и патчили ранее Java функцию (запатченная функция).​
Сохраняем измененный класс. Теперь нам остается скомпилировать приложение, об этом ниже:​
Компилируем модифицированное приложение:
Возвращаемся в ApkEasyTool, и даем приложению новое название (добавляем в конец версию), нажимаем кнопку Compile (после компиляции ApkEasyTool автоматически подпишет приложение так как мы установили такие настроек ранее), компилированный файл окажется в папке созданной нами ранее Kohls Decompiling -> new apk.​
Глава 5. Устанавливаем приложение и тестируем его

Устанавливаем новое приложение на эмулятор который мы ранее настроили, открываем так же ранее настроенный Fiddler и пробуем словить траффик :)
Видео моих тестов: https://www.pornhub.com/view_video.php?viewkey=ph5c058b48cbe16 или тут https://www.xvideos.com/video42305855/android_porn (кроме как туда я не нашел место для такого ролика :D )​
В окончание...
Для начала хотелось бы выразить огромную благодарность за возможность написать такую статью, потому что все таки в нынешние времена $ подталкивают творить :) Хочется верить что моя статья поможет людям в их начинаниях, или натолкнет на новые идеи в этой сфере.
Это мой первый опыт в подобных статьях-мануалах, я постарался написать так что бы было интересно и понятно новичкам, а так же уже опытным, в случае каких то вопросов прошу писать в тему - вдруг у кого то такой же вопрос или идея , обсудим вместе.
Так же хочу прикрепить список блогов и подобного что можем помочь вам:​


Спасибо за внимание :)
 
Последнее редактирование:

pewpewpew

HDD-drive
Пользователь
Регистрация
27.11.2018
Сообщения
40
Оценка реакций
15
Баллы
8
Тоже хотел про ssl pinning bypass писать (даже начал), блин :(. Ну да ладно, написано и оформлено хорошо, спасибо автору.
Пункт с javadecompilers.com немного избыточный (лишний), ведь это всё изначально может делать APK Easy Tool, но не страшно. Ещё можно было бы рассмотреть способы с помощью хуков через Frida (frida.re), и внедрением своего mitm сертификата в список доверенных (привет dropbox). И как вариант дополнить список софта аналогами под Linux, что на мой взгляд придало бы статье статус маст-ред.
Успехов в голосовании!
 

Грач

RAID-массив
Пользователь
Регистрация
01.10.2018
Сообщения
60
Оценка реакций
63
Баллы
26
Telegram
Тоже хотел про ssl pinning bypass писать (даже начал), блин :(. Ну да ладно, написано и оформлено хорошо, спасибо автору.
Пункт с javadecompilers.com немного избыточный (лишний), ведь это всё изначально может делать APK Easy Tool, но не страшно. Ещё можно было бы рассмотреть способы с помощью хуков через Frida (frida.re), и внедрением своего mitm сертификата в список доверенных (привет dropbox). И как вариант дополнить список софта аналогами под Linux, что на мой взгляд придало бы статье статус маст-ред.
Успехов в голосовании!
Я хотел расписать про софт под Linux, но с nix'ами не имею дел кроме работы с сервером - поэтому писать о том чего не знаю не хотелось, хотя из списка утилит - APKTool имеет возможность работы в nix, как и jadx(при помощи которого и работает сайт указанный в статье).
По поводу избыточного пункта про http://javadecompilers.com - APKTool не умеет создавать исходный код Java из Smali, поэтому пришлось описать работу с данным сайтом (не стал описывать работу с ПО, так как да же на моем 8 ядерном 8 поточном AMD разгоне в хлам JADX еле еле работает и зачастую крашит при декомпиляции, возможно отдельным пунктом еще допишу статью).
По поводу хуков при помощи frida - если ты имеешь такие знания и умения, хотелось бы увидеть от тебя такую статью - потому что сам я до сих пор не допер как правильно с ней работать, и читать 5-10 англоязычных статей и составлять все в голове в единое целое - достаточно тяжело (настрадался с изучением декомпилирования и тп apk'шек по таким статьям).
Кстати, dropbox я патчил хуком системных функций проверки на SSLPinning - если у кого то возникнет проблема с описанными мною методами в статье (не сработает и тп), подробно объясню каждому еще 1 метод работы - но не в виде статьи, а более свободном стиле.

Спасибо за рецензию и внимание собстно :)
 

opcode

floppy-диск
Пользователь
Регистрация
07.12.2018
Сообщения
1
Оценка реакций
0
Баллы
1



=>



Пардон, но что я упустил ?
 

Грач

RAID-массив
Пользователь
Регистрация
01.10.2018
Сообщения
60
Оценка реакций
63
Баллы
26
Telegram

Likantrop

floppy-диск
Пользователь
Регистрация
15.01.2019
Сообщения
2
Оценка реакций
2
Баллы
3
Давно хотел узнать как ломают защиты на апк приложухах) так что Грач ты красава)
 

DeiTy

RAM
Пользователь
Регистрация
24.12.2018
Сообщения
111
Оценка реакций
50
Баллы
24
Telegram

Likantrop

floppy-диск
Пользователь
Регистрация
15.01.2019
Сообщения
2
Оценка реакций
2
Баллы
3
Грач добавь тему как снифать трафик защищенных сайтов)
 
  • Like
Реакции: hex
Верх