
🤖 CLI-приложение, которое автоматически подготавливает APK-файлы Android для проверки HTTPS
CLI-приложение, которое автоматически подготавливает APK-файлы Android для инспекции HTTPS-трафика
Инспекция HTTPS-трафика мобильного приложения через прокси — это, вероятно, самый простой способ понять, как оно работает. Однако с появлением [Network Security Configuration][network-security-config] в Android 7 и попытками разработчиков предотвратить MITM-атаки с помощью [certificate pinning][certificate-pinning], настройка приложения для работы с HTTPS-прокси стала довольно утомительной.
apk-mitm автоматизирует весь процесс. Всё, что нужно — передать ему APK-файл, и apk-mitm сделает следующее:
Вы также можете использовать apk-mitm для патчинга приложений с использованием Android App Bundle, и рутирование телефона не требуется.
Изменение обычного поведения приложения для обхода таких функций безопасности, как certificate pinning, требует либо изменения исходного кода приложения до его запуска, либо ["хукинга"][hooking] приложения во время его работы для перехвата вызовов функций.
В настоящее время apk-mitm использует первый подход — модификацию кода приложения, сначала «дизассемблируя» приложение с помощью [Apktool][apktool], внося изменения в несколько файлов, а затем собирая его обратно (снова с помощью Apktool).
Этот подход имеет преимущество: он не требует рутированного устройства, но у него есть и несколько недостатков. Самая большая проблема заключается в том, что приложения, по сути, не предназначены для дизассемблирования. Apktool пытается сделать это в любом случае, но, особенно с большими и сложными приложениями, часто возникают проблемы.
Другая проблема этого подхода заключается в том, что некоторые методы certificate pinning, например проверки, выполняемые в нативных бинарных файлах (как в случае с фреймворками вроде Flutter), очень трудно или невозможно обойти. По этой причине для более сложных приложений может быть полезно опробовать другие подходы.
В частности, я хотел бы выделить [проект android-unpinner от mitmproxy][android-unpinner] и [базовые скрипты frida-interception-and-unpinning от HTTP Toolkit][frida-interception-and-unpinning]. Их подход применяет патчи во время выполнения с помощью [Frida][frida], что гораздо мощнее, но также означает, что его либо нельзя использовать, либо он сложнее в использовании без рутированного устройства.
Если у вас установлены актуальные версии [Node.js][node] (14+) и [Java][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][charles] или [mitmproxy][mitmproxy], чтобы просматривать трафик приложения.
Вы также можете патчить приложения, используя Android App Bundle, с помощью apk-mitm, предоставив ему файл *.xapk (например, из [APKPure][apkpure]) или файл *.apks (который вы можете экспортировать самостоятельно с помощью [SAI][sai]). Если вы делаете это в Linux, убедитесь, что установлены zip и unzip.
Иногда вам потребуется внести ручные изменения в приложение, чтобы оно заработало. В таких случаях вам понадобится опция --wait. Её включение заставит apk-mitm ждать перед повторным кодированием приложения, позволяя вам вносить изменения в файлы во временной папке.
Если вы хотите экспериментировать с разными изменениями в APK, то использование --wait, вероятно, не самый удобный вариант, так как он вынуждает начинать с нуля каждый раз. В этом случае вам стоит обратить внимание на [APKLab][apklab]. Это рабочая среда для реверс-инжиниринга Android, построенная на базе VS Code, которая поддерживает [apk-mitm][apklab-mitm] и позволяет итерировать гораздо быстрее.
На некоторых устройствах (например, Android TV) вы не можете добавить новый сертификат в корневые сертификаты системы. В таких случаях вы всё равно можете добавить сертификат вашего прокси [непосредственно в Network Security Config приложения][network-security-config-custom-ca], так как это работает на любом устройстве. Вы можете сделать это, запустив apk-mitm с флагом --certificate, указав путь к сертификату (файл .pem или .der), используемому вашим прокси.
Если приложение использует Google Maps и после патчинга карта перестала работать, то, вероятно, API-ключ приложения [ограничен сертификатом разработчика][google-api-key-restrictions]. Вам нужно будет [создать свой собственный API-ключ][google-maps-android] без ограничений и запустить apk-mitm с опцией --wait, чтобы заменить значение com.google.android.geo.API_KEY в файле AndroidManifest.xml приложения.
Если apk-mitm вылетает при декодировании или кодировании, проблема, скорее всего, связана с [Apktool][apktool]. Проверьте [их issues на GitHub][apktool-issues], чтобы найти возможные обходные пути. Если вы найдёте версию Apktool, на которую не влияет проблема, вы можете указать apk-mitm использовать её, задав путь к её JAR-файлу через опцию --apktool.
MIT © Niklas Higi