Flutter

Reading time: 3 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Flutter

Flutter — це кросплатформений UI набір інструментів від Google, який дозволяє розробникам писати єдину кодову базу на Dart, яку Engine (рідний C/C++) перетворює на машинний код, специфічний для платформ Android та iOS. Engine об'єднує Dart VM, BoringSSL, Skia тощо, і постачається як спільна бібліотека libflutter.so (Android) або Flutter.framework (iOS). Вся фактична мережна діяльність (DNS, сокети, TLS) відбувається всередині цієї бібліотеки, а не в звичних шарах Java/Kotlin Swift/Obj-C. Це ізольоване проектування є причиною, чому звичайні Java-рівневі Frida хуки не працюють на Flutter додатках.

Перехоплення HTTPS трафіку в Flutter

Це резюме цього блог посту.

Чому перехоплення HTTPS є складним у Flutter

  • Перевірка SSL/TLS знаходиться на два шари нижче в BoringSSL, тому обхід Java SSL-пінінгу її не торкається.
  • BoringSSL використовує свій власний CA магазин всередині libflutter.so; імпорт вашого Burp/ZAP CA в системний магазин Android нічого не змінює.
  • Символи в libflutter.so виключені та спотворені, приховуючи функцію перевірки сертифікатів від динамічних інструментів.

Визначте точний стек Flutter

Знання версії дозволяє вам відновити або зіставити правильні бінарники.

КрокКоманда / ФайлРезультат
Отримати хеш знімкаbash\npython3 get_snapshot_hash.py libapp.so\nadb4292f3ec25…
Сопоставити хеш → Engineenginehash список в reFlutterFlutter 3 · 7 · 12 + коміт двигуна 1a65d409…
Витягти залежні комітиDEPS файл у цьому коміті двигунаdart_revision → Dart v2 · 19 · 6
dart_boringssl_rev → BoringSSL 87f316d7…

Знайдіть get_snapshot_hash.py тут.

Ціль: ssl_crypto_x509_session_verify_cert_chain()

  • Розташована в ssl_x509.cc всередині BoringSSL.
  • Повертає bool – одне true достатньо, щоб обійти всю перевірку ланцюга сертифікатів.
  • Така ж функція існує на кожній архітектурі ЦП; лише опкоди відрізняються.

Варіант A – Бінарне патчування з reFlutter

  1. Клонувати точні джерела Engine та Dart для версії Flutter додатку.
  2. Regex-патч двох гарячих точок:
  • У ssl_x509.cc, примусити return 1;
  • (Необов'язково) У socket_android.cc, жорстко закодувати проксі ("10.0.2.2:8080").
  1. Перекомпілювати libflutter.so, повернути його назад в APK/IPA, підписати, встановити.
  2. Попередньо патчовані збірки для загальних версій постачаються в релізах reFlutter на GitHub, щоб заощадити години часу на збірку.

Варіант B – Живе підключення з Frida (шлях "хард-кор")

Оскільки символ виключений, ви скануєте завантажений модуль на предмет його перших байтів, а потім змінюєте значення повернення на льоту.

javascript
// attach & locate libflutter.so
var flutter = Process.getModuleByName("libflutter.so");

// x86-64 pattern of the first 16 bytes of ssl_crypto_x509_session_verify_cert_chain
var sig = "55 41 57 41 56 41 55 41 54 53 48 83 EC 38 C6 02";

Memory.scan(flutter.base, flutter.size, sig, {
onMatch: function (addr) {
console.log("[+] found verifier at " + addr);
Interceptor.attach(addr, {
onLeave: function (retval) { retval.replace(0x1); }  // always 'true'
});
},
onComplete: function () { console.log("scan done"); }
});

Виконайте це:

bash
frida -U -f com.example.app -l bypass.js

Поради щодо портирования

  • Для arm64-v8a або armv7, візьміть перші ~32 байти функції з Ghidra, перетворіть у рядок шістнадцяткових значень, розділених пробілами, і замініть sig.
  • Зберігайте один шаблон на кожен реліз Flutter, зберігайте їх у шпаргалці для швидкого повторного використання.

Примус трафіку через ваш проксі

Flutter сам по собі ігнорує налаштування проксі пристрою. Найпростіші варіанти:

  • Емулятор Android Studio: Налаштування ▶ Проксі → вручну.
  • Фізичний пристрій: злий Wi-Fi AP + спуфінг DNS, або редагування модуля Magisk /etc/hosts.

Посилання