forked from fullstack-sake/legym_fk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sake.js
136 lines (113 loc) · 4.67 KB
/
sake.js
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
Java.perform(function(){
var Log = Java.use("android.util.Log");
Log.e("frida-HOOK",'')
Log.e("frida-HOOK",'===')
Log.e("frida-HOOK",'* Injecting hooks into common certificate pinning methods *')
Log.e("frida-HOOK",'===')
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var SSLContext = Java.use('javax.net.ssl.SSLContext');
// build fake trust manager
var TrustManager = Java.registerClass({
name: 'com.sensepost.test.TrustManager',
implements: [X509TrustManager],
methods: {
checkClientTrusted: function (chain, authType) {
},
checkServerTrusted: function (chain, authType) {
},
getAcceptedIssuers: function () {
return [];
}
}
});
// pass our own custom trust manager through when requested
var TrustManagers = [TrustManager.$new()];
var SSLContext_init = SSLContext.init.overload(
'[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;', 'java.security.SecureRandom'
);
SSLContext_init.implementation = function (keyManager, trustManager, secureRandom) {
Log.e("frida-HOOK",'! Intercepted trustmanager request');
SSLContext_init.call(this, keyManager, TrustManagers, secureRandom);
};
Log.e("frida-HOOK",'* Setup custom trust manager');
// okhttp3
try {
var CertificatePinner = Java.use('okhttp3.CertificatePinner');
CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function (str) {
Log.e("frida-HOOK",'! Intercepted okhttp3: ' + str);
return;
};
Log.e("frida-HOOK",'* Setup okhttp3 pinning')
} catch(err) {
Log.e("frida-HOOK",'* Unable to hook into okhttp3 pinner')
}
// trustkit
try {
var Activity = Java.use("com.datatheorem.android.trustkit.pinning.OkHostnameVerifier");
Activity.verify.overload('java.lang.String', 'javax.net.ssl.SSLSession').implementation = function (str) {
Log.e("frida-HOOK",'! Intercepted trustkit{1}: ' + str);
return true;
};
Activity.verify.overload('java.lang.String', 'java.security.cert.X509Certificate').implementation = function (str) {
Log.e("frida-HOOK",'! Intercepted trustkit{2}: ' + str);
return true;
};
Log.e("frida-HOOK",'* Setup trustkit pinning')
} catch(err) {
Log.e("frida-HOOK",'* Unable to hook into trustkit pinner')
}
// TrustManagerImpl
try {
var TrustManagerImpl = Java.use('com.android.org.conscrypt.TrustManagerImpl');
TrustManagerImpl.verifyChain.implementation = function (untrustedChain, trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {
Log.e("frida-HOOK",'! Intercepted TrustManagerImp: ' + host);
return untrustedChain;
}
Log.e("frida-HOOK",'* Setup TrustManagerImpl pinning')
} catch (err) {
Log.e("frida-HOOK",'* Unable to hook into TrustManagerImpl')
}
// Appcelerator
try {
var PinningTrustManager = Java.use('appcelerator.https.PinningTrustManager');
PinningTrustManager.checkServerTrusted.implementation = function () {
Log.e("frida-HOOK",'! Intercepted Appcelerator');
}
Log.e("frida-HOOK",'* Setup Appcelerator pinning')
} catch (err) {
Log.e("frida-HOOK",'* Unable to hook into Appcelerator pinning')
}
// ByPass SSL pinning for Android 7+
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) {
Log.e("frida-HOOK",'Bypassing SSL Pinning');
var k = array_list.$new();
return k;
}
// Force mode debug for all webview
var WebView = Java.use('android.webkit.WebView');
WebView.loadUrl.overload("java.lang.String").implementation = function (s) {
Log.e("frida-HOOK",'Enable webview debug for URL: '+s.toString());
this.setWebContentsDebuggingEnabled(true);
this.loadUrl.overload("java.lang.String").call(this, s);
};
})
Java.perform(function() {
var Log = Java.use("android.util.Log");
Log.e("frida-HOOK", "Have fun!");
Java.use("java.security.KeyStore$PrivateKeyEntry").getPrivateKey.implementation = function() {
Log.e("frida-HOOK", "[java.security.KeyStore$PrivateKeyEntry.getPrivateKey] Called");
var result = this.getPrivateKey();
let filePath = "/sdcard/Download/client_keystore_" + "_" + getNowTime() + '.p12';
dump2sdcard(this.getPrivateKey(), this.getCertificate(), filePath);
return result;
}
Java.use("java.security.KeyStore$PrivateKeyEntry").getCertificateChain.implementation = function() {
Log.e("frida-HOOK", "[java.security.KeyStore$PrivateKeyEntry.getCertificateChain] Called");
var result = this.getCertificateChain();
let filePath = "/sdcard/Download/client_keystore_" + "_" + getNowTime() + '.p12';
dump2sdcard(this.getPrivateKey(), this.getCertificate(), filePath);
return result;
}
})