Android SSL Pinning Bypass – Facebook&Twitter

Android SSL Pinning Bypass – Facebook&Twitter

Mobil uygulama güvenliğinde sıkça gündeme gelen ve güvenlik testi uzmanlarını yakından ilgilendiren bir konu olan SSL Pinning, test aşamasında çıkardığı zorlukla ve ayrıca uygulanabilecek çeşitli saldırılarda kilit pozisyonda olmasından dolayı önem taşımakta. Bu yazıda kısaca SSL Pinning’in ne olduğundan ve nasıl bypass edilebileceğinde bahsettikten sonra bir örnek üzerinde uygulamasını anlatacağım.

Nedir bu SSL Pinning?

SSL Pinning, bir diğer adıyla Certificate Pinning, SSL tokalaşmasından sonra bile sunucu sertifikalarını tekrar doğrulayarak ortadaki adam (MITM) saldırısını önlemek için istemci tarafında kullanılan bir tekniktir. Geliştiriciler, geliştirme sırasında istemci uygulamasına güvenilir sertifikaların bir listesini yerleştirir (veya sabitler) ve bunları uygulamanın çalışması sırasında sunucu sertifikalarıyla karşılaştırmak için kullanırlar. Sunucu ile sertifikaların yerel kopyası arasında bir uyumsuzluk varsa, bağlantı kesilir ve sunucuya başka hiçbir veri gönderilmez. Bu yöntem, cihazların yalnızca özel güvenilir sunucularla iletişim kurmasını sağlar.

İki çeşit SSL Pinning implementasyonu vardır. Sertifika sabitleme ve Public Key sabitleme
Sertifika Sabitleme (Certificate Pinning) : Sertifika sabitlemede, geliştirici SSL sertifikasının bazı bayt kodlarını uygulama koduna kodlar. Uygulama sunucuyla iletişim kurduğunda, bir sertifikada aynı bayt kodunun bulunup bulunmadığını kontrol eder. Varsa, uygulama sunucuya bir istek gönderir. Bayt kodu eşleşmezse bir SSL sertifikası hatası atar. Bu teknik, bir saldırganın kendi imzasını taşıyan sertifikasını kullanmasını engeller.
Public Key Sabitleme (Public Key Pinning) : Bir müşteri bir web sitesini ziyaret ettiğinde Public Key sabitlemede, sunucu public key değerini istemci (müşterinin) tarayıcısına sabitler (enjekte ederek). İstemci aynı web sitesini yeniden ziyaret ettiğinde, sunucu bağlantının bütünlüğünü kontrol etmek için public keyi tanımlar. Bu teknik ayrıca bir saldırganın kendinden imzalı sertifikasını kullanmasını da önler.

SSL Pinning Bypass İşlemi

Mobil uygulama testlerinde, uygulamanın web hizmeti çağrılarını görüntülemek ve fuzzing gibi işlemler gerçekleştirmek için burpsuite  gibi bir proxy aracı ile araya girerek istekleri yakalamak gerekmektedir. Fakat SSL Pinning bu nokta da bizlere sıkıntı çıkarmaktadır. Bunun önüne geçmek için, SSL Pinning’i bypass etmek için dört yöntem bulunmaktadır. Bunlar ;

  • Custom Sertifika Ekleme
  • Gömülü Sertifikanın üzerine yazmak
  • Frida ile müdahale
  • Custom Sertifika Doğrulama Kodunun Reverse Edilmesi

Bahsi geçen bu yöntemler, gün geçtikçe bypass işlemi üzerine alınmış önlemlerin bypass edilmesi şeklinde gelişen bir süreci göstermektedir. Uygulama kısmında bu işlemlerin pratikte nasıl hayata geçtiğini göreceğiz.

Frida ile SSL Pinning Bypass

Uygulama işlemi için bazı araçlara ihtiyaç duymaktayız.

adb -  $ sudo apt-get install android-tools-adb
Frida - $ pip3 install frida-tools
Frida Server - https://github.com/frida/frida/releases adresinden mobil cihazın mimarisine uygun  sürüm
Rootlu bir android cihaz ya da genymotion. Bu uygulamada Android 8.0 sürümü API 26 kullanılmıştır.

Öncelikli olarak hem cihaz hem de burpsuite tarafında proxy ayarlarını yapmamız gerekli. Burpsuite üzerinde Proxy  sekmesi altında Options menüsünden Add diyerek yeni bir Proxy Listener ayarlıyoruz. Belirlenen port üzerinde istenen interface dinlenebilir. Örnekte All Interface olarak seçilmiştir.

Ardından mobil cihaz üzerinde Wifi ayarlarında bağlı olduğumuz wifi ağına basılı tutarak Gelişmiş Ayarlar diyerek Proxy ekliyoruz. Burada Burpsuite programını çalıştırdığımız makine IP adresini ve listener ayarlarında belirlediğimiz portu giriyoruz.

Proxy ayarlarını gerçekleştirdikten sonra tarayıcıda url kısmına burp yazıp isteği gerçekleştirerek CA Certificate butonundan burp sertifikasını indiriyoruz. Burada önemli husus sertifikanın isimlendirilmesi aşamasında uzantısının “ .cer “ formatında olmasıdır.

Artık mobil cihaz üzerinde gerçekleştirdiğimiz  istekler burpsuite üzerinden geçecektir. Fakat burada örnek olarak kullanacağımız Twitter uygulamasında bulunan SSL Pinning’den dolayı, Burpsuite ile araya girmeye çalıştığımızda örnekte verildiği gibi hata mesajları almış olacağız.

Bunun önüne geçmek, bypass işlemini gerçekleştirmek için kullanacağımız Frida aracının mobil cihaza uygun frida-server versiyonunu adb ile cihazın içine atıyoruz.
Bunun için “ $ adb connect 192.168.101.101:5555 “ komutu ile mobil cihaza Android Debug Bridge ile bağlanıyoruz. Ardından “ adb push frida-server-12.9.2-android-x86 /data/local/tmp “ komutu ile kopyalama işlemini gerçekleştiriyoruz.

Ardından “ $ adb shell “ komutu ile mobil cihazın shell ekranına geçerek “ $ chmod 755 frida-server-12.9.2-android-x86 “ komutu ile gerekli izinleri sağlıyoruz ve son olarak frida server’ı çalıştırıyoruz.

Frida Server’ın çalışabilirliğini kontrol etmek için makinemiz üzerinden “frida-ps –U” komutunu çalıştırarak mobil cihaz üzerinde çalışmakta olan işlemleri listeliyoruz.

Frida’nın çalışabilirliğini sağladıktan sonra Burpsuite aracından SSL Pinning için kullanacağımız Custom Sertifikayı indireceğiz. Burpsuite üzerinde Proxy menüsü altında bulunan Options menüsünde “ Import / export CA Certificate “ seçeneği ile sertifikayı export edebiliriz.

Buradaki önemli husus, sertifika isminin “ cert-der.crt “ olarak ya da kullanılacak ssl pinning bypass scriptinde belirlenmiş sertifika ismi ile aynı olarak tanımlanmasıdır. Aksi halde frida çalıştırılırken hata alınabilir. Sertifikayı export ettikten sonra “ $ adb push cert-dert.crt /data/local/tmp “ komutu ile frida server’ın bulunduğu dizine sertifikayı kopyalıyoruz.

Kullanılacak olan ssl pinning scripti Frida’nın resmi sitesi üzerinde verilmiş olan komut ile uzaktan çalıştırılabilir ya da scripti “.js” formatında kaydedip kullanabilirsiniz. Buradan(https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/) ulaşabilirsiniz.
Bypass işlemini gerçekleştirmek için aşağıdaki örnek komutu kullanarak hedef uygulamayı bypass ediyoruz.

/// $ frida -U -f <your_application_package_name> -l <path_to_fridascript.js_on_your_computer> --no-paus

Uygulama olarak bypass edilmiş Twitter otomatik olarak açılacaktır. Deneme için Login ekranında gerekli girdileri yaparak, burpsuite üzerinde “Intercept On”  durumundayken “Log In”  butonuna bastığımızda isteği yakaladığını göreceğiz.

Böylelikle ssl pinning bypass işlemini başarıyla gerçekleştirmiş olduk. Bundan sonra uygulama içerisinde yapılan isteklerin herbiri proxy üzerinden geçecek ve “ HTTP History “ sekmesinden görüntülenebilecektir.

Göreceğiz ki Frida bazı uygulamalar için SSL Pinning Bypass işleminde başarısız olacaktır. Örnek olarak Facebook uygulamasında bu yöntemin çalışmamasından dolayı bir diğer yöntem olan reverse engineering ile ssl pinning bypass edilebilir.

Facebook SSL Pinning Bypass

İşlemlere başlamadan önce önemli bir not olarak, Facebook’un TLSv1.3 kullanmasından dolayı java11 versiyonunu kullanmamız ve TLSv1.3 ile uyumlu bir burpsuite versiyonu kullanmamız gerekmektedir. Bu örnekte java 11 ile birlikte Burpsuite v1.7.36  kullanılmıştır ve Facebook 270.1.0.66.127 sürümü üzerinde çalışma yapılmıştır.

İlk olarak apk dosyası cihaz üzerinde kurulduktan sonra uygulama en az bir defa çalıştırılmalıdır. Aksi takdir de gerekli paketler görüntülenemeyecektir çünkü paketler uygulamanın çalıştırılmasıyla açılmaktadır. Uygulama çalıştırıldıktan ve paketlerin görüntülenebilir olduğundan emin olduktan sonra adb ile ssl pinning işlemi için ilgili binary dosyasını makinemize kopyalıyoruz.

$ adb pull /data/data/com.facebook.katana/lib-xzs/libcoldstart.so

Ardından binary dosyasını IDA Pro aracıyla açıyoruz ve binary tam olarak yüklendikten sonra Search kısmından Text search diyerek SSL Pinning için kullanılan fonksiyon ismi olan “aOpensslCertVer” stringini aratıyoruz.

Aramayı gerçekleştirdiğimizde bizi ilgili string değerinin bulunduğu kod satırına götürecektir. Ve bu fonksiyonun SSL doğrulama hata fonksiyonu olduğunu göreceğiz.

Sağ Tık + Graph View ile grafik görünümüne geçerek ilgili fonksiyonu çağıran fonkisyonları takip ederek if-else sorgusunun tam olarak yapıldığı yere gidiyoruz.

Buradaki mantık, “jnz” yani if-else kısmını tam tersine çevirerek belirtilen ssl doğrulama hata fonksiyonuna gidilmesinin engellenmesi şeklindedir. Yani “jnz” kısmını “jz” olarak değiştirdiğimizde hedeflediğimiz gibi hata fonksiyonuna gidilmesinin önüne geçilecektir. Sağ Tık+ Text View ile text görünümüne geçerek “jnz” highlighted durumdayken Hex görünümüne baktığımızda ilgili hex değerlerini görmüş olacağız. “0F 85 A8 02 00 00” değerini Sağ Tık + Edit ile “0F 84 A8 02 00 00” olarak düzenliyoruz ve Sağ Tık+ Apply Changes diyerek kaydediyoruz.

Bu kısmı değiştirdikten sonra “jnz” kısmının “jz” olarak değiştiğini göreceğiz.

Böylelikle hangi kısımı değiştireceğimizi görmüş olduk. Hex görünümünde “jnz” için denk gelen offset değeri yani “00AE39A0” değerini kopyalıyoruz ve binary dosyasını bir Hex editör ile açıyoruz. Bu uygulamada HxD uygulaması kullanılmıştır. “00AE39A0” offset değerine giderek hedeflediğimiz hex değerini değiştiriyoruz ve kaydediyoruz.

Ardından düzenlenmiş “libcoldstart.so” dosyasını facebook paketleri içerisine geri kopyalıyoruz. Ve root olarak dosyanın izinlerinin sağlandığından emin oluyoruz.

$ adb push libcoldstart.so /data/data/com.facebook.katana/lib-xzs/
$ adb shell
$ su
$ chmod 777 /data/data/com.facebook.katana/lib-xzs/libcoldstart.so

Burpsuite dinleme halindeyken uygulamayı çalıştırdığımızda isteklerin HTTP History kısmına düştüğünü göreceğiz. Böylelikle Facebook uygulaması için SSL Pinning Bypass işlemini başarıyla gerçekleştirmiş olduk. Patched binary dosyasına ve apk’ya buradan ulaşabilirsiniz.

Related Posts

Facebook Comments