Merhaba TürkHackTeam Üyeleri.
Bu Konumda Sizlere Android Bir Cihazda SSL Pinning ByPass'ın Nasıl Yapılabileceğini Göstereceğim.





Konu İçeriği

SSL Pinning ByPass Nedir?

Frida Aracı Kullanılarak SSL Pinning ByPass Nasıl Yapılır?






SSL Pinning ByPass Nedir?

SSL(Secure Socket Layer), kısaca sunucu ile kulanıcı arasında dönen verileri şifreleyerek sunucu ile kullanıcı arasına giren bir saldırganın verileri okumasını engelleyen bir sertifikadır. Örnek olarak herhangibir sisteme girdiğiniz kredi kartı bilgileri, kullanıcı giriş bilgileri, kişisel bilgiler gibi veriler sunucuya herhangibir şifrelemeye tabir tutulmadan çıplak bir şekilde iletilir. Siz ile sunucu arasına giren bir saldırgan sizin sunucuya ilettiğiniz bu bilgileri okuyabilir. Bu duruma önlem olarak da SSL sertifikaları devreye girmiştir. SSL sayesinde sizin girmiş olduğunuz bütün veriler bir şifrelemeye tabi tutulur bu sayede veriler sunucuya şifreli bir şekilde iletilir. Sizinle sunucu arasına bir saldırgan girip verileri okusa bile veriler şifreli olduğu için herhangibir sonuç elde edemeyecektir.
SSL Pinning ise uygulamaların androidin kendi sertifikalarına güvenmesi yerine kendi oluşturduğu veya başka bir sertifikaya güvenmesidir.
Frida aracı ise bizim belirlediğimiz bir javascript dosyasını Windows, macOS, GNU / Linux, iOS, Android gibi platformlardaki herhangibir uygulamaya enjekte etmemizi sağlayacaktır.







Frida Aracı Kullanılarak SSL Pinning ByPass Nasıl Yapılır?

» Öncelikle denememizi yapabilmemiz için bize bir adet rootlu android cihaz veya Genymotion, LdPlayer vb bir android emulatörüne ihtiyacımız olacak. Ben bu işlem için LdPlayer android emulatörünü kullanacağım.



» Bu işlemleri yaptığınız bilgisayarınızda Python'un kurulu olması gerekiyor. İşletim sisteminize uygun pythonu buradan indirebilirsiniz. Pythonu kurduktan sonra python ile bazı araçları indirmemiz gerekecek. Frida, objection ve frida-tools araçlarını aşağıdaki komutları sırasıyla komut isteminde çalıştırarak kuruyoruz.

Kod:
python -m pip install Frida

Kod:
python -m pip install objection

Kod:
python -m pip install frida-tools



» Şimdi ise işletim sistemize uygun SDK Platform Tools'u indirmemiz gerekiyor. Platform toolsu buraya tıklayarak indirebilirsiniz.



» Bu kurulumları yaptıktan sonra fridascript.js adında bir dosya oluşturuyoruz ve içerisine bu kodları atıyoruz.

Kod:
/*
Android SSL Re-pinning frida script v0.2 030417-pier$ adb push burpca-cert-der.crt /data/local/tmp/cert-der.crt
$ frida -U -f it.app.mobile -l frida-android-repinning.js ? no-pause

UPDATE 20191605: Fixed undeclared var. Thanks to @oleavr and @ehsanpc9999 !
*/setTimeout(function(){
Java.perform(function (){
console.log(??);
console.log(?[.] Cert Pinning Bypass/Re-Pinning?);var CertificateFactory = Java.use(?java.security.cert.CertificateFactory?);
var FileInputStream = Java.use(?java.io.FileInputStream?);
var BufferedInputStream = Java.use(?java.io.BufferedInputStream?);
var X509Certificate = Java.use(?java.security.cert.X509Certificate?);
var KeyStore = Java.use(?java.security.KeyStore?);
var TrustManagerFactory = Java.use(?javax.net.ssl.TrustManagerFactory?);
var SSLContext = Java.use(?javax.net.ssl.SSLContext?);// Load CAs from an InputStream
console.log(?[+] Loading our CA??)
var cf = CertificateFactory.getInstance(?X.509?);

try {
var fileInputStream = FileInputStream.$new(?/data/local/tmp/cert-der.crt?);
}
catch(err) {
console.log(?[o] ? + err);
}

var bufferedInputStream = BufferedInputStream.$new(fileInputStream);
var ca = cf.generateCertificate(bufferedInputStream);
bufferedInputStream.close();var certInfo = Java.cast(ca, X509Certificate);
console.log(?[o] Our CA Info: ? + certInfo.getSubjectDN());// Create a KeyStore containing our trusted CAs
console.log(?[+] Creating a KeyStore for our CA??);
var keyStoreType = KeyStore.getDefaultType();
var keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry(?ca?, ca);

// Create a TrustManager that trusts the CAs in our KeyStore
console.log(?[+] Creating a TrustManager that trusts the CA in our KeyStore??);
var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
var tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
console.log(?[+] Our TrustManager is ready??);console.log(?[+] Hijacking SSLContext methods now??)
console.log(?[-] Waiting for the app to invoke SSLContext.init()??)SSLContext.init.overload(?[Ljavax.net.ssl.KeyManager;?, ?[Ljavax.net.ssl.TrustManager;?, ?java.security.SecureRandom?).implementation = function(a,b,c) {
console.log(?[o] App invoked javax.net.ssl.SSLContext.init??);
SSLContext.init.overload(?[Ljavax.net.ssl.KeyManager;?, ?[Ljavax.net.ssl.TrustManager;?, ?java.security.SecureRandom?).call(this, a, tmf.getTrustManagers(), c);
console.log(?[+] SSLContext initialized with our custom TrustManager!?);
}
});
},0);



» Şimdi sıra geldi cihazımızı adb ye bağlamaya. Bu işlemden önce cihazımızda birkaç değişiklik yapacağız. Cihazın Ayarlar'ına giriyoruz akabinde Geliştirici Ayarları kısmına giriyoruz ve buradan USB Hata Ayıklama seçeneğini aktif ediyoruz.



» Bunuda yaptıktan sonra cihazımızı adb ye bağlayabiliriz. Komut istemini açıyoruz ve buradan az önce yüklediğimiz platform-tools dosyasının içerisine giriyoruz. Akabinde ise aşağıdaki komutu yazarak android cihazımıza bağlanıyoruz.

Kod:
adb connect



» Bağlandığımızdan emin olmak için komut isteminde aşağıdaki komutu çalıştırıyoruz. Bu komutu çalıştırdıktan sonra cihazınız çıkıyorsa bağlanmış demektir.

Kod:
adb devices



» Şimdi ise cihazımıza uygun frida-server dosyasını indirmemiz gerekiyor. Frida-server dosyasını buraya tıklayarak indirebilirsiniz. Cihazınızın hangisine uyumlu olduğunu öğrenmek için aşağıdaki komutu çalıştırabilirsiniz.

Kod:
adb shell getprop ro.product.cpu.abi



Görmüş olduğunuz gibi benim cihazım x86 versiyonu ile uyumlu olduğu için ben frida-server-12.4.7-android-x86.xz dosyasını indireceğim.



» Frida-serverı indirdikten sonra zipten çıkartıyoruz ve çıkarttığımız bu dosyayı android cihazımızın /data/local/tmp yoluna atmamız gerekiyor. Bunun içinde aşağıdaki komutu çalıştırıyoruz.

Kod:
adb push /data/local/tmp



» Akabinde ise bu dosyaya tüm izinleri vermemiz gerek bunun içinde aşağıdaki komutu çalıştırıyoruz.

Kod:
adb shell chmod 777 /data/local/tmp/frida-server



» Şimdi ise aradaki veri trafiğini görebilmek için cihazımıza Burp Suite programını yükleyelim. Burp Suite'i buraya tıklayarak cihazınıza kurabilirsiniz. Burp Suite'i cihazınıza kurduktan sonra android cihazımız ile olan bağlantısını yapabiliriz. Bunun için Burp Suite'den Proxy -> Options yoluna gidiyoruz. Burada bulunan Add butonuna tıklıyoruz ve anroid cihazımızın Ip ve portunu giriyoruz. Ve Ok butonuna tıklıyoruz.



» Sonrasında ise eklenen ip nin yanındaki Running tikinin işaretli olduğundan emin olarak Import/Export CA Certificate butonuna tıklıyoruz



» Sonrasında ise Certificate in DER Format seçeneğini işaretleyip Next butonuna tıklıyoruz.



» Buradan sertifikayı kaydetmek istediğimiz yeri seçip ismini cacert.der koyuyoruz ve Next butonuna tıklıyoruz.



» Şimdi ise fridascript.js dosyamızı ve cacert.der dosyamızı /data/local/tmp klasörüne atalım. Bunun için aşağıdaki komutları sırasıyla çalıştırıyoruz.

Kod:
adb push /data/local/tmp/cert-der.crt

Kod:
adb push /data/local/tmp/fridascript.js



» Akabinde ise frida-serverı çalıştırmamız gerekecek. Bunun için aşağıdaki kodu komut istemine yazıyoruz.

Kod:
adb shell /data/local/tmp/frida-server &



» Komut istemi herhangibir yanıt döndürmeyecektir. Şuanda frida-serverımız cihazda çalışıyor. Bu komut istemini kapatmadan yeni bir komut istemi açıyoruz ve cihazda çalışan uygulamaları listelemek için şu komutu yazıyoruz.

Kod:
frida-ps -U



» Karşımıza o anda cihazda çalışan uygulamaların listesi geliyor. Buradan hangi uygulamaya SSL Pinning işlemi yapacağımıza karar veriyoruz. Ben twitter uygulaması için yağacağım. Karar verdikten sonra aşağıdaki kodu çalıştırıyoruz ve SSL Pinning işlemi o uygulama için başlamış oluyor.

Kod:
frida -U -f -l --no-paus



» Ve görmüş olduğunu gibi SSL Pinning işlemi uygulamamızda başarılı oldu. Şimdi Burp Suite ile gelen giden verileri şifrelenmemiş bir şekilde görebiliriz.









Okuduğunuz İçin Teşekkür Ederim.
Esenlikle Kalın..

Saygılarımla:Smiley1021: