Pentest

[TR] “Frida” Kullanarak SSL Pinning Atlamak

Reklam

[TR] “Frida” Kullanarak SSL Pinning Atlamak

SSL Nedir?

SSL Nedir? Kısaca: SSL’in açılımı Secure Socket Layer’dır. Türkçe anlamıysa Güvenli Giriş Katmanı’dır.

SSL internet ortamında çok karşılaşılan kavramlardan biridir. Genellikle alışveriş sitelerinde oldukça sık rastlanmaktadır. SSL kişisel gizlilik ve güvenilirlik sağlayan, network üzerindeki bilgi transferi sırasında bilginin bütünlüğü ve gizliliği (data protection) için sunucu ile istemci arasındaki iletişimin şifrelenmiş şekilde yapılabilmesine imkan veren bu sayede gizliliğinin ve bütünlüğün korunmasını sağlayan Netscape tarafından geliştirilmiş bir güvenlik protokolüdür diye tanımlayabiliriz.

SSL Pining Nedir?

Certificate Pinning olarakda adlandırabileceğimiz SSL Pinning, esasında bir güvenlik önlemi sistemidir. SSL tokalaşması ardından olası güvenlik tehtidlerine, örneğin ortadaki adam saldırısı gibi bir çok risk faktörüne karşı sunucu sertifikalarını tekrar tekrar doğrulayan bir siber güvenlik tekniğidir.

Güvenlik Testleri Yaparken Neden SSL Piningi Bypasslamamız Gerekir?

Android uygulamalarının web servisi çağrılarını izlemek veya fuzzing türü işlemler yapabilmek için Burp Suite yada benzeri bir proxy tool ile işlem çağrılarını yakalamak gereklidir. Buraya kadar herşey istediğimiz gibi ancak bu hacking method işlevsilliğini SSL Pinning karşısında yitiriyor. Bu durumda ise SSL Pinning Bypass dediğimiz ikincil yönteme başvurmamız gerekiyor.

SSL Piningi bypasslamak için birçok yöntem vardır. Bunlardan bazıları şunlardır:

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

Biz bu yazımızda Frida Toolunu Kullanarak SSL Piningi nasıl bypasslayabileceğimize değineceğiz.

Frida Nedir? Neden Fridaya İhtiyaç Duyarız:

Frida uygulamalardaki fonksiyonları hook’layıp manipüle etmemizi sağlayan bir tooldur. Frida fonksiyona parametre olarak gönderilen ve fonksiyondan döndürülen değerleri okumamıza hatta etkisiz hale getirmemize olanak sağlar.

Gerekli Programlar:

Root yetkilerine sahip bir Android Emülatör:

  • Genymotion
  • Android Studio

HTTP Trafiğini Yakayalayabilmemiz için Bir Proxy Aracı:

  • Burp Suite
  • Owasp ZAP

Android Debug Bridge (adb):

Android Debug Bridge (adb), bir cihazla iletişim kurmanızı sağlayan çok yönlü bir komut satırı aracıdır. Adb komutu, uygulamaları yükleme ve hata ayıklama gibi çeşitli cihaz eylemlerini kolaylaştırır ve bir cihazda çeşitli komutları çalıştırmak için kullanabileceğiniz bir UNIX kabuğuna erişim sağlar.

Haydi Başlayalım…

Frida Kullanarak SSL Pining Bypass:

Cihazın Unix kabuğuna erişmemiz ve cihaza bağlanarak dosya transferi yapmamız için öncelikle şu komutu terminale yazarak adbyi bilgisayarımıza yükleyelim:

 sudo pacman -Syyu && sudo pacman -S android-tools       // Arch Linux 
 sudo apt-get update && sudo apt-get install android-sdk // Ubuntu Linux

Fridayı kullanmak için frida paketlerini bilgisayarımıza yüklememiz gerekir bu komutları terminale yazarak paketleri bilgisayarımıza yükleyelim:

 pip install Frida
 pip install objection
 pip install frida-tools

SSL Piningi bypass’lamamız için yazılmış şu frida modülünü bilgisayarımıza fridascript.js olarak kaydedelim:

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

Şu komutu terminalimize yazarak Android Emulatorumuzun sistem mimari tipini ögrenelelim ve Frida Server adresinden sistemimize uygun Frida Server dosyasını indirelim:

 adb shell getprop ro.product.cpu.abi

İndirdiğimiz frida server dosyasını zipli dosyadan çıkartalım ismini frida-server olarak kısaltalım ve Android Emulatorumuzun /data/local/tmp dizinine aktaralım.

adb push <frida-serverin dizini> /data/local/tmp/

Örneğin: 
adb push /home/obsesif/frida-server /data/local/tmp

Frida-server dosyasına tüm kullanıcıların ilgili dosya üzerinde okuma, yazma ve çalıştırma yetkilerinin olmasını için chmod 777 izni verelim:

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

Android Emulatorümüzün WI-FI ayarları kısmından proxymizin dinlediği Host ve Portu yazarak proxy konfigirasyonunu tamamlayalım:

android_proxy_settings
android_proxy_settings

Burp Suitede Proxy -> Options -> Import / export CA certificate butonuna tıklayarak karşınıza çıkan yerde Export kısmından Certificate in Der format’ı seçip kaydedelim:

burp_suite_cer
burp_suite_cer

cacert.der ve fridascript.js dosyalarını adb yardımıyla ile cihaza aktaralım:

adb push cacert.der /data/local/tmp/cert-der.crt
adb push fridascript.js /data/local/tmp/fridascript.js

Cihazımıza yüklediğimiz frida-serveri çalıştıralım ve cihazda bulunan servisleri listeleyelim:

adb shell /data/local/tmp/frida-server &
frida-ps -U

Listeledeğimiz servislerden istediğimizi seçelim ve şu komudu çalıştıralım:

frida -U -f com.ornek_uygulama.android -l /home/obsesif/fridascript.js --no-paus
frida_pinned
frida_pinned

Özet:

Frida kullanarak SSL Pining’i bypassladık.Artık Burp Suite ile request trafiğini yakalayarak testlerimizi yapabiliriz.

Reklam
Reklam

İlgili Makaleler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu