Загрузка...

Обходим SSL Pinning на Android

Тема в разделе Статьи создана пользователем leniawar 23 июл 2020. 6013 просмотров

Опрос

Полезная тема ?

  1. да

    9
    69,2%
  2. нет

    4
    30,8%
  1. leniawar
    leniawar Автор темы 23 июл 2020 https://zelenka.guru/threads/5235448/ 4409 3 июл 2018
    [IMG]

    Недавно заинтересовался вопросом как обойти SSL Pinning на Android, Для того чтобы написать проект на кипере и вот нашел решения и хочу поделится


    Для начала нам понадобится Python

    1. Можно здесь Python тык(не реклама)

    2. Ставим галочку на Add Python 3.8 to PATH и дальше на Install Now
    [IMG]

    3. Далее для того, чтобы Python нормально заработал, переходим в Параметры->Приложения и возможности->Псевдонимы выполнения приложения и снимаем тумблеры
    [IMG]

    4. Проверяем что Python установился в cmd этой командой
    Код
    python --version
    [IMG]

    Теперь установим наш эмулятор Memu (не реклама)

    1. Переходим на сайт https://www.memuplay.com/ и качаем свежую версию

    2. Устанавливаем себе в удобную папку эмулятор и не забыв нажать Decline когда нам предложат установить антивирус McAfee
    [IMG]

    3. Запускает Multi-MEmu и в настройках виртуальной машины включаем root
    [IMG]

    [IMG]

    Установка и настройка BURPSuite


    1. Скачиваем с оф сайта BURP Suite или тык версию Community

    2. Переходим в Proxy и Options и нажимаем add
    1. [IMG]

    2. [IMG]

    3. Дальше нажимаем Ok

    4. Запускаем эмулятор

    5. Устанавливаем приложение на котором вы хотите снять сертификат

    6. В эмуляторе переходим Настройки - WiFi - Наша_WiFi_Cеть - Расширенные настройки и добавляем туда наш ****** который мы выбрали выше
    [IMG]

    7. Дальше идем в браузер пишем или
    Код
    http://burpsuite
    или наш ****** который мы выбрали

    [IMG]

    8. После того как скачали идем в файловый
    менеджер и переименовываем с cacert.der на cacert.crt и устанавливаем его
    [IMG]

    Переходим к интересному устанавливаем Frida

    Открываем cmd и пишем туда по очереди

    Код
    1 . pip install frida
    Код
    2 . pip install objection
    Код
    3 . pip install frida-tools


    Дальше нужно скачать adbtools

    1. Качаем на сайте свежую версию adbtool тык и распаковываем в удобную папку, в моем случае это C:\adb
    [IMG]

    2. Сохраняем скрипт под именем fridascript.js в папке adb
    Код

    /* Android ssl certificate pinning bypass script for various methods
    by Maurizio Siddu

    Run with:
    frida -U -f [APP_ID] -l frida_multiple_unpinning.js --no-pause
    */

    setTimeout(function() {
    Java.perform(function () {
    console.log('');
    console.log('======');
    console.log('[#] Android Bypass for various Certificate Pinning methods [#]');
    console.log('======');


    var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
    var SSLContext = Java.use('javax.net.ssl.SSLContext');


    // TrustManager (Android < 7)
    var TrustManager = Java.registerClass({
    // Implement a custom TrustManager
    name: 'dev.asd.test.TrustManager',
    implements: [X509TrustManager],
    methods: {
    checkClientTrusted: function (chain, authType) {},
    checkServerTrusted: function (chain, authType) {},
    getAcceptedIssuers: function () {return []; }
    }
    });

    // Prepare the TrustManager array to pass to SSLContext.init()
    var TrustManagers = [TrustManager.$new()];
    // Get a handle on the init() on the SSLContext class
    var SSLContext_init = SSLContext.init.overload(
    '[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;', 'java.security.SecureRandom');
    try {
    // Override the init method, specifying the custom TrustManager
    SSLContext_init.implementation = function(keyManager, trustManager, secureRandom) {
    console.log('[+] Bypassing Trustmanager (Android < 7) request');
    SSLContext_init.call(this, keyManager, TrustManagers, secureRandom);
    };

    } catch (err) {
    console.log('[-] TrustManager (Android < 7) pinner not found');
    //console.log(err);
    }



    // OkHTTPv3 (double bypass)
    try {
    var okhttp3_Activity = Java.use('okhttp3.CertificatePinner');
    okhttp3_Activity.check.overload('java.lang.String', 'java.util.List').implementation = function (str) {
    console.log('[+] Bypassing OkHTTPv3 {1}: ' + str);
    return true;
    };
    // This method of CertificatePinner.check could be found in some old Android app
    okhttp3_Activity.check.overload('java.lang.String', 'java.security.cert.Certificate').implementation = function (str) {
    console.log('[+] Bypassing OkHTTPv3 {2}: ' + str);
    return true;
    };

    } catch (err) {
    console.log('[-] OkHTTPv3 pinner not found');
    //console.log(err);
    }



    // Trustkit (triple bypass)
    try {
    var trustkit_Activity = Java.use('com.datatheorem.android.trustkit.pinning.OkHostnameVerifier');
    trustkit_Activity.verify.overload('java.lang.String', 'javax.net.ssl.SSLSession').implementation = function (str) {
    console.log('[+] Bypassing Trustkit {1}: ' + str);
    return true;
    };
    trustkit_Activity.verify.overload('java.lang.String', 'java.security.cert.X509Certificate').implementation = function (str) {
    console.log('[+] Bypassing Trustkit {2}: ' + str);
    return true;
    };
    var trustkit_PinningTrustManager = Java.use('com.datatheorem.android.trustkit.pinning.PinningTrustManager');
    trustkit_PinningTrustManager.checkServerTrusted.implementation = function () {
    console.log('[+] Bypassing Trustkit {3}');
    };

    } catch (err) {
    console.log('[-] Trustkit pinner not found');
    //console.log(err);
    }



    // TrustManagerImpl (Android > 7)
    try {
    var TrustManagerImpl = Java.use('com.android.org.conscrypt.TrustManagerImpl');
    TrustManagerImpl.verifyChain.implementation = function (untrustedChain, trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {
    console.log('[+] Bypassing TrustManagerImpl (Android > 7): ' + host);
    return untrustedChain;
    };

    } catch (err) {
    console.log('[-] TrustManagerImpl (Android > 7) pinner not found');
    //console.log(err);
    }



    // Appcelerator Titanium
    try {
    var appcelerator_PinningTrustManager = Java.use('appcelerator.https.PinningTrustManager');
    appcelerator_PinningTrustManager.checkServerTrusted.implementation = function () {
    console.log('[+] Bypassing Appcelerator PinningTrustManager');
    };

    } catch (err) {
    console.log('[-] Appcelerator PinningTrustManager pinner not found');
    //console.log(err);
    }



    // OpenSSLSocketImpl Conscrypt
    try {
    var OpenSSLSocketImpl = Java.use('com.android.org.conscrypt.OpenSSLSocketImpl');
    OpenSSLSocketImpl.verifyCertificateChain.implementation = function (certRefs, JavaObject, authMethod) {
    console.log('[+] Bypassing OpenSSLSocketImpl Conscrypt');
    };

    } catch (err) {
    console.log('[-] OpenSSLSocketImpl Conscrypt pinner not found');
    //console.log(err);
    }


    // OpenSSLEngineSocketImpl Conscrypt
    try {
    var OpenSSLEngineSocketImpl_Activity = Java.use('com.android.org.conscrypt.OpenSSLEngineSocketImpl');
    OpenSSLSocketImpl_Activity.verifyCertificateChain.overload('[Ljava.lang.Long;', 'java.lang.String').implementation = function (str1, str2) {
    console.log('[+] Bypassing OpenSSLEngineSocketImpl Conscrypt: ' + str2);
    };

    } catch (err) {
    console.log('[-] OpenSSLEngineSocketImpl Conscrypt pinner not found');
    //console.log(err);
    }



    // OpenSSLSocketImpl Apache Harmony
    try {
    var OpenSSLSocketImpl_Harmony = Java.use('org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl');
    OpenSSLSocketImpl_Harmony.verifyCertificateChain.implementation = function (asn1DerEncodedCertificateChain, authMethod) {
    console.log('[+] Bypassing OpenSSLSocketImpl Apache Harmony');
    };

    } catch (err) {
    console.log('[-] OpenSSLSocketImpl Apache Harmony pinner not found');
    //console.log(err);
    }



    // PhoneGap sslCertificateChecker (https://github.com/EddyVerbruggen/SSLCertificateChecker-PhoneGap-Plugin)
    try {
    var phonegap_Activity = Java.use('nl.xservices.plugins.sslCertificateChecker');
    phonegap_Activity.execute.overload('java.lang.String', 'org.json.JSONArray', 'org.apache.cordova.CallbackContext').implementation = function (str) {
    console.log('[+] Bypassing PhoneGap sslCertificateChecker: ' + str);
    return true;
    };

    } catch (err) {
    console.log('[-] PhoneGap sslCertificateChecker pinner not found');
    //console.log(err);
    }



    // IBM MobileFirst pinTrustedCertificatePublicKey (double bypass)
    try {
    var WLClient_Activity = Java.use('com.worklight.wlclient.api.WLClient');
    WLClient_Activity.getInstance().pinTrustedCertificatePublicKey.overload('java.lang.String').implementation = function (cert) {
    console.log('[+] Bypassing IBM MobileFirst pinTrustedCertificatePublicKey {1}: ' + cert);
    return;
    };
    WLClient_Activity.getInstance().pinTrustedCertificatePublicKey.overload('[Ljava.lang.String;').implementation = function (cert) {
    console.log('[+] Bypassing IBM MobileFirst pinTrustedCertificatePublicKey {2}: ' + cert);
    return;
    };

    } catch (err) {
    console.log('[-] IBM MobileFirst pinTrustedCertificatePublicKey pinner not found');
    //console.log(err);
    }



    // IBM WorkLight (ancestor of MobileFirst) HostNameVerifierWithCertificatePinning (quadruple bypass)
    try {
    var worklight_Activity = Java.use('com.worklight.wlclient.certificatepinning.HostNameVerifierWithCertificatePinning');
    worklight_Activity.verify.overload('java.lang.String', 'javax.net.ssl.SSLSocket').implementation = function (str) {
    console.log('[+] Bypassing IBM WorkLight HostNameVerifierWithCertificatePinning {1}: ' + str);
    return;
    };
    worklight_Activity.verify.overload('java.lang.String', 'java.security.cert.X509Certificate').implementation = function (str) {
    console.log('[+] Bypassing IBM WorkLight HostNameVerifierWithCertificatePinning {2}: ' + str);
    return;
    };
    worklight_Activity.verify.overload('java.lang.String', '[Ljava.lang.String;', '[Ljava.lang.String;').implementation = function (str) {
    console.log('[+] Bypassing IBM WorkLight HostNameVerifierWithCertificatePinning {3}: ' + str);
    return;
    };
    worklight_Activity.verify.overload('java.lang.String', 'javax.net.ssl.SSLSession').implementation = function (str) {
    console.log('[+] Bypassing IBM WorkLight HostNameVerifierWithCertificatePinning {4}: ' + str);
    return true;
    };

    } catch (err) {
    console.log('[-] IBM WorkLight HostNameVerifierWithCertificatePinning pinner not found');
    //console.log(err);
    }



    // Conscrypt CertPinManager
    try {
    var conscrypt_CertPinManager_Activity = Java.use('com.android.org.conscrypt.CertPinManager');
    conscrypt_CertPinManager_Activity.isChainValid.overload('java.lang.String', 'java.util.List').implementation = function (str) {
    console.log('[+] Bypassing Conscrypt CertPinManager: ' + str);
    return true;
    };

    } catch (err) {
    console.log('[-] Conscrypt CertPinManager pinner not found');
    //console.log(err);
    }



    // CWAC-Netsecurity (unofficial back-port pinner for Android < 4.2) CertPinManager
    try {
    var cwac_CertPinManager_Activity = Java.use('com.commonsware.cwac.netsecurity.conscrypt.CertPinManager');
    cwac_CertPinManager_Activity.isChainValid.overload('java.lang.String', 'java.util.List').implementation = function (str) {
    console.log('[+] Bypassing CWAC-Netsecurity CertPinManager: ' + str);
    return true;
    };

    } catch (err) {
    console.log('[-] CWAC-Netsecurity CertPinManager pinner not found');
    //console.log(err);
    }



    // Worklight Androidgap WLCertificatePinningPlugin
    try {
    var androidgap_WLCertificatePinningPlugin_Activity = Java.use('com.worklight.androidgap.plugin.WLCertificatePinningPlugin');
    androidgap_WLCertificatePinningPlugin_Activity.execute.overload('java.lang.String', 'org.json.JSONArray', 'org.apache.cordova.CallbackContext').implementation = function (str) {
    console.log('[+] Bypassing Worklight Androidgap WLCertificatePinningPlugin: ' + str);
    return true;
    };

    } catch (err) {
    console.log('[-] Worklight Androidgap WLCertificatePinningPlugin pinner not found');
    //console.log(err);
    }



    // Netty FingerprintTrustManagerFactory
    try {
    var netty_FingerprintTrustManagerFactory = Java.use('io.netty.handler.ssl.util.FingerprintTrustManagerFactory');
    //NOTE: sometimes this below implementation could be useful
    //var netty_FingerprintTrustManagerFactory = Java.use('org.jboss.netty.handler.ssl.util.FingerprintTrustManagerFactory');
    netty_FingerprintTrustManagerFactory.checkTrusted.implementation = function (type, chain) {
    console.log('[+] Bypassing Netty FingerprintTrustManagerFactory');
    };

    } catch (err) {
    console.log('[-] Netty FingerprintTrustManagerFactory pinner not found');
    //console.log(err);
    }



    // Squareup CertificatePinner [OkHTTP < v3] (double bypass)
    try {
    var Squareup_CertificatePinner_Activity = Java.use('com.squareup.okhttp.CertificatePinner');
    Squareup_CertificatePinner_Activity.check.overload('java.lang.String', 'java.security.cert.Certificate').implementation = function (str1, str2) {
    console.log('[+] Bypassing Squareup CertificatePinner {1}: ' + str1);
    return;
    };

    Squareup_CertificatePinner_Activity.check.overload('java.lang.String', 'java.util.List').implementation = function (str1, str2) {
    console.log('[+] Bypassing Squareup CertificatePinner {2}: ' + str1);
    return;
    };

    } catch (err) {
    console.log('[-] Squareup CertificatePinner pinner not found');
    //console.log(err);
    }



    // Squareup OkHostnameVerifier [OkHTTP v3] (double bypass)
    try {
    var Squareup_OkHostnameVerifier_Activity = Java.use('com.squareup.okhttp.internal.tls.OkHostnameVerifier');
    Squareup_OkHostnameVerifier_Activity.verify.overload('java.lang.String', 'java.security.cert.X509Certificate').implementation = function (str1, str2) {
    console.log('[+] Bypassing Squareup OkHostnameVerifier {1}: ' + str1);
    return true;
    };

    Squareup_OkHostnameVerifier_Activity.verify.overload('java.lang.String', 'javax.net.ssl.SSLSession').implementation = function (str1, str2) {
    console.log('[+] Bypassing Squareup OkHostnameVerifier {2}: ' + str1);
    return true;
    };

    } catch (err) {
    console.log('[-] Squareup OkHostnameVerifier pinner not found');
    //console.log(err);
    }



    // Android WebViewClient
    try {
    var AndroidWebViewClient_Activity = Java.use('android.webkit.WebViewClient');
    AndroidWebViewClient_Activity.onReceivedSslError.overload('android.webkit.WebView', 'android.webkit.SslErrorHandler', 'android.net.http.SslError').implementation = function (obj1, obj2, obj3) {
    console.log('[+] Bypassing Android WebViewClient');
    };

    } catch (err) {
    console.log('[-] Android WebViewClient pinner not found');
    //console.log(err);
    }



    // Apache Cordova WebViewClient
    try {
    var CordovaWebViewClient_Activity = Java.use('org.apache.cordova.CordovaWebViewClient');
    CordovaWebViewClient_Activity.onReceivedSslError.overload('android.webkit.WebView', 'android.webkit.SslErrorHandler', 'android.net.http.SslError').implementation = function (obj1, obj2, obj3) {
    console.log('[+] Bypassing Apache Cordova WebViewClient');
    obj3.proceed();
    };

    } catch (err) {
    console.log('[-] Apache Cordova WebViewClient pinner not found');
    //console.log(err):
    }



    // Boye AbstractVerifier
    try {
    var boye_AbstractVerifier = Java.use('ch.boye.httpclientandroidlib.conn.ssl.AbstractVerifier');
    boye_AbstractVerifier.verify.implementation = function (host, ssl) {
    console.log('[+] Bypassing Boye AbstractVerifier: ' + host);
    };

    } catch (err) {
    console.log('[-] Boye AbstractVerifier pinner not found');
    //console.log(err):
    }


    });

    }, 0);
    [IMG]

    3. Переходи и настрой эмулятор Настройки - О планшете - и кликайте по Номеру сборки пока вы не станете разработчиком )
    [IMG]

    4. Теперь идем в пункт настроек Для разработчиков и включаем Отладку по USB
    [IMG]

    5. Открываем cmd в папке adb
    [IMG]

    6. И в открывшемся cmd пишем
    [IMG]
    Код
    adb connect 127.0.0.1:21503
    7. Проверим что устройство подключилась к adb , водим еще одну команду
    [IMG]
    Код
    adb devices
    8 . Дальше нам надо скачать Frida-server в соответствии архитектуры нашего устройства, потому для этого впишем в cmd еще одну команду
    [IMG]
    Код
    adb shell getprop ro.product.cpu.abi
    9. Переходим на сайт тык и скачиваем, в моем случае это frida-server-12.11.1-android-x86_64.xz

    10. Внедряем frida-server в наше устройство
    [IMG]
    Код
    adb push C:\adb\тут ваша версия /data/local/tmp/
    [CODE]adb shell chmod 777 /data/local/tmp/тут ваша версия[/CODE]11. Теперь нам надо запустить frida-server
    [IMG]
    [CODE]adb shell /data/local/tmp/тут ваша версия & [/CODE]12. Никакого вывода не должно быть у этой команды , не закрывая cmd мы запускаем новый cmd таким же способом ( Смотреть 5 пункт выше )
    [IMG]
    [CODE]frida-ps -U[/CODE]Тут ищем то приложение с которого нам нужно снять сертификат

    13. Теперь за инжектим скрип fridascript.js в приложение
    [IMG]
    [CODE]frida -U -l fridascript.js --no-paus -f тут ваше приложения[/CODE]14. Поздравляю вас вы от снифали андроид приложение )
    [IMG]

    Дальше все просто те кто шарят могут пойти дальше и писать проекты )
     
    Этот материал оказался полезным?
    Вы можете отблагодарить автора темы путем перевода средств на баланс
    Отблагодарить автора
    23 июл 2020 Изменено
  2. _Skill_
    _Skill_ 23 июл 2020 1015 25 июн 2018
    1. leniawar Автор темы
      _Skill_, да я хотел использовать его но у меня с ним траблы были )
    2. _Skill_
      leniawar, бывает такое, это из-за того что для определенных приложений другие обходы из этого скрипта не только не работают, а вызывают падение приложения, нужно просто оставить определенную функцию, которая обходит ссл пиннинг в этом приложении
    3. leniawar Автор темы
      _Skill_, можешь в тг ответить хотелось спросить по подробней об этом )
  3. b1nance
    b1nance 23 июл 2020 Заблокирован(а) 2076 29 июл 2018
    Полезно, взял на заметку )
     
  4. Shutni4ok
    Неплохо, напишу с тобой пару проектов в дс по этому методу
     
  5. NullByteX
    NullByteX 15 апр 2025 Hi 7366 28 дек 2019
    Почему может быть такая ошибка при попытке инжекта Failed to spawn: the connection is closed, на старой моей системе работало, переустановил перестало работать. Всё делал пр инструкции как и до этого
     
Загрузка...
Top