rtexit-method 0.1.26 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packaged-assets/.agents/skills/rt-c2-operations/SKILL.md +3 -0
- package/packaged-assets/_rtexit/TOOLS.md +32 -14
- package/packaged-assets/docker/frida-scripts/dump-all-traffic.js +53 -0
- package/packaged-assets/docker/frida-scripts/extract-secrets.js +75 -0
- package/packaged-assets/docker/frida-scripts/intent-monitor.js +64 -0
- package/packaged-assets/docker/frida-scripts/jwt-hook.js +43 -0
- package/packaged-assets/docker/frida-scripts/root-bypass.js +65 -0
- package/packaged-assets/docker/frida-scripts/ssl-pinning-bypass.js +60 -0
- package/packaged-assets/docker/verify/phase3-ad.sh +1 -1
- package/packaged-assets/docker/verify/phase8-creds.sh +1 -1
- package/packaged-assets/resources/tools.md +49 -6
- package/tools/installer/rt-cli.js +9 -3
package/package.json
CHANGED
|
@@ -76,9 +76,12 @@ sliver
|
|
|
76
76
|
|
|
77
77
|
### Havoc C2 Setup
|
|
78
78
|
|
|
79
|
+
> ⚠️ **NOT in rtexit-kali container** — Havoc requires a GUI client. Run on your **host machine**, not inside Docker.
|
|
80
|
+
|
|
79
81
|
**GitHub:** https://github.com/HavocFramework/Havoc
|
|
80
82
|
|
|
81
83
|
```bash
|
|
84
|
+
# Run on HOST MACHINE (not in rtexit-kali container)
|
|
82
85
|
# Dependencies
|
|
83
86
|
sudo apt update && sudo apt install -y git build-essential cmake mingw-w64 \
|
|
84
87
|
nasm python3 python3-pip libssl-dev libz-dev golang-go
|
|
@@ -55,6 +55,10 @@ docker exec rtexit-kali bash -c "nmap -sV TARGET"
|
|
|
55
55
|
| grype | `grype` | Vulnerability scan |
|
|
56
56
|
| wpscan | `wpscan` | WordPress scanning |
|
|
57
57
|
| graphql-cop | `graphql-cop` | GraphQL security |
|
|
58
|
+
| gf | `gf` | Grep patterns for XSS/SQLi/SSRF/RCE in URLs |
|
|
59
|
+
| linkfinder | `linkfinder` | Discover endpoints/APIs in JS files |
|
|
60
|
+
| secretfinder | `secretfinder` | Extract secrets/tokens from JS files |
|
|
61
|
+
| corsy | `corsy` | CORS misconfiguration scanner |
|
|
58
62
|
|
|
59
63
|
---
|
|
60
64
|
|
|
@@ -100,34 +104,48 @@ docker exec rtexit-kali bash -c "nmap -sV TARGET"
|
|
|
100
104
|
|
|
101
105
|
---
|
|
102
106
|
|
|
103
|
-
## Phase 5 — Mobile Testing ✅
|
|
107
|
+
## Phase 5 — Mobile Testing ✅ 39/39
|
|
104
108
|
|
|
105
109
|
| Tool | Command | Use Case |
|
|
106
110
|
|------|---------|----------|
|
|
107
111
|
| adb | `adb` | Android debugging |
|
|
108
|
-
| apktool | `apktool` | APK decompile |
|
|
109
|
-
| jadx | `jadx` | Java decompiler |
|
|
112
|
+
| apktool | `apktool` | APK decompile/repackage |
|
|
113
|
+
| jadx | `jadx` | Java/Kotlin decompiler |
|
|
110
114
|
| dex2jar | `d2j-dex2jar` | DEX to JAR |
|
|
115
|
+
| baksmali | `baksmali` | Disassemble DEX → smali |
|
|
116
|
+
| smali | `smali` | Assemble smali → DEX (patching) |
|
|
117
|
+
| bytecode-viewer | `bytecode-viewer` | Multi-decompiler GUI (jar at `/opt/bytecode-viewer/bytecode-viewer.jar`) |
|
|
118
|
+
| apkid | `apkid` | Packer/obfuscator/protector detection |
|
|
119
|
+
| quark-engine | `quark` | Android malware behavior analysis |
|
|
111
120
|
| frida | `frida` | Dynamic instrumentation |
|
|
112
121
|
| frida-ps | `frida-ps` | List processes |
|
|
113
122
|
| frida-trace | `frida-trace` | Function tracing |
|
|
114
|
-
| objection | `objection` | Runtime manipulation |
|
|
115
|
-
|
|
|
116
|
-
|
|
|
117
|
-
|
|
|
118
|
-
|
|
|
119
|
-
|
|
|
120
|
-
|
|
|
123
|
+
| objection | `objection` | Runtime manipulation (SSL/root/jailbreak bypass) |
|
|
124
|
+
| fridump3 | `fridump3` | Memory dump via frida |
|
|
125
|
+
| setup-frida-server | `setup-frida-server` | Auto-setup frida-server on device |
|
|
126
|
+
| ssl-pinning-bypass | `/opt/frida-scripts/ssl-pinning-bypass.js` | Universal SSL pinning bypass (OkHttp/TrustManager/Conscrypt) |
|
|
127
|
+
| root-bypass | `/opt/frida-scripts/root-bypass.js` | Root detection bypass (RootBeer/su/magisk) |
|
|
128
|
+
| jwt-hook | `/opt/frida-scripts/jwt-hook.js` | JWT/Auth header interceptor |
|
|
129
|
+
| intent-monitor | `/opt/frida-scripts/intent-monitor.js` | Android Intent + deeplink monitor |
|
|
130
|
+
| extract-secrets | `/opt/frida-scripts/extract-secrets.js` | Runtime SharedPrefs/crypto key/SQLite extractor |
|
|
131
|
+
| dump-all-traffic | `/opt/frida-scripts/dump-all-traffic.js` | HTTP/S traffic hooker |
|
|
132
|
+
| reflutter | `reflutter` | Flutter SSL pinning bypass + repack |
|
|
133
|
+
| apk-mitm | `apk-mitm` | Automated SSL pinning bypass |
|
|
134
|
+
| uber-apk-signer | `uber-apk-signer` | APK signing after patching |
|
|
135
|
+
| apkleaks | `apkleaks` | APK secret/key scanning |
|
|
136
|
+
| androguard | `androguard` | Deep APK static analysis |
|
|
121
137
|
| trufflehog3 | `trufflehog3` | Secret scanning |
|
|
122
|
-
| drozer | `drozer` |
|
|
138
|
+
| drozer | `drozer` | Android component exploitation (IPC/intent/content provider) |
|
|
123
139
|
| drozer-agent.apk | `/opt/drozer/drozer-agent.apk` | Install on device |
|
|
124
|
-
| hermes-dec | `hermes-dec` | React Native
|
|
140
|
+
| hermes-dec | `hermes-dec` | React Native Hermes bytecode decompile |
|
|
125
141
|
| hbctool | `hbctool` | Hermes bytecode tool |
|
|
126
142
|
| monodis | `monodis` | Xamarin/Mono analysis |
|
|
127
143
|
| js-beautify | `js-beautify` | JS deobfuscation |
|
|
128
144
|
| qrcode | `qrcode` | QR code generation |
|
|
129
|
-
| msfvenom | `msfvenom` | Mobile payload
|
|
130
|
-
|
|
|
145
|
+
| msfvenom | `msfvenom` | Mobile payload generation |
|
|
146
|
+
| apkeep | `apkeep` | Download APKs from Google Play / APKPure |
|
|
147
|
+
| ipatool | `ipatool` | Download IPA from App Store |
|
|
148
|
+
| ssh | `ssh` | iOS device access (jailbroken) |
|
|
131
149
|
| bleak | `bleak` (python) | BLE scanning |
|
|
132
150
|
| crackle | `/opt/crackle` | BLE crack |
|
|
133
151
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// HTTP/S Traffic Dumper — HttpURLConnection + OkHttp request/response
|
|
2
|
+
// Usage: frida -U -f com.target.app -l dump-all-traffic.js --no-pause
|
|
3
|
+
// Combine with: mitmproxy or Burp Suite on port 8080
|
|
4
|
+
|
|
5
|
+
Java.perform(function() {
|
|
6
|
+
// --- HttpURLConnection ---
|
|
7
|
+
try {
|
|
8
|
+
var HttpURLConnection = Java.use('java.net.HttpURLConnection');
|
|
9
|
+
HttpURLConnection.getInputStream.implementation = function() {
|
|
10
|
+
console.log('[HTTP] ' + this.getRequestMethod() + ' ' + this.getURL().toString());
|
|
11
|
+
return this.getInputStream();
|
|
12
|
+
};
|
|
13
|
+
HttpURLConnection.getResponseCode.implementation = function() {
|
|
14
|
+
var code = this.getResponseCode();
|
|
15
|
+
console.log('[HTTP] Response: ' + code + ' ' + this.getURL().toString());
|
|
16
|
+
return code;
|
|
17
|
+
};
|
|
18
|
+
} catch(e) {}
|
|
19
|
+
|
|
20
|
+
// --- URL.openConnection ---
|
|
21
|
+
try {
|
|
22
|
+
var URL = Java.use('java.net.URL');
|
|
23
|
+
URL.openConnection.overload().implementation = function() {
|
|
24
|
+
console.log('[URL] openConnection: ' + this.toString());
|
|
25
|
+
return this.openConnection();
|
|
26
|
+
};
|
|
27
|
+
} catch(e) {}
|
|
28
|
+
|
|
29
|
+
// --- OkHttp3 Request builder ---
|
|
30
|
+
try {
|
|
31
|
+
var RequestBuilder = Java.use('okhttp3.Request$Builder');
|
|
32
|
+
RequestBuilder.build.implementation = function() {
|
|
33
|
+
var req = this.build();
|
|
34
|
+
console.log('[OkHttp3] ' + req.method() + ' ' + req.url().toString());
|
|
35
|
+
var headers = req.headers();
|
|
36
|
+
for (var i = 0; i < headers.size(); i++) {
|
|
37
|
+
console.log(' Header: ' + headers.name(i) + ': ' + headers.value(i));
|
|
38
|
+
}
|
|
39
|
+
return req;
|
|
40
|
+
};
|
|
41
|
+
} catch(e) {}
|
|
42
|
+
|
|
43
|
+
// --- WebView URL load ---
|
|
44
|
+
try {
|
|
45
|
+
var WebView = Java.use('android.webkit.WebView');
|
|
46
|
+
WebView.loadUrl.overload('java.lang.String').implementation = function(url) {
|
|
47
|
+
console.log('[WebView] loadUrl: ' + url);
|
|
48
|
+
return this.loadUrl(url);
|
|
49
|
+
};
|
|
50
|
+
} catch(e) {}
|
|
51
|
+
|
|
52
|
+
console.log('[RTExit] Traffic dumper loaded. Use with Burp/mitmproxy on 8080.');
|
|
53
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Runtime Secret Extractor — SharedPreferences, SQLite queries, crypto keys, JWT
|
|
2
|
+
// Usage: frida -U -f com.target.app -l extract-secrets.js --no-pause
|
|
3
|
+
|
|
4
|
+
Java.perform(function() {
|
|
5
|
+
// --- SharedPreferences ---
|
|
6
|
+
try {
|
|
7
|
+
var SharedPreferencesImpl = Java.use('android.app.SharedPreferencesImpl');
|
|
8
|
+
SharedPreferencesImpl.getString.implementation = function(key, defVal) {
|
|
9
|
+
var val = this.getString(key, defVal);
|
|
10
|
+
if (val && val.length > 0) console.log('[SharedPrefs] ' + key + ' = ' + val);
|
|
11
|
+
return val;
|
|
12
|
+
};
|
|
13
|
+
SharedPreferencesImpl.getInt.implementation = function(key, defVal) {
|
|
14
|
+
var val = this.getInt(key, defVal);
|
|
15
|
+
console.log('[SharedPrefs:int] ' + key + ' = ' + val);
|
|
16
|
+
return val;
|
|
17
|
+
};
|
|
18
|
+
} catch(e) {}
|
|
19
|
+
|
|
20
|
+
// --- Crypto key material ---
|
|
21
|
+
try {
|
|
22
|
+
var SecretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');
|
|
23
|
+
SecretKeySpec.$init.overload('[B', 'java.lang.String').implementation = function(key, algo) {
|
|
24
|
+
var hexKey = Array.from(key, function(b) { return ('0' + (b & 0xff).toString(16)).slice(-2); }).join('');
|
|
25
|
+
console.log('[CRYPTO KEY] algo=' + algo + ' key(hex)=' + hexKey);
|
|
26
|
+
return this.$init(key, algo);
|
|
27
|
+
};
|
|
28
|
+
} catch(e) {}
|
|
29
|
+
|
|
30
|
+
// --- Cipher init — IV + key ---
|
|
31
|
+
try {
|
|
32
|
+
var Cipher = Java.use('javax.crypto.Cipher');
|
|
33
|
+
Cipher.init.overload('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec').implementation = function(mode, key, params) {
|
|
34
|
+
var modeStr = mode === 1 ? 'ENCRYPT' : mode === 2 ? 'DECRYPT' : 'mode=' + mode;
|
|
35
|
+
console.log('[CIPHER] ' + modeStr + ' algo=' + key.getAlgorithm());
|
|
36
|
+
return this.init(mode, key, params);
|
|
37
|
+
};
|
|
38
|
+
} catch(e) {}
|
|
39
|
+
|
|
40
|
+
// --- SQLiteDatabase queries ---
|
|
41
|
+
try {
|
|
42
|
+
var SQLiteDatabase = Java.use('android.database.sqlite.SQLiteDatabase');
|
|
43
|
+
SQLiteDatabase.rawQuery.overload('java.lang.String', '[Ljava.lang.String;').implementation = function(sql, args) {
|
|
44
|
+
console.log('[SQLite] ' + sql);
|
|
45
|
+
return this.rawQuery(sql, args);
|
|
46
|
+
};
|
|
47
|
+
SQLiteDatabase.execSQL.overload('java.lang.String').implementation = function(sql) {
|
|
48
|
+
console.log('[SQLite execSQL] ' + sql);
|
|
49
|
+
return this.execSQL(sql);
|
|
50
|
+
};
|
|
51
|
+
} catch(e) {}
|
|
52
|
+
|
|
53
|
+
// --- JWT/Base64 encoded tokens ---
|
|
54
|
+
try {
|
|
55
|
+
var Base64 = Java.use('android.util.Base64');
|
|
56
|
+
Base64.decode.overload('java.lang.String', 'int').implementation = function(str, flags) {
|
|
57
|
+
if (str && str.startsWith('ey')) console.log('[JWT TOKEN] ' + str);
|
|
58
|
+
return this.decode(str, flags);
|
|
59
|
+
};
|
|
60
|
+
} catch(e) {}
|
|
61
|
+
|
|
62
|
+
// --- Authorization headers ---
|
|
63
|
+
try {
|
|
64
|
+
var Headers = Java.use('okhttp3.Headers');
|
|
65
|
+
Headers.get.overload('java.lang.String').implementation = function(name) {
|
|
66
|
+
var val = this.get(name);
|
|
67
|
+
if (name.toLowerCase() === 'authorization' && val) {
|
|
68
|
+
console.log('[AUTH HEADER] ' + val);
|
|
69
|
+
}
|
|
70
|
+
return val;
|
|
71
|
+
};
|
|
72
|
+
} catch(e) {}
|
|
73
|
+
|
|
74
|
+
console.log('[RTExit] Secret extractor loaded.');
|
|
75
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Android Intent Monitor — logs all intents, deeplinks, exported component calls
|
|
2
|
+
// Usage: frida -U -f com.target.app -l intent-monitor.js --no-pause
|
|
3
|
+
|
|
4
|
+
Java.perform(function() {
|
|
5
|
+
// --- Intent creation/actions ---
|
|
6
|
+
try {
|
|
7
|
+
var Intent = Java.use('android.content.Intent');
|
|
8
|
+
Intent.setAction.implementation = function(action) {
|
|
9
|
+
if (action) console.log('[INTENT] setAction: ' + action);
|
|
10
|
+
return this.setAction(action);
|
|
11
|
+
};
|
|
12
|
+
Intent.setData.implementation = function(uri) {
|
|
13
|
+
if (uri) console.log('[INTENT] setData (deeplink): ' + uri.toString());
|
|
14
|
+
return this.setData(uri);
|
|
15
|
+
};
|
|
16
|
+
Intent.putExtra.overload('java.lang.String', 'java.lang.String').implementation = function(k, v) {
|
|
17
|
+
console.log('[INTENT EXTRA] ' + k + ' = ' + v);
|
|
18
|
+
return this.putExtra(k, v);
|
|
19
|
+
};
|
|
20
|
+
Intent.getData.implementation = function() {
|
|
21
|
+
var data = this.getData();
|
|
22
|
+
if (data) console.log('[INTENT DATA] ' + data.toString());
|
|
23
|
+
return data;
|
|
24
|
+
};
|
|
25
|
+
} catch(e) {}
|
|
26
|
+
|
|
27
|
+
// --- Activity navigation ---
|
|
28
|
+
try {
|
|
29
|
+
var Activity = Java.use('android.app.Activity');
|
|
30
|
+
Activity.startActivity.overload('android.content.Intent').implementation = function(intent) {
|
|
31
|
+
var action = intent.getAction ? intent.getAction() : '?';
|
|
32
|
+
var data = intent.getData ? intent.getData() : null;
|
|
33
|
+
console.log('[startActivity] action=' + action + (data ? ' data=' + data : ''));
|
|
34
|
+
return this.startActivity(intent);
|
|
35
|
+
};
|
|
36
|
+
Activity.startActivityForResult.overload('android.content.Intent', 'int').implementation = function(intent, req) {
|
|
37
|
+
console.log('[startActivityForResult] requestCode=' + req + ' intent=' + intent.toString());
|
|
38
|
+
return this.startActivityForResult(intent, req);
|
|
39
|
+
};
|
|
40
|
+
} catch(e) {}
|
|
41
|
+
|
|
42
|
+
// --- Broadcast intents ---
|
|
43
|
+
try {
|
|
44
|
+
var Context = Java.use('android.content.ContextWrapper');
|
|
45
|
+
Context.sendBroadcast.overload('android.content.Intent').implementation = function(intent) {
|
|
46
|
+
console.log('[sendBroadcast] ' + intent.toString());
|
|
47
|
+
return this.sendBroadcast(intent);
|
|
48
|
+
};
|
|
49
|
+
} catch(e) {}
|
|
50
|
+
|
|
51
|
+
// --- Content Provider access ---
|
|
52
|
+
try {
|
|
53
|
+
var ContentResolver = Java.use('android.content.ContentResolver');
|
|
54
|
+
ContentResolver.query.overload(
|
|
55
|
+
'android.net.Uri', '[Ljava.lang.String;',
|
|
56
|
+
'android.os.Bundle', 'android.os.CancellationSignal'
|
|
57
|
+
).implementation = function(uri, proj, sel, cancel) {
|
|
58
|
+
console.log('[ContentProvider] query: ' + uri.toString());
|
|
59
|
+
return this.query(uri, proj, sel, cancel);
|
|
60
|
+
};
|
|
61
|
+
} catch(e) {}
|
|
62
|
+
|
|
63
|
+
console.log('[RTExit] Intent monitor loaded.');
|
|
64
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// JWT Token Interceptor — captures tokens from Base64 decode, headers, and memory strings
|
|
2
|
+
// Usage: frida -U -f com.target.app -l jwt-hook.js --no-pause
|
|
3
|
+
|
|
4
|
+
Java.perform(function() {
|
|
5
|
+
// --- Base64 JWT detection ---
|
|
6
|
+
try {
|
|
7
|
+
var Base64 = Java.use('android.util.Base64');
|
|
8
|
+
Base64.encodeToString.overload('[B', 'int').implementation = function(input, flags) {
|
|
9
|
+
var result = this.encodeToString(input, flags);
|
|
10
|
+
if (result.length > 50) console.log('[Base64 OUT] ' + result.substring(0, 300));
|
|
11
|
+
return result;
|
|
12
|
+
};
|
|
13
|
+
Base64.decode.overload('java.lang.String', 'int').implementation = function(str, flags) {
|
|
14
|
+
if (str && str.startsWith('ey')) console.log('[JWT DECODE] ' + str);
|
|
15
|
+
return this.decode(str, flags);
|
|
16
|
+
};
|
|
17
|
+
} catch(e) {}
|
|
18
|
+
|
|
19
|
+
// --- OkHttp3 Authorization header ---
|
|
20
|
+
try {
|
|
21
|
+
var RequestBuilder = Java.use('okhttp3.Request$Builder');
|
|
22
|
+
RequestBuilder.header.implementation = function(name, value) {
|
|
23
|
+
if (name.toLowerCase() === 'authorization') console.log('[JWT/AUTH] ' + name + ': ' + value);
|
|
24
|
+
if (name.toLowerCase() === 'x-auth-token') console.log('[TOKEN] ' + name + ': ' + value);
|
|
25
|
+
if (name.toLowerCase() === 'x-api-key') console.log('[API KEY] ' + name + ': ' + value);
|
|
26
|
+
return this.header(name, value);
|
|
27
|
+
};
|
|
28
|
+
} catch(e) {}
|
|
29
|
+
|
|
30
|
+
// --- String patterns for JWT/API keys ---
|
|
31
|
+
try {
|
|
32
|
+
var String = Java.use('java.lang.String');
|
|
33
|
+
String.valueOf.overload('java.lang.Object').implementation = function(obj) {
|
|
34
|
+
var result = this.valueOf(obj);
|
|
35
|
+
if (result && result.startsWith('ey') && result.length > 50) {
|
|
36
|
+
console.log('[JWT String] ' + result.substring(0, 300));
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
} catch(e) {}
|
|
41
|
+
|
|
42
|
+
console.log('[RTExit] JWT hook loaded.');
|
|
43
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Root Detection Bypass — RootBeer, SafetyNet basics, su/magisk file checks, Runtime.exec
|
|
2
|
+
// Usage: frida -U -f com.target.app -l root-bypass.js --no-pause
|
|
3
|
+
|
|
4
|
+
Java.perform(function() {
|
|
5
|
+
// --- RootBeer ---
|
|
6
|
+
try {
|
|
7
|
+
var RootBeer = Java.use('com.scottyab.rootbeer.RootBeer');
|
|
8
|
+
RootBeer.isRooted.implementation = function() { return false; };
|
|
9
|
+
RootBeer.isRootedWithoutBusyBox.implementation = function() { return false; };
|
|
10
|
+
RootBeer.checkForSuBinary.implementation = function() { return false; };
|
|
11
|
+
RootBeer.detectRootManagementApps.implementation = function() { return false; };
|
|
12
|
+
RootBeer.detectPotentiallyDangerousApps.implementation = function() { return false; };
|
|
13
|
+
console.log('[+] RootBeer bypassed');
|
|
14
|
+
} catch(e) {}
|
|
15
|
+
|
|
16
|
+
// --- File-based su/magisk/busybox checks ---
|
|
17
|
+
try {
|
|
18
|
+
var File = Java.use('java.io.File');
|
|
19
|
+
File.exists.implementation = function() {
|
|
20
|
+
var name = this.getAbsolutePath();
|
|
21
|
+
if (name.indexOf('su') !== -1 || name.indexOf('magisk') !== -1 || name.indexOf('busybox') !== -1) {
|
|
22
|
+
console.log('[+] File.exists blocked: ' + name);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return this.exists();
|
|
26
|
+
};
|
|
27
|
+
} catch(e) {}
|
|
28
|
+
|
|
29
|
+
// --- Runtime.exec su ---
|
|
30
|
+
try {
|
|
31
|
+
var Runtime = Java.use('java.lang.Runtime');
|
|
32
|
+
Runtime.exec.overload('java.lang.String').implementation = function(cmd) {
|
|
33
|
+
if (cmd.indexOf('su') !== -1) {
|
|
34
|
+
console.log('[+] Runtime.exec(su) blocked');
|
|
35
|
+
throw Java.use('java.io.IOException').$new('Permission denied');
|
|
36
|
+
}
|
|
37
|
+
return this.exec(cmd);
|
|
38
|
+
};
|
|
39
|
+
} catch(e) {}
|
|
40
|
+
|
|
41
|
+
// --- System Properties ---
|
|
42
|
+
try {
|
|
43
|
+
var SystemProperties = Java.use('android.os.SystemProperties');
|
|
44
|
+
SystemProperties.get.overload('java.lang.String').implementation = function(key) {
|
|
45
|
+
if (key === 'ro.debuggable') return '0';
|
|
46
|
+
if (key === 'ro.secure') return '1';
|
|
47
|
+
return this.get(key);
|
|
48
|
+
};
|
|
49
|
+
} catch(e) {}
|
|
50
|
+
|
|
51
|
+
// --- PackageManager root app detection ---
|
|
52
|
+
try {
|
|
53
|
+
var PackageManager = Java.use('android.app.ApplicationPackageManager');
|
|
54
|
+
var rootPkgs = ['com.topjohnwu.magisk', 'eu.chainfire.supersu', 'com.koushikdutta.superuser'];
|
|
55
|
+
PackageManager.getPackageInfo.overload('java.lang.String', 'int').implementation = function(pkg, flags) {
|
|
56
|
+
if (rootPkgs.indexOf(pkg) !== -1) {
|
|
57
|
+
console.log('[+] PackageManager blocked: ' + pkg);
|
|
58
|
+
throw Java.use('android.content.pm.PackageManager$NameNotFoundException').$new();
|
|
59
|
+
}
|
|
60
|
+
return this.getPackageInfo(pkg, flags);
|
|
61
|
+
};
|
|
62
|
+
} catch(e) {}
|
|
63
|
+
|
|
64
|
+
console.log('[RTExit] Root bypass loaded.');
|
|
65
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Universal SSL Pinning Bypass — OkHttp3, TrustManager, X509, Conscrypt, HostnameVerifier
|
|
2
|
+
// Usage: frida -U -f com.target.app -l ssl-pinning-bypass.js --no-pause
|
|
3
|
+
|
|
4
|
+
Java.perform(function() {
|
|
5
|
+
// --- OkHttp3 CertificatePinner ---
|
|
6
|
+
try {
|
|
7
|
+
var CertificatePinner = Java.use('okhttp3.CertificatePinner');
|
|
8
|
+
CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function() {
|
|
9
|
+
console.log('[+] OkHttp3 CertificatePinner.check bypassed');
|
|
10
|
+
};
|
|
11
|
+
CertificatePinner.check.overload('java.lang.String', '[Ljava.security.cert.Certificate;').implementation = function() {
|
|
12
|
+
console.log('[+] OkHttp3 CertificatePinner.check (cert) bypassed');
|
|
13
|
+
};
|
|
14
|
+
} catch(e) {}
|
|
15
|
+
|
|
16
|
+
// --- Custom TrustManager (accept all) ---
|
|
17
|
+
try {
|
|
18
|
+
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
|
|
19
|
+
var SSLContext = Java.use('javax.net.ssl.SSLContext');
|
|
20
|
+
var TrustManager = Java.registerClass({
|
|
21
|
+
name: 'com.rtexit.bypass.TrustManager',
|
|
22
|
+
implements: [X509TrustManager],
|
|
23
|
+
methods: {
|
|
24
|
+
checkClientTrusted: function(chain, authType) {},
|
|
25
|
+
checkServerTrusted: function(chain, authType) { console.log('[+] checkServerTrusted bypassed'); },
|
|
26
|
+
getAcceptedIssuers: function() { return []; }
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
var SSLContextInst = SSLContext.getInstance('TLS');
|
|
30
|
+
SSLContextInst.init(null, [TrustManager.$new()], null);
|
|
31
|
+
SSLContext.getDefault.implementation = function() { return SSLContextInst; };
|
|
32
|
+
} catch(e) {}
|
|
33
|
+
|
|
34
|
+
// --- HostnameVerifier ---
|
|
35
|
+
try {
|
|
36
|
+
var HttpsURLConnection = Java.use('javax.net.ssl.HttpsURLConnection');
|
|
37
|
+
HttpsURLConnection.setDefaultHostnameVerifier.implementation = function(verifier) {
|
|
38
|
+
console.log('[+] HostnameVerifier bypassed');
|
|
39
|
+
};
|
|
40
|
+
} catch(e) {}
|
|
41
|
+
|
|
42
|
+
// --- Conscrypt (Android network stack) ---
|
|
43
|
+
try {
|
|
44
|
+
var PlatformTrustManager = Java.use('com.android.org.conscrypt.TrustManagerImpl');
|
|
45
|
+
PlatformTrustManager.checkTrusted.overload('[Ljava.security.cert.X509Certificate;', 'java.lang.String', 'boolean').implementation = function(a, b, c) {
|
|
46
|
+
console.log('[+] Conscrypt TrustManagerImpl bypassed');
|
|
47
|
+
return Java.use('java.util.ArrayList').$new();
|
|
48
|
+
};
|
|
49
|
+
} catch(e) {}
|
|
50
|
+
|
|
51
|
+
// --- Network Security Config bypass ---
|
|
52
|
+
try {
|
|
53
|
+
var NetworkSecurityTrustManager = Java.use('android.security.net.config.NetworkSecurityTrustManager');
|
|
54
|
+
NetworkSecurityTrustManager.checkServerTrusted.implementation = function(chain, authType, hostname) {
|
|
55
|
+
console.log('[+] NetworkSecurityTrustManager bypassed: ' + hostname);
|
|
56
|
+
};
|
|
57
|
+
} catch(e) {}
|
|
58
|
+
|
|
59
|
+
console.log('[RTExit] SSL Pinning bypass loaded.');
|
|
60
|
+
});
|
|
@@ -72,7 +72,7 @@ chk_dir "ScareCrow" /opt/ScareCrow
|
|
|
72
72
|
chk_dir "KrbRelayUp" /opt/KrbRelayUp
|
|
73
73
|
|
|
74
74
|
section "BloodHound"
|
|
75
|
-
|
|
75
|
+
chk "BloodHound.py" bloodhound-python
|
|
76
76
|
chk "bloodhound-python" bloodhound-python
|
|
77
77
|
|
|
78
78
|
section "Post-Auth Lateral"
|
|
@@ -7,7 +7,7 @@ phase_header "PHASE 8 — Password Attacks & Credential Access"
|
|
|
7
7
|
section "Hash Cracking"
|
|
8
8
|
chk "hashcat" hashcat
|
|
9
9
|
chk "john" john
|
|
10
|
-
|
|
10
|
+
chk_opt "ophcrack" ophcrack # not in Kali rolling repos
|
|
11
11
|
|
|
12
12
|
section "Online Brute Force"
|
|
13
13
|
chk "hydra" hydra
|
|
@@ -33,13 +33,56 @@ Use tools only inside the authorized scope and record commands through the autod
|
|
|
33
33
|
|
|
34
34
|
## Mobile and Desktop
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
### Static Analysis
|
|
37
|
+
| Tool | Command | Purpose |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| apktool | `apktool d app.apk -o out/` | Decompile APK → smali + resources |
|
|
40
|
+
| jadx | `jadx -d output/ app.apk` | Java/Kotlin decompiler |
|
|
41
|
+
| baksmali | `baksmali d classes.dex -o smali/` | Disassemble DEX → smali |
|
|
42
|
+
| smali | `smali a smali/ -o patched.dex` | Reassemble smali → DEX (patching) |
|
|
43
|
+
| apkid | `apkid app.apk` | Detect packer/obfuscator/protector |
|
|
44
|
+
| quark-engine | `quark -a app.apk` | Malware behavior + MITRE ATT&CK |
|
|
45
|
+
| apkleaks | `apkleaks -f app.apk` | Hardcoded secrets/keys/endpoints |
|
|
46
|
+
| androguard | `androguard analyze app.apk` | Deep APK static analysis |
|
|
47
|
+
| bytecode-viewer | `bytecode-viewer` | Multi-decompiler GUI (jadx+cfr+procyon) |
|
|
48
|
+
| dex2jar | `d2j-dex2jar app.apk` | DEX → JAR for jd-gui |
|
|
49
|
+
|
|
50
|
+
### Dynamic / Runtime
|
|
51
|
+
| Tool | Command | Purpose |
|
|
37
52
|
|---|---|---|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
53
|
+
| frida | `frida -U -f com.target.app -l script.js --no-pause` | Dynamic instrumentation |
|
|
54
|
+
| objection | `objection -g com.target.app explore` | Runtime SSL/root/jailbreak bypass |
|
|
55
|
+
| fridump3 | `fridump3 -U com.target.app -o dump/` | Full memory dump |
|
|
56
|
+
| drozer | `drozer console connect` | IPC/intent/content-provider exploitation |
|
|
57
|
+
|
|
58
|
+
### Frida Scripts Library (`docker/frida-scripts/`)
|
|
59
|
+
| Script | Purpose |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `ssl-pinning-bypass.js` | OkHttp3 + TrustManager + Conscrypt + NetworkSecurityConfig |
|
|
62
|
+
| `root-bypass.js` | RootBeer + magisk + su + PackageManager detection |
|
|
63
|
+
| `extract-secrets.js` | SharedPrefs + crypto keys + SQLite + JWT at runtime |
|
|
64
|
+
| `jwt-hook.js` | Authorization headers + API keys + Base64 JWT |
|
|
65
|
+
| `intent-monitor.js` | Intents + deeplinks + ContentProvider + Broadcasts |
|
|
66
|
+
| `dump-all-traffic.js` | HTTP/S requests via HttpURLConnection + OkHttp3 + WebView |
|
|
67
|
+
|
|
68
|
+
### SSL Pinning Bypass
|
|
69
|
+
| Tool | Command | Purpose |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| apk-mitm | `apk-mitm app.apk` | Automated SSL pinning bypass + repack |
|
|
72
|
+
| reflutter | `reflutter app.apk` | Flutter SSL pinning bypass |
|
|
73
|
+
| uber-apk-signer | `uber-apk-signer -a patched.apk` | Sign APK after patching |
|
|
74
|
+
|
|
75
|
+
### Downloaders
|
|
76
|
+
| Tool | Command | Purpose |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| apkeep | `apkeep -a com.target.app -d google-play ./` | Download APK from Google Play |
|
|
79
|
+
| ipatool | `ipatool download -b com.target.app` | Download IPA from App Store |
|
|
80
|
+
|
|
81
|
+
### Desktop / .NET
|
|
82
|
+
| Tool | Purpose |
|
|
83
|
+
|---|---|
|
|
84
|
+
| dnSpy/ILSpy | .NET inspection |
|
|
85
|
+
| monodis | Xamarin/Mono assembly analysis |
|
|
43
86
|
|
|
44
87
|
## Cloud and Infrastructure
|
|
45
88
|
|
|
@@ -13,8 +13,14 @@ program
|
|
|
13
13
|
.description('Install RTExit into the current project')
|
|
14
14
|
.action(() => installCommand());
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
// When run via npx with no args, auto-trigger install
|
|
17
|
+
const args = process.argv.slice(2);
|
|
18
|
+
const isNpx = process.env.npm_lifecycle_event === undefined && process.env.npm_execpath !== undefined;
|
|
19
|
+
const isDirectRun = args.length === 0;
|
|
17
20
|
|
|
18
|
-
if (
|
|
19
|
-
|
|
21
|
+
if (isDirectRun) {
|
|
22
|
+
// npx rtexit-method OR rtexit → run install directly
|
|
23
|
+
require('./commands/install').installCommand();
|
|
24
|
+
} else {
|
|
25
|
+
program.parse(process.argv);
|
|
20
26
|
}
|