Перехватываем HTTP/s трафик Android.
Звучит просто, но так ли это на самом деле ?
Глава 0. Инструмент
- Fiddler - отладочный прокси сервер
- Apk Easy Tool - при помощи нее мы сможем декомпилировать, компилировать и подписывать apk приложения для Android. (как скачать: screen)
- JavaDecompilers.com - онлайн декомпилятор apk приложений в java source code.
- XYplorer - файловый менеджер Windows с удобным поиском содержимого в файлах.
- Notepad++ - просто удобный текстовый редактор.
- Memu emulator - Android эмулятор основанный на виртуальной машине HyperV
Fiddler нам понадобится для того что бы перехватывать трафик при помощи технологии MitM
Устанавливаем Fiddler и настраиваем его:
Tools -> Options (screen)
- HTTPS (screen правильных настроек)
- HTTPS CONNECTs: перехват https подключений (потребуется установка сертификата - устанавливаем)
- Decrypt HTTPS traffic: расшифровка шифрованного https трафика
- Ignore server certificate errors (unsafe): игнорирование ошибок
- HTTPS CONNECTs: перехват https подключений (потребуется установка сертификата - устанавливаем)
- 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 в доверенные на устройстве
Настройка устройства окончена. Можем открыть
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 код
- original 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 вы можете ознакомится в этой статье.
Мы будем искать ключевые слова:
pinningcertificate 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 (кроме как туда я не нашел место для такого ролика
)
В окончание...Для начала хотелось бы выразить огромную благодарность за возможность написать такую статью, потому что все таки в нынешние времена $ подталкивают творить
Хочется верить что моя статья поможет людям в их начинаниях, или натолкнет на новые идеи в этой сфере.
Это мой первый опыт в подобных статьях-мануалах, я постарался написать так что бы было интересно и понятно новичкам, а так же уже опытным, в случае каких то вопросов прошу писать в тему - вдруг у кого то такой же вопрос или идея , обсудим вместе.
Так же хочу прикрепить список блогов и подобного что можем помочь вам:
- 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
Спасибо за внимание
Последнее редактирование: