İçeriğe geç

Flutter Android – SSL Pinning Bypass

Rabbim; beni, bana ve ebeveynime verdiğin nimete şükretmeye, hoşnut olacağın iyi bir iş yapmaya yönelt! Soyum içinde, benim için barışı gerçkeleştir. Sana yöneldim ben, sana teslim olanlardanım ben!
Ahkaf 15

Tamamen kendime bir not olsun diye paylaştığım bir yazı olacka ancak flutter konusunda uğraşmış ve ssl pinning yapmaya çalışan kişiler için yararlı olacağını düşünüyorum. Bütün işlemleri KALI üzerinden yapmam ve bu yazıyı MAC'te yazmamdan dolayı komutları paylaşamyacağım ancak elimden geldiğince anlatmaya çalışacağım.

Müşterilerimizden birinden bir test geldi ve flutter ile yazılmış bir projeyi test etmemiz istendi. Daha önce nasıl yapıldığını iOS için yazmıştım ancak bu sefer uygulama içerisinde root detection, emulator detection gibi önlemlerde olduğu için daha kolay olur diye Android ile yapmaya karar verdim. Generic bir script olduğu için hem root hem de emulator için yazdığım scripti aşağıda paylaşıyorum.

 Java.perform(function() {
    var RootBeer = Java.use("com.scottyab.rootbeer.RootBeer");

    RootBeer.isRooted.implementation = function() {
      console.log("isRooted method was called");
      return false; // Her zaman false döndür
    };
  });

  Java.perform(function() {
    var MethodCallHandlerImpl = Java.use("dev.fluttercommunity.plus.device_info.MethodCallHandlerImpl");

    MethodCallHandlerImpl.isEmulator.implementation = function() {
      console.log("isEmulator method was called");
      return false; // Her zaman false döndür
    };
  });

Daha sonrasında da uygulamayı test etmeye başladım. Apk sağlayıcı sitelerden apk'yı edindim ve daha sonrasında reflutter tool'u ile hızlıca ssl pinning'i bypass ettim ve trafiği proxy sunucuma yönlendirdim. Daha sonrasında uber-apk-signer ile uygulamayı imzaladım. Root edilmiş cihazda frida scripti ile uygulamayı çalıştırdım ve teste başladım. Ancak müşteri daha sonrasında e-postam aracılığı ile beni beta testlerine dahil etti ve beta sürümünü Google Play üzerinden indirmemei istedi. İşte bütün senaryo burada başladı.

Emulatorümde Google Play yok, store olan emulator'ümde root'lu değil. root'lu olmayan cihazdanda indirdiğim ve başka hiçbir yerde bulamayacağım beta sürümünün apk'sını elde edemiyor. Beta sürümünde tamamen domainler farklı, db'ler farklı bütün ortamlar farklı. Bundan dolayı gerçek uygulama üzerinde test etmemi istemiyorlar. Ancak ben uygulamanın APK'sına bir türlü erişemiyordum. Bunun üzerine fiziksel bir cihazı root'ladım. Samsung marka bir telefonu rootladığımda şansıma frida-server'da da bir issue olarak bekleyen bir hatadan dolayı frida-server'ı gerçek cihazımda çalıştıramadım ancak artık buradan apk'yı elde edebilir ve emulator üzerinde test edebilirdim.

Bu esnada tecrübeme tecrübe katacak yeni şeyler öğrendim. Flutter native bir şekilde geldiğinden dolauyı beta sürümüne kayıt olup uygulamayı indirdiğimde benim fiziksel telefonumun işlemcisine göre uygulama iniyor ve uygulama store'a apk yerine .aab dosyası ile yüklendiğinden dolayı dinamik bir apk beni bekliyordu. Uygulamanın apk'larını bul dediğimde bana 6 tane farklı apk buluyordu. Bunlar base.apk, dil ile ilgili config apk'ları ve flutter kütüphanesini içeren bir apk. İlk başta tecrübesizlikten base.apk'yı aldım ve emulator'de çalıştırdığımda logcat kayıtlarında bana flutter'ı bulamadığını söyledi.

Bunun üzerine anladımki 6 apk'yıda kullanmam gerekecek. İlk başta sadece flutter ile ilgili olan apk'yı alıp reflutter ile ssl pinning bypass işlemi gerçekleştirdim ancak daha sonrasında emulatore yükleme işlemleri yaptığımda sürekli olarak sertifika ile ilgili hatalar alıyordum apk'ları farklı görüyor ve yükleyemiyordu bu arada yükleme işlemi yaparkende adb install-multiple base.apk split_config.ar.apk split_config.arm64_v8a.apk split_config.tr.apk split_config.en.apk split_config.xxhdpi.apk şeklinde bir komut veriyordum böylece bütün yüklemeleri bir seferde yapabiliyordu ama gelen hatalardan dolayı başarılı olamadım.

Peki sorunu nasıl çözdüm. İlk başta bütün apk'ları aldım. Daha sonrasında flutter ile ilgili olan apk'yı reflutter ile bypass ettim. Sonrasında bütün apk'ları bir klasörün içerisine koyup uber-apk-signer ile --apks flagini kullanarak klasörü belirttim, ikinci flag olarakda şuan tam adını hatırlamadığım ama hepsinin tekrardan imzala komutunu verdim. Daha sonrasında tekrar adb ile çalıştırdığımda uygulama başarıyla yüklenmiş ve bypass edilmiş oldu.

Ancak burada ekstra bir şeyden bahsetmek istiyorum. Farklı telefonlar kullanıldığında doğal olarak chip setler farklı olabilir. Ben rootAVD aracı ile Google Play Store'a sahip olan bir emulator'ü rootlayabildim. Bu sayede root edilmiş bir emulatorden markete gidip uygulamanın bet sürümünü indirip daha sornasında adb shell pm path <uygulama adı> komutu ile uygulamanın apk'larını elde ettim. İnternette böyle bir yazı hiç görmediğim için yararlı olacağını düşünüyorum, benim içinse gerçekten güzel bir tecrübe oldu. Bu tecrübe ile flutter uygulamarını artık kolay bir şekilde android özelinde test etmek mümkün olacaktır.

Tools:

Kategori:AndroidAndroid SecurityFlutter

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir