Tutorial : Bypass SSL Pinning with Frida.js [Nox Player + Burp suite]

Anggi Gunawan
4 min readSep 8, 2020

Halo teman teman semua, kali ini saya ingin membagi tutorial belajar android penetration testing dengan cara bypass SSL Pinning with Frida.js, sebenar nya sudah banyak artikel yang membahas/membagi tutorial yang sama seperti ini namun kebanyakan berbahasa inggris, dan disini saya akan coba membuatnya dengan bahasa indonesia dan mudah dipahami.

Apa itu SSL/Cert Pinning?

SSL/Cert Pinning sederhananya ialah suatu cara agar sebuah aplikasi bisa memastikan bahwa koneksi SSL/TLS dilakukan terhadap server yang seharusnya.

Apa itu Frida?

di website resminya frida adalah “Dynamic instrumentation toolkit for developers, reverse-engineers, and security researchers.” dengan kata lain temen-temen bisa menggunakan frida script untuk menyuntikkan sebuah kode-kode JavaScript kedalam sebuah aplikasi.

Tools yang harus di siapkan :

  • Python 2.7
  • Pip for Python
  • ADB Tools ( Android Debug Bridge Tools)
  • Burp Suite
  • Nox Player

Disini saya asumsikan teman teman sudah mendownload semua tools diatas.

1. Buka Burp Suite klik table Intercept > Options isi seperti gambar di bawah

2. Jalankan Nox Player yang sudah di download tadi buka settings > wifi > modify network

  • isi Proxy Hostname dengan IP sesuai pc kalian (kalo window buka cmd ketik ipconfig pilih ipv4)
  • Proxy Port isi 8082
  • Bypass Proxy biarkan kosong
  • IP Settings ubah ke DHCP

3. jalankan burp suite > buka browser nox player > akses http://burp > download cert >install cert yang di download tadi (pastikan format nya .crt bila bukan .crt teman teman bisa ganti extensi nya)

4. buka cmd > buka dir adb tools yang telah di download tadi > ketikan di cmd seperti ini

adb connect 127.0.0.1:62001

tujuan nya untuk menghubungkan burp suite dengan nox player, dan pastikan device nya sudah terhubung cek dengan command

adb devices

pastikan ip 127.0.0.1:62001 sudah terhubung.

5. install frida server bisa teman teman download disini https://github.com/frida/frida/releases , namun kita cek dulu versi berapa frida server yang kita butuhkan dengan ketik command

adb shell getprop ro.product.cpu.abi

kebetulan di saya menggunakan x64

6. bila semua sudah di download selanjutnya kita extrak file nya dan langsung kita push dengan command :

adb push C:/[dir frida-server]/frida-server-12.11.9-android-x86 /data/local/tmp

dan sekarang kita rubah permission nya dan jalan kan frida server nya dengan command

adb shell chmod 777 /data/local/tmp/frida-server-12.11.9-android-x86

adb shell

cd /data/local/tmp/

./frida-server-12.11.9-android-x86 &

7. bila frida-server nya sudah berjalan buka new cmd ingat cmd yang 1 nya jangan di close

lalu kita ketikan command untuk cek aplikasi apasaja yang berjalan di android kita dengan command

frida-ps -U

nantinya akan keluar tuh aplikasi apasaja yang sedang berjalan, disini misalkan kita lagi buka aplikasi gojek dengan nama com.gojek.app

8. selanjutnya kita coba mulai bypass ssl pinning nya dengan frida.js dibawah ini

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);

save dulu dan simpan dengan ext bypass.js, lalu kita jalankan dengan command

frida -U -f org.gojek.app -l C:\[lokasi file bypass.js]/bypass.js — no-pause

tunggu sampai proses bypass selesai

9. bila proses bypass ssl pinning nya selesai kita tinggal langsung intercept data nya menggunakan burp suite yang sudah di konekan tadi,

Penutupan

Oke mungkin itu saja yang bisa saya bagikan semoga bermanfaat dan bila ada pertanyaan atau ada salah dalam penulisan bisa langsung hubungi saya di

Linkedin : https://www.linkedin.com/in/anggi-gunawan17/

Website : https://kitabantu.co.id

--

--