Загрузка...

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

Тема в разделе Веб уязвимости создана пользователем Fockstrot 29 янв 2019. 1517 просмотров

Загрузка...
  1. Fockstrot
    Fockstrot Автор темы 29 янв 2019 Заблокирован(а) 1488 14 май 2016
    Это копипаст,надеюсь грач меня простит,букв много,для заинтересованной аудитории сойдёт,все ссылки в оригинале,за ваши действия ответственности не несу,публикация с целью ознакомления.Для КФ,если не правильно разместил,прошу аккуратно перенести в нужный раздел.
    [IMG]


    Перехватываем 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 кода.
    По итогу мы имеем такое древо папок:
    [IMG]
    Сразу уточню, что редактировать 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 )
    В окончание...
    Так же хочу прикрепить список блогов и подобного что можем помочь вам:
     
Top