SSL Unpinning (bypass) Yöntemleri

Android 1.0 ın çıktığın 2007 yılından beri Android’in ve mobil köprünü altından çok sular aktı geçti.Bugün bir çok uygulama Certificate authoriy (CA) kontrolü yapıyor. Biz pentesterlar ise man-in-the-middle (MITM) ile bu trafiği kesmek ve izlemek istiyoruz.

Bu yazımda sizinle Android’de SSL sertifikasını bypass etmenin 4 farklı yolunu paylaşacağım, bunlar;

•Güvenilen Sertifika deposuna özel bir CA sertifikası ekleme
•Uygulamada var olan CA sertifikasını değiştirme
•Frida ile SSL sertifika kontrolünü bypass etmek
•Özel sertifika doğrulama kodunu reverse etmek.

Basitten zor olan yönteme doğru gidelim.

Aradaki trafiği incelemek için Burpsuite yada Charles gibi proxy yazılımlarını kullanabiliriz. Self signed sertiikalar bu proxy yazılımları tarafından otomatik olarak oluşturulur. Eğer sertifika güvenilir değilse mobil uygulama tarafından işleme sona verilir.

Aşağıdaki tekniklerle esas amacımız mobil uygulamayı proxy yazılımımızın ürettiği sertifikaya güvendirtmektir.

Teknik 1
Güvenilen Sertifika deposuna özel bir CA sertifikası ekleme

Daha önce telefonnun browserindan gidern istekleri izlemek için basit bir CA sertifikasını telefonunuza kurduysanız zaten bu yöntemin bir kısmını biliyorsunuz demektir.

Android 2 tip sertifika deposuna sahiptir biri kendi işletim sisteminin güvendiği sertifika deposu (Zeten yüklü olan) bir de kullanıcının sertifika deposu.

developer.android.com:

By default, secure connections (using protocols like TLS and HTTPS) from all apps trust the pre-installed system CAs, and apps targeting Android 6.0 (API level 23) and lower also trust the user-added CA store by default. An app can customize its own connections using base-config (for app-wide customization) or domain-config (for per-domain customization).

Yukarıda da belirtildiği gibi Android 6.0 dan öncesinde kullanıcı sertifika deposuna sertifika eklediğinizde varsayılan olarak uygulama sizin sertifikanıza güveniyordu fakat 6.0 dan sonra uygulamalar kullanıcının eklediği sertifikalara güvenmemeye başladı.Ama biz bu yöntemde uygulamaların manifest dosyasını düzenleyip 6.0 a zorlayacağız. Hedeflenen API uygulamaların AndroidManifest.xml dosyasında platformBuildVersionCode özelliğinde yazılıdır.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test.app" platformBuildVersionCode="25" platformBuildVersionName="7.1.1">

Yukarıda hedeflenen apinin 25 olduğunu görüyoruz bunu 23 olarak değiştirmemiz gerekiyor.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test.app" platformBuildVersionCode="23" platformBuildVersionName="6.0">

Uygulamayı recompile ettiğimizde eklediğimiz CA sertfikasına güvenecektir.

Eğer uygulamanın API versiyonunu değiştiremiyorsanız altarnatif olarak spesifik olarak “/res/xml/network_security_config.xml”

<?xml version="1.0" encoding="utf-8"?> 
<network-security-config> 
<base-config> 
<trust-anchors> 
<certificates src="@raw/my_ca"/> 
</trust-anchors> 
</base-config> 
</network-security-config>

Buradan kendi CA sertifikamızı ekleyerek ona güvenmesini sağlayabiliriz.(CA sertifikaları res/raw klasöründe tutulmalıdır kaynak)

Teknik 2
Uygulamada var olan CA sertifikasını değiştirme

İlk tekniği kullanarak api versiyonunu değiştirmeyi denediniz fakat hale SSL hatası alıyorsunuz bu mümkün çünkü geliştiriciler bunu önlemek için ek önlemler alabilirler. İlk yöntemde hatırlayacağınız üzere bir CA sertifikası tanımladık.Bu geliştiriciler tarafından da kullanılabilir. Eğer uygulamanın içerisinde herhangi bir CA sertifiaksı görüyorsanız bunu değiştirmeniz aradaki trafiği izlemek için yeterli olacaktır.

Proxy yazılımınızın oluşturduğu sertifika uzantısı eğer değiştiriceğiniz sertifikanın tipi base64 tipindeyse her iki sertifika da
—–BEGIN CERTIFICATE—– ile başlayıp
—–END CERTIFICATE—– ile biten bir düzene sahipse dosyaların direk içeriğini değiştirebilirsiniz.

İşlemi gerçekleştirip recompile ettikten sonra proxy yazılımınızı aktif etmeni unutmayın aksi taktirde yine SSL hatası alabilirsiniz.

Teknik 3
Frida ile SSL sertifika kontrolünü bypass etmek

Kendi CA sertifikanızı yüklemek SSL trafiğini kesmek için yeterli değilse uygulama bir tür SSL Pinning veya SSL onaylama mekanizması kullanıyor demektir. Basit olarak bu tip mekanizmaları bypass etmek için uygulamanın koduna ve onaylama işleminin kendisine bakmalıyız. Bu yöntemde rootlu bir telefona ihtiyacımız olacaktır fakat Frida Gadget ile tüm Frida fonksiyonlarını cihazımızı rootlamadan erişmek mümkün.Frida uygulamanın kodlarını  gerçek zamanlı olarak kurcalamanızı sağlayan bir araçtır. Frida işletim sistemi üzerinde çalışan bir uygulmadır fakat root yetkisi gerektirir bundan kaçınmak için uygulamaya Frida Gadget i injekte edebiliriz. Frida Gadget Fridanın bir çok özelliğini içerir. Uygulamayla birlikte fridayı kullanmanızı sağlayan kütüphane de böylece yüklenecektir.

(Zaten root sahibi bir telefona sahipseniz Frida Gadget’e ihtiyacınız olamayacaktır)

Frida Gadgeti yüklemek için apk yı decompile kütüphaneyi ekleyip smali kodunda birkaç değişiklik yapmamız gerekir. Böylece uygulama başlangıcından kütüphanemiz devreye girecektir. (Frida Gadget için için Detaylı anlatım)

Bunu bu yöntemle bir kez yapmaya değer fakat zaman kazanmak için kullanabileceğimiz bir araç var (Objection) Bu yazılım tüm süreci otomatize eder ve sadece komut satırında hedef apk yı vermeniz gerekir.

objection patchapk -s test_app.apk

Sonrasında işlem başarılı olursa test_app.objection.apk isminde bir apk gelecektir çalışma dizinimize uygulamamızı artık adb yardımıyla yada manuel olarak kurabiliriz.Uygulama açıldığında otomatik olarak duracaktır. Artık Frida server’a bağlanmalıyız

# frida-ps -U

PID  Name
----  ------
6383  Gadget

# frida -U gadget

# objection explore

Burada fridanın dahili SSL pinning bypass fonksiyonundan yararlanabilirsiniz.

 

# android sslpinning disable
Job: xxx - Starting
[xxx] [android-ssl-pinning-bypass] Custom, Empty TrustManager ready
Job: xxx – Started

Teknik 4
Özel sertifika doğrulama kodunu reverse etmek

Son olarak geliştiriciler bir sistem kütüphanesine güvenmek yerine kendi SSL kütüphanelerini geliştirmiş olabilirler bu durumda APK yı decompile edip smali ye ve java koduna çevirip bakmak zorundayız.
Bunun için dex2jar kullanıp sonrasına oluşan .jar dosyasını incememek için JD-GUI gibi bir araç kullanabiliriz

Önce sertifikayı doğrulayan kodu bulmalıyız sonrasında kodu komple atlatmayı yada frida ile bu fonksiyonu etkisiz kılmayı seçebilirsiniz.

Tüm uygulamayı recompile etmektense frida kullanmak ve ssl fonksiyonuyla oynamak daha etkili bir yol olmaktadır.

3.teknikte olduğu gibi frida ile bağlandıktan sonra uygulamayı instrument edebilirsiniz. Burdan sonra fridanın komut satırından yada Objection arayüzünden (Hangisini daha kolay buluyorsanız) birini kullanarak fonksiyonu etkisiz kılmanız gerekiyor.