
Скрипты Frida для переписывания мобильных приложений во время выполнения с целью прямого MitM-перехвата всего HTTPS-трафика
Часть HTTP Toolkit: мощные инструменты для создания, тестирования и отладки HTTP(S)
В этом репозитории содержатся Frida-скрипты, предназначенные для выполнения всего, что необходимо для полностью автоматизированного HTTPS MitM-перехвата на мобильных устройствах.
Этот набор скриптов можно использовать целиком — для организации перехвата, управления доверием к сертификатам и отключения проверок certificate pinning и certificate transparency — для MitM-перехвата HTTP(S)-трафика на Android и iOS. Также их можно использовать и настраивать по отдельности, чтобы хукать только отдельные функции.
Скрипты могут автоматически:
-----BEGIN CERTIFICATE-----. Вы можете открыть его в текстовом редакторе, чтобы увидеть и извлечь это содержимое.config.js и добавьте эти детали:
CERT_PEM: ваш CA-сертификат в формате PEM.PROXY_PORT: порт проксиPROXY_HOST: адрес вашего прокси с точки зрения вашего устройства (или используйте adb reverse tcp:$PORT tcp:$PORT, чтобы пробросить порт через ADB, и используйте 127.0.0.1 в качестве хоста)frida-server с github.com/frida/frida, распакуйте его, выполните adb push на устройство, а затем запустите его следующими 4 командами: , , , .-----BEGIN CERTIFICATE-----. Вы можете открыть его в текстовом редакторе, чтобы увидеть и извлечь это содержимое.config.js и добавьте эти детали:
CERT_PEM: ваш CA-сертификат в формате PEM.PROXY_PORT: порт проксиPROXY_HOST: адрес вашего прокси с точки зрения вашего устройстваhttps://build.frida.re в качестве источника пакетов.frida-ps -Uai на вашем компьютере, чтобы подтвердить, что всё работает правильно.frida-ps -Uai (для быстрой проверки попробуйте использовать github.com/httptoolkit/ios-ssl-pinning-demo — id: )Приведённые выше команды используют все соответствующие скрипты, но в целом вы можете использовать любой их набор. Однако почти во всех случаях вам потребуется включить config.js первым скриптом (он определяет некоторые переменные, используемые другими скриптами).
Например, чтобы выполнить только отключение pinning на Android, когда конфигурация прокси и сертификатов обрабатывается в другом месте и без запасных вариантов для обфускации, вы можете просто запустить:
frida -U \
-l ./config.js \
-l ./android/android-certificate-unpinning.js
-f $PACKAGE_ID
Каждый скрипт содержит подробную документацию о том, что он делает и как работает, в большом блоке комментариев в начале. Скрипты:
config.js
Этот скрипт определяет переменные, используемые другими скриптами:
CERT_PEM — дополнительный CA-сертификат, которому следует доверять, в формате PEMPROXY_HOST — IP-адрес (IPv4) прокси-сервера для использования (не требуется, если вы только выполняете отключение pinning)PROXY_PORT — порт прокси-сервера для использования (не требуется, если вы только выполняете отключение pinning)DEBUG_MODE — по умолчанию false, но переключение на true включит множество дополнительного вывода, который может быть полезен для отладки и реверс-инжиниринга любых проблем.BLOCK_HTTP3 — по умолчанию true, что блокирует HTTP/3 путём отбрасывания всех UDP-соединений на порт 443.Этот скрипт должен быть указан в командной строке перед любыми другими скриптами.
native-connect-hook.js
Захватывает весь сетевой трафик напрямую, направляя все соединения на настроенные хост и порт прокси.
Это низкоуровневый хук, который применяется ко всем сетевым соединениям. Это гарантирует, что все соединения принудительно перенаправляются на целевой прокси-сервер, даже те, которые игнорируют настройки прокси или устанавливают другие «сырые» socket-соединения, а также блокирует HTTP/3-соединения, если эта функция включена.
Эти скрипты являются частью более широкого проекта HTTP Toolkit, финансируемого через фонд NGI Zero Entrust, учреждённый NLnet при финансовой поддержке программы Next Generation Internet Европейской комиссии. Подробнее на странице проекта NLnet.
adb shellsuchmod +x /.../frida-server/.../frida-serveradb devices) перед выполнением команд. Обратите внимание, что Frida будет работать на устройстве только от имени root, что и обеспечивает su в примере выше при запуске на рутированном устройстве. Чтобы проверить, что вы root после выполнения su или аналогичной команды, убедитесь, что whoami в оболочке выводит root.tech.httptoolkit.pinning_demo)config.js). Какие скрипты использовать — решать вам, но для Android хорошей стартовой командой будет:
frida -U \
-l ./config.js \
-l ./native-connect-hook.js \
-l ./native-tls-hook.js \
-l ./android/android-proxy-override.js \
-l ./android/android-system-certificate-injection.js \
-l ./android/android-certificate-unpinning.js \
-l ./android/android-certificate-unpinning-fallback.js \
-l ./android/android-disable-root-detection.js \
-f $PACKAGE_ID
com.httptoolkit.ios-pinning-democonfig.js). Какие скрипты использовать — решать вам, но для iOS хорошей стартовой командой будет:
frida -U \
-l ./config.js \
-l ./ios/ios-connect-hook.js \
-l ./ios/ios-disable-detection.js \
-l ./native-tls-hook.js \
-l ./native-connect-hook.js \
-f $APP_ID
Этот хук применяется к libc и работает на Android, Linux, iOS и многих других связанных окружениях.
native-tls-hook.js
Изменяет всю проверку TLS для библиотек на основе BoringSSL, чтобы они доверяли вашему настроенному CA-сертификату.
В частности, этот скрипт хукает встроенные BoringSSL API на iOS, которые являются обычным способом проверки TLS-сертификатов в iOS (поэтому этого достаточно почти для всего HTTPS-перехвата на iOS), но он также используется в некоторых других случаях и на iOS, и на Android.
По сути, это заставляет доверять вашему CA для всех сертификатов и отключает все certificate pinning, certificate transparency и другие ограничения для вашего CA. Обратите внимание, что, в отличие от многих других Frida-хуков, этот скрипт не отключает проверку TLS полностью (что очень небезопасно). Вместо этого он переопределяет проверку, чтобы все соединения, использующие ваш конкретный CA-сертификат, считались доверенными, не ослабляя проверку настолько, чтобы позволить перехват третьими сторонами.
android/
android-proxy-override.js
Переопределяет настройки прокси Android для целевого приложения, гарантируя, что весь корректный трафик перенаправляется через прокси-сервер и перехватывается.
android-system-certificate-injection.js
Изменяет нативные Android API, чтобы все хранилища доверия по умолчанию доверяли вашему дополнительному CA-сертификату, позволяя перехватывать зашифрованный TLS-трафик.
android-certificate-unpinning.js
Изменяет или отключает множество распространённых известных методов дополнительных ограничений сертификатов, включая certificate pinning (принятие только небольшого набора распознанных сертификатов, а не всех сертификатов, которым доверяет система) и certificate transparency (проверку того, что все используемые сертификаты были зарегистрированы в публичных сертификатных журналах).
android-certificate-unpinning-fallback.js
Обнаруживает необработанные ошибки проверки сертификатов и пытается обработать неизвестные нераспознанные случаи с помощью автоматически создаваемых запасных патчей. Это более экспериментальный скрипт, и он может быть несколько непредсказуемым, но очень полезен для обфусцированных случаев: в целом он либо исправит проблемы pinning (после одного первоначального сбоя), либо, по крайней мере, выделит код для дальнейшего реверс-инжиниринга в выводе журнала Frida. Этот скрипт разделяет некоторую логику с android-certificate-unpinning.js и не может использоваться отдельно — если вы хотите использовать этот скрипт, вам нужно будет также подключить обычный скрипт отключения pinning (не fallback-версию).
android-disable-root-detection.js
Отключает распространённые проверки обнаружения root в нативных и Java-слоях, чтобы предотвратить обнаружение рутированных Android-устройств.
Этот скрипт перехватывает доступ к файловой системе, shell-команды и поиск пакетов по известным индикаторам root (таким как su, Magisk и связанные приложения), а также подделывает ключевые системные свойства (ro.secure, ro.debuggable и т.д.), чтобы имитировать производственную среду.
Он блокирует подозрительное поведение, такое как проверки существования файлов и выполнение shell-команд, помогая избежать обнаружения в приложениях, использующих как стандартные, так и продвинутые проверки root.
android-disable-flutter-certificate-pinning.js
Обеспечивает доверие приложений на основе Flutter (которые обычно игнорируют системную конфигурацию сертификатов) к вашему CA-сертификату, даже в большинстве случаев явного certificate pinning. Этот скрипт пока остаётся экспериментальным.
ios/
ios-connect-hook.js
Захватывает весь сетевой трафик iOS напрямую, направляя все соединения на настроенные хост и порт прокси.
Это низкоуровневый хук, который применяется ко всем сетевым соединениям. Это гарантирует, что все соединения принудительно перенаправляются на целевой прокси-сервер, даже те, которые игнорируют настройки прокси или устанавливают другие «сырые» socket-соединения.
ios-disable-detection.js
Отключает обнаружение джейлбрейка JailMonkey.
utilities/test-ip-connectivity.js
Вероятно, вам не нужно использовать этот скрипт в рамках самого перехвата, но он может быть очень полезен при настройке конфигурации.
Этот скрипт позволяет настроить список возможных IP-адресов и целевой порт, после чего процесс проверяет каждый адрес и отправляет сообщение Frida-клиенту для первого доступного адреса из списка. Это может быть полезно для автоматизированных процессов настройки, если вы не знаете, какой IP-адрес лучше всего использовать для доступа к прокси-серверу (вашему компьютеру) с целевого устройства (вашего телефона).