Это копипаст,надеюсь грач меня простит,букв много,для заинтересованной аудитории сойдёт,все ссылки в оригинале,за ваши действия ответственности не несу,публикация с целью ознакомления.Для КФ,если не правильно разместил,прошу аккуратно перенести в нужный раздел. Перехватываем 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 вида исходного кода приложения: Java source - "оригинальный" код на котором было написано приложение, декомпилятор ".apk" имеет такой алгоритм: apk->smali->java. Исходный код Java нам потребуется для удобного чтения кода приложения, его компилировать и изменять мы не будем. 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: Открываем сайт JavaDecompilers.com, справа в меню выбираем раздел APK Decompiler (screen), далее выбираем файл исходный код которого мы хотим получить и жмем кнопку Upload and Decompile (screen), дожидаемся загрузки файла на их сервер и окончания процесса, по итогу вам нужно скачать архив с java source кодом приложения (screen) Полученный архив распаковываем в ранее созданную папку 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 ) В окончание... Так же хочу прикрепить список блогов и подобного что можем помочь вам: https://wiki.smartphonefrance.info/reversing-android.ashx http://iisecurity.in/blog/344/ https://android.jlelse.eu/reverse-engineering-musical-y-live-ly-android-apps-part-1-a910daad2ec2 https://medium.com/@dwi.siswanto98/cara-reverse-engineering-apk-3edbf86bf0b1 https://www.evilsocket.net/2017/04/27/Android-Applications-Reversing-101/ https://android.jlelse.eu/getting-inside-apk-files-21dbd01529d4 https://medium.com/@dwi.siswanto98/cara-reverse-engineering-apk-3edbf86bf0b1