
🤖 CLI-приложение, которое автоматически подготавливает APK-файлы Android для проверки HTTPS
CLI-приложение, которое автоматически подготавливает APK-файлы Android для инспекции HTTPS-трафика
Инспекция HTTPS-трафика мобильного приложения через прокси — это, вероятно, самый простой способ понять, как оно работает. Однако с появлением Network Security Configuration в Android 7 и попытками разработчиков предотвратить MITM-атаки с помощью certificate pinning, настройка приложения для работы с HTTPS-прокси стала довольно утомительной.
apk-mitm автоматизирует весь процесс. Всё, что нужно — передать ему APK-файл, и apk-mitm сделает следующее:
Вы также можете использовать apk-mitm для патчинга приложений с использованием Android App Bundle, и рутирование телефона не требуется.
Изменение обычного поведения приложения для обхода таких функций безопасности, как certificate pinning, требует либо изменения исходного кода приложения до его запуска, либо "хукинга" приложения во время его работы для перехвата вызовов функций.
В настоящее время apk-mitm использует первый подход — модификацию кода приложения, сначала «дизассемблируя» приложение с помощью Apktool, внося изменения в несколько файлов, а затем собирая его обратно (снова с помощью Apktool).
Этот подход имеет преимущество: он не требует рутированного устройства, но у него есть и несколько недостатков. Самая большая проблема заключается в том, что приложения, по сути, не предназначены для дизассемблирования. Apktool пытается сделать это в любом случае, но, особенно с большими и сложными приложениями, часто возникают проблемы.
Другая проблема этого подхода заключается в том, что некоторые методы certificate pinning, например проверки, выполняемые в нативных бинарных файлах (как в случае с фреймворками вроде Flutter), очень трудно или невозможно обойти. По этой причине для более сложных приложений может быть полезно опробовать другие подходы.
В частности, я хотел бы выделить проект android-unpinner от mitmproxy и базовые скрипты frida-interception-and-unpinning от HTTP Toolkit. Их подход применяет патчи во время выполнения с помощью Frida, что гораздо мощнее, но также означает, что его либо нельзя использовать, либо он сложнее в использовании без рутированного устройства.
Если у вас установлены актуальные версии Node.js (14+) и Java (8+), вы можете установить apk-mitm выполнив:
npm install -g apk-mitm
После установки выполните эту команду для патчинга приложения:
apk-mitm <путь-к-apk>
Патчинг APK-файла с именем example.apk может выглядеть так:
$ apk-mitm example.apk
✔ Декодирование APK-файла
✔ Изменение манифеста приложения
✔ Замена конфигурации сетевой безопасности
✔ Отключение certificate pinning
✔ Кодирование пропатченного APK-файла
✔ Подписание пропатченного APK-файла
Готово! Пропатченный APK: ./example-patched.apk
Теперь вы можете установить файл example-patched.apk на своё Android-устройство и использовать прокси вроде Charles или mitmproxy, чтобы просматривать трафик приложения.
Вы также можете патчить приложения, используя Android App Bundle, с помощью apk-mitm, предоставив ему файл *.xapk (например, из APKPure) или файл *.apks (который вы можете экспортировать самостоятельно с помощью SAI). Если вы делаете это в Linux, убедитесь, что установлены zip и unzip.
Иногда вам потребуется внести ручные изменения в приложение, чтобы оно заработало. В таких случаях вам понадобится опция --wait. Её включение заставит apk-mitm ждать перед повторным кодированием приложения, позволяя вам вносить изменения в файлы во временной папке.
Если вы хотите экспериментировать с разными изменениями в APK, то использование --wait, вероятно, не самый удобный вариант, так как он вынуждает начинать с нуля каждый раз. В этом случае вам стоит обратить внимание на APKLab. Это рабочая среда для реверс-инжиниринга Android, построенная на базе VS Code, которая поддерживает apk-mitm и позволяет итерировать гораздо быстрее.
На некоторых устройствах (например, Android TV) вы не можете добавить новый сертификат в корневые сертификаты системы. В таких случаях вы всё равно можете добавить сертификат вашего прокси непосредственно в Network Security Config приложения, так как это работает на любом устройстве. Вы можете сделать это, запустив apk-mitm с флагом --certificate, указав путь к сертификату (файл .pem или .der), используемому вашим прокси.
Если приложение использует Google Maps и после патчинга карта перестала работать, то, вероятно, API-ключ приложения ограничен сертификатом разработчика. Вам нужно будет создать свой собственный API-ключ без ограничений и запустить apk-mitm с опцией --wait, чтобы заменить значение com.google.android.geo.API_KEY в файле AndroidManifest.xml приложения.
Если apk-mitm вылетает при декодировании или кодировании, проблема, скорее всего, связана с Apktool. Проверьте их issues на GitHub, чтобы найти возможные обходные пути. Если вы найдёте версию Apktool, на которую не влияет проблема, вы можете указать apk-mitm использовать её, задав путь к её JAR-файлу через опцию --apktool.
MIT © Niklas Higi