Osman Eren tarafından yazılmıştı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.
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.
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:
Biz bu yazımızda Frida Toolunu Kullanarak SSL Piningi nasıl bypasslayabileceğimize değineceğiz.
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.
Root yetkilerine sahip bir Android Emülatör:
HTTP Trafiğini Yakayalayabilmemiz için Bir Proxy Aracı:
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…
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
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
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 kullanarak SSL Pining’i bypassladık.Artık Burp Suite ile request trafiğini yakalayarak testlerimizi yapabiliriz.
[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
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
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
Özet:
Frida kullanarak SSL Pining’i bypassladık.Artık Burp Suite ile request trafiğini yakalayarak testlerimizi yapabiliriz.
Moderatör tarafında düzenlendi: