Notice
Recent Posts
Recent Comments
반응형
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
05-21 13:13
Today
Total
관리 메뉴

해킹공주의 일상

Frida를 활용한 SSL Pinning 우회(안드로이드) 본문

모의해킹/MOBILE

Frida를 활용한 SSL Pinning 우회(안드로이드)

7.3.7 2023. 2. 25. 01:49
반응형

개요

안드로이드 7 이상부터 ssl pinning 이 OS에 기본적으로 적용되어있기 때문에 이를 우회해야만 패킷 캡처가 가능하다. 본문에서는 프리다를 활용하여 패킷캡처를 수행하는 방법에 대해 작성하고자 한다.

 

프리다를 사용하려면 루팅이 되어있는 단말기여야하는데, 단말기에서 루팅탐지를 수행하고 있다면 루팅탐지를 우회하는 코드 또한 추가로 작성해줘야한다. 결국 ssl pinning 우회를 하려면 루팅우회를 필수적으로 해야한다는 말이 된다,, 

 

READY

- Frida 설치된 안드로이드

- 대상 앱에서 루팅을 탐지한다면, 루팅탐지 코드도 필요.

- burpsuite

- frida ssl pinning 코드 1

https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/

 

Frida CodeShare

 

codeshare.frida.re

더보기

/* 
   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

   https://techblog.mediaservice.net/2017/07/universal-android-ssl-pinning-bypass-with-frida/
   
   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);

- frida ssl pinning 코드 2 (1번이 안되면 2번 수행)

https://omespino.com/tutorial-universal-android-ssl-pinning-in-10-minutes-with-frida/

 

TUTORIAL – UNIVERSAL ANDROID SSL PINNING IN 10 MINUTES WITH FRIDA – @omespino

Introduction: Hi everyone It’s been a while since my last post but I’m back, now I want to show you that you can start hacking android apps with frida without pain, I took me several hours to figure out how to get the frida installation ready but at th

omespino.com

Java.perform(function() {

    var array_list = Java.use("java.util.ArrayList");
    var ApiClient = Java.use('com.android.org.conscrypt.TrustManagerImpl');

    ApiClient.checkTrustedRecursive.implementation = function(a1, a2, a3, a4, a5, a6) {
        // console.log('Bypassing SSL Pinning');
        var k = array_list.$new();
        return k;
    }

}, 0);

 

START

1) 환경 세팅

burpsuite와 프록시를 켜고 프록시 환경 세팅을 해준다.(단말기에도 프록시 환경 설정 필요)

 

2) Burp 인증서 준비

1 단말기에서 http://burp 접속 후 인증서 다운로드(cacert.der)

2 adb shell 접근 후, 다운로드된 cacert.der 인증서를 /data/local/tmp에 cert-der.crt 로 이동해준다.

(혹은 adb pull로 인증서 뽑아서 adb push로 넣어줘도됨)

 

3) 대상 패키지 명 확인

frida-ps -U

 

4) 프리다 코드 작성

나는 우회할 대상 앱이 루팅탐지를 수행하고 있어서 루팅탐지코드와 ssl pinning 코드를 함께 적어주었따. 

그런거 없으면 그냥 저거만 복붙해서 넣자.

 

5) 코드 실행

3) 에서 확인한 패키지 명을 바탕으로 후킹을 진행한다.

frida -U -f [패키지명] -l frida-ssl-and.js --no-pause   //패키지명을 통한 후킹

 

요즘 나온 frida 에서는 --no-pause 명령어를 지원하지 않는것같아서 지우고 실행시켜주었다.

 

 

4) 패킷 확인

Burpsuite 프록시 툴에서 패킷 확인!

 

 

근데 이제 이렇게 해도 안잡히는 애들이 있다.

[-] Waiting for the app to invoke SSLContext.init().. 에서 멈추기 등..

아직 해결방법은 못찾았다 . .. HELP..

반응형
Comments