Skip to content

۲. سناریو حیاتی: دور زدن SSL Pinning ​

مهم‌ترین کاربرد Java.registerClass در تست نفوذ، ساختن یک TrustManager سفارشی است. اپلیکیشن‌های ایمن، سرتیفیکیت سرور را چک می‌کنند. ما کلاسی می‌سازیم که می‌گوید: "من همه چیز را تایید می‌کنم و هیچ چیزی را چک نمی‌کنم!"

کد فریدا (ساخت TrustManager جعلی):

javascript
Java.perform(function () {
    /* اینترفیس استاندارد جاوا برای بررسی گواهی‌ها */    
    var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager')
    var SSLContext = Java.use('javax.net.ssl.SSLContext')

    /* ساخت یک TrustManager که هیچ کاری نمی‌کند (همه چی را قبول دارد) */    
    var TrustAllCerts = Java.registerClass({
        name: 'com.hack.TrustAllCerts',
        implements: [X509TrustManager],
        methods: {
            checkClientTrusted: function (chain, authType) { },
            checkServerTrusted: function (chain, authType) { },
            getAcceptedIssuers: function () { return [] }
        }
    })

    /* تزریق این TrustManager به SSLContext */    
    var trustManagers = [TrustAllCerts.$new()]
    var sslContext = SSLContext.getInstance("TLS")
    sslContext.init(null, trustManagers, null)
    
    console.log("[+] Custom TrustManager registered. SSL Pinning might be bypassed!")
})

مدیریت Garbage Collection

اشیاء ساخته شده با registerClass ممکن است توسط Garbage Collector جاوا پاک شوند. اگر می‌خواهید شیء شما در طول اجرای برنامه زنده بماند، بهتر است رفرنس آن را در یک متغیر سراسری (Global) یا آرایه نگه دارید.