Mobile Application SSL Pinning Bypass #Part 1

Post a Comment
Hellawww now you see me again, Langsung lah ya pada kesempatan kali ini saya akan memberikan sebuah tutorial bagaimana caranya kalian melakukan SSL Pinning pada aplikasi, Yups mungkin juga udah banyak yang tau, tapi disini saya memberikan cara yang biasa saya pakai untuk melakukan SSL Pinning, Simak aja yups gimana step-by-stepnya dari yang paling simple sampai yang paling mager, Oh iya untuk part 1 ini saya menggunakan Injection Script dari frida hal-hal yang kalian butuh disini adalah: 
Emulator ataupun Device
Android Debug Brige (ADB) 
Frida Script & Server 
Certificate & Burpsuite 

Step pertama jika disini kalian sudah memiliki emulator dan devices, Untuk catatan disini emulator ataupun device kalian harus root, kalian bisa langsung menggunakan ADB untuk melakukan connection kedalam emulator ataupun devices

Lalu step kedua yang kalian perlu kalian tahu adalah kalian mencari tahu arm versi berapa yang device kalian gunakan, dan yang saya gunakan disini adalah armv8 atau x86_64. Karena ini untuk menyesuaikan frida yang kalian install dan kalian cukup menggunakan command :
adb shell getprop ro.product.cpu.abi

Jika kalian sudah mengetahui versi kalian, kalian sesuaikan x86 dan x86_64 lalu kalian tinggal mendownload frida-server kalian untuk ditaruh kedalam devices dan kalian bisa mendownload frida-server disini

Setelah kalian mendownload kalian tinggal extract dan pindahkan saja menggunakan adb, kalian bisa command :
adb push namefile-server /data/local/tmp
adb shell chmod 777 /data/local/tmp/namefile-server

Nb: Change namefile with ur namefile
Lalu kalian install frida di laptop kalian ataupun di pc whatever, kalian bisa menggunakan command:
python -m pip install frida
python -m pip install objection
python -m pip install frida-tools
== OR ==
pip install frida
pip install objection
pip install frida-tools

Setelah kalian bisa melakukan hal diatas kalian bisa menginstall certificate Burpsuite terlebih dahulu di emulator, Caranya kalian buka burpsuite kalian lalu kalian pilih tab Proxy > Options > Import / Export CA Certificate dan kalian simpan dengan format *.der

Langkah selanjutnya kalian harus menginstall certificate pada emulator, Oh iya pastikan masih melakukan connection adb ya , Kalian bisa menggunakan command:
openssl x509 -inform DER -in cacert.der -out cacert.pem
openssl x509 -inform PEM -subject_hash_old -in cacert.pem |head -1
mv cacert.pem 9a5ba575.0
adb remount
adb push 9a5ba575.0 /sdcard/
adb shell mv /sdcard/9a5ba575.0 /system/etc/security/cacerts/
adb shell chmod 644 /system/etc/security/cacerts/9a5ba575.0
adb reboot

Nb: change name cacert.der with ur filename save before whatever
Lalu kalian running frida-server kalian, kalian bisa menggunakan command:
adb shell /data/local/tmp/namefile-server &

Setelah frida-server dijalankan kalian bisa kalian perlu menjalankan aplikasinya terlebih dahulu lalu kalian mencari tahu PID ataupun process package name yang sedang berjalan pada emulator ataupun devices kalian, Kalian cukup menggunakan command:
frida-ps -Ua


Lalu kalian bisa download Injection Script Frida yang digunakan untuk melakukan injection script pada aplikasi, kalian bisa copy disini ataupun download disini dan simpan dengan format *.js :
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/cacert.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);

Mari kita coba test untuk aplikasi contoh yang saya gunakan disini adalah aplikasi twitter. Oh iya kalian harus membuka aplikasinya terlebih dahulu ya seperti yang dijelaskan diatas, Kalian bisa lihat bahwa dibagian Message bahwa "The client failed to negotiate a TLS connection" yang artinya kita tidak bisa melakukan intercept trafficnya pada proxy burpsuite, dan kita perlu melakukan Bypass dengan SSL Pinning


Setelah kalian tahu process package name yang sedang berjalan langkah selanjutnya adalah kalian harus command untuk menjalankan fridanya, Gimana kak cara commandnya? Gampang aja kalian cukup menggunakan command:
frida -U -f "IdentifierName" -l "filescript.js" --no-pause

Nb: Change IndentifierName and Filescript.js

Jika sudah dijalankan maka akan terlihat info di cmd ataupun terminal kalian bahwa frida sudah success melakukan Bypass SSL Pinning dan jika kalian lihat juga traffic pada aplikasi twitter success mengarah ke Burpsuite. 

Gimana cukup mudah bukan? Oh iya untuk frida-server yang tadi sudah kalian jalankan kalian cukup minimaze karena jika itu diclose oleh kalian maka frida-server kalian akan mati dan kalian melakukan ini seperti awal lagi. Oke mungkin cukup sekian dan tunggu part 2 nya, Jika ada yang belum mengerti bisa komentar ya kak. Semoga bermanfaat and dont forget to share and see you next time byee~

Related Posts

Post a Comment

Subscribe Our Newsletter