Загрузка...

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

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

Загрузка...
Опрос

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

  1. да

    9
    69,2%
  2. нет

    4
    30,8%
  1. leniawar
    leniawar Автор темы 23 июл 2020 https://zelenka.guru/threads/5235448/ 4411 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 1020 25 июн 2018
    1. leniawar Автор темы
      _Skill_, да я хотел использовать его но у меня с ним траблы были )
    2. _Skill_
      leniawar, бывает такое, это из-за того что для определенных приложений другие обходы из этого скрипта не только не работают, а вызывают падение приложения, нужно просто оставить определенную функцию, которая обходит ссл пиннинг в этом приложении
    3. leniawar Автор темы
      _Skill_, можешь в тг ответить хотелось спросить по подробней об этом )
  3. b1nance
    b1nance 23 июл 2020 Заблокирован(а) 2077 29 июл 2018
    Полезно, взял на заметку )
     
  4. Shutni4ok
    Неплохо, напишу с тобой пару проектов в дс по этому методу
     
  5. NullByteX
    NullByteX 15 апр 2025 Hi 7353 28 дек 2019
    Почему может быть такая ошибка при попытке инжекта Failed to spawn: the connection is closed, на старой моей системе работало, переустановил перестало работать. Всё делал пр инструкции как и до этого
     
Top
JavaScript error: