Translated ['', 'src/mobile-pentesting/android-app-pentesting/android-an

This commit is contained in:
Translator 2025-09-29 12:18:22 +00:00
parent b6dcff8811
commit 65ed6d47db

View File

@ -2,30 +2,30 @@
{{#include ../../banners/hacktricks-training.md}}
Αυτή η σελίδα παρέχει μια πρακτική ροή εργασίας για να ανακτήσετε τη dynamic analysis ενάντια σε Android apps που ανιχνεύουν/rootμπλοκάρουν instrumentation ή επιβάλλουν TLS pinning. Εστιάζει στην ταχεία αξιολόγηση, στις κοινές ανιχνεύσεις και σε copypasteable hooks/tactics για να τα παρακάμψετε χωρίς repacking όταν είναι δυνατόν.
Αυτή η σελίδα παρέχει μια πρακτική ροή εργασίας για να ανακτήσετε τη δυναμική ανάλυση σε Android εφαρμογές που ανιχνεύουν/αποκλείουν instrumentation ή επιβάλλουν TLS pinning. Εστιάζει σε ταχεία αξιολόγηση, κοινούς ανιχνευτικούς ελέγχους, και copypasteable hooks/tactics για να τα παρακάμψετε χωρίς repacking όταν είναι εφικτό.
## Detection Surface (what apps check)
- Έλεγχοι root: su binary, Magisk paths, getprop values, common root packages
- Root checks: su binary, Magisk paths, getprop values, common root packages
- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
- Native antidebug: ptrace(), syscalls, antiattach, breakpoints, inline hooks
- Έλεγχοι πρώιμης εκκίνησης: Application.onCreate() ή hooks κατά την εκκίνηση της διεργασίας που κάνουν crash αν υπάρχει instrumentation
- Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
## Step 1 — Quick win: hide root with Magisk DenyList
- Ενεργοποιήστε Zygisk στο Magisk
- Ενεργοποιήστε το DenyList, προσθέστε το target package
- Επανεκκινήστε και επανελέγξτε
- Enable Zygisk in Magisk
- Enable DenyList, add the target package
- Reboot and retest
Πολλές εφαρμογές κοιτάνε μόνο για προφανείς ενδείξεις (su/Magisk paths/getprop). Το DenyList συχνά εξουδετερώνει τους απλοϊκούς ελέγχους.
Πολλές εφαρμογές ψάχνουν μόνο για προφανείς ενδείξεις (su/Magisk paths/getprop). Το DenyList συχνά εξουδετερώνει τους απλοϊκούς ελέγχους.
References:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
## Step 2 — 30second Frida Codeshare tests
Δοκιμάστε κοινά dropin scripts πριν προχωρήσετε σε βαθύτερη ανάλυση:
Δοκιμάστε έτοιμα dropin scripts πριν προχωρήσετε σε βαθύτερη ανάλυση:
- anti-root-bypass.js
- anti-frida-detection.js
@ -35,13 +35,13 @@ Example:
```bash
frida -U -f com.example.app -l anti-frida-detection.js
```
Αυτά συνήθως αντικαθιστούν (stub) Java root/debug checks, process/service scans και native ptrace(). Χρήσιμα σε lightly protected apps· hardened targets μπορεί να χρειάζονται tailored hooks.
Συνήθως κάνουν stub Java root/debug ελέγχους, process/service σαρώσεις και native ptrace(). Χρήσιμα σε ελαφρώς προστατευμένες εφαρμογές· hardened targets μπορεί να χρειαστούν tailored hooks.
- Codeshare: https://codeshare.frida.re/
## Αυτοματοποιήστε με Medusa (Frida framework)
Το Medusa παρέχει 90+ έτοιμα modules για SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception και άλλα.
Medusa παρέχει 90+ έτοιμα modules για SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, και άλλα.
```bash
git clone https://github.com/Ch0pin/medusa
cd medusa
@ -56,38 +56,38 @@ run com.target.app
```
Συμβουλή: Το Medusa είναι εξαιρετικό για γρήγορες νίκες πριν γράψετε custom hooks. Μπορείτε επίσης να cherry-pick modules και να τα συνδυάσετε με τα δικά σας scripts.
## Βήμα 3 — Παράκαμψη των init-time detectors με σύνδεση αργότερα
## Βήμα 3 — Παράκαμψη init-time detectors με attaching αργότερα
Πολλές ανιχνεύσεις τρέχουν μόνο κατά το process spawn/onCreate(). Η spawntime injection (-f) ή τα gadgets εντοπίζονται· η σύνδεση μετά τη φόρτωση του UI μπορεί να περάσει απαρατήρητη.
Πολλές ανιχνεύσεις τρέχουν μόνο κατά τη διάρκεια του process spawn/onCreate(). Η Spawntime injection (-f) ή gadgets εντοπίζονται· το attaching μετά το φόρτωμα του UI μπορεί να περάσει απαρατήρητο.
```bash
# Launch the app normally (launcher/adb), wait for UI, then attach
frida -U -n com.example.app
# Or with Objection to attach to running process
aobjection --gadget com.example.app explore # if using gadget
```
Αν αυτό λειτουργήσει, κράτησε τη συνεδρία σταθερή και προχώρα στη χαρτογράφηση και στους ελέγχους των stubs.
Αν αυτό λειτουργήσει, διατήρησε τη συνεδρία σταθερή και προχώρα σε map και stub checks.
## Βήμα 4 — Χαρτογράφησε τη λογική ανίχνευσης μέσω Jadx και αναζήτησης συμβολοσειρών
## Step 4 — Χαρτογράφησε τη λογική ανίχνευσης μέσω Jadx και string hunting
Στατικές λέξεις-κλειδιά στο Jadx:
Στατικές λέξεις-κλειδιά για triage στο Jadx:
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
Τυπικά μοτίβα Java:
Τυπικά Java patterns:
```java
public boolean isFridaDetected() {
return getRunningServices().contains("frida");
}
```
Συνηθισμένα APIs προς review/hook:
Συνηθισμένα APIs προς αναθεώρηση/hook:
- android.os.Debug.isDebuggerConnected
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
- java.lang.System.loadLibrary / System.load (γέφυρα εγγενούς κώδικα)
- java.lang.Runtime.exec / ProcessBuilder (εντολές ανίχνευσης)
- android.os.SystemProperties.get (ευριστικές για root/emulator)
- java.lang.System.loadLibrary / System.load (native bridge)
- java.lang.Runtime.exec / ProcessBuilder (probing commands)
- android.os.SystemProperties.get (root/emulator heuristics)
## Βήμα 5 — Runtime stubbing with Frida (Java)
## Βήμα 5 — Runtime stubbing με Frida (Java)
Override custom guards για να επιστρέφουν safe values χωρίς repacking:
Παράκαμψε custom guards για να επιστρέφουν ασφαλείς τιμές χωρίς repacking:
```js
Java.perform(() => {
const Checks = Java.use('com.example.security.Checks');
@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager');
AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); };
});
```
Αναλύετε πρώιμες καταρρεύσεις; Dump classes λίγο πριν καταρρεύσει για να εντοπίσετε πιθανές detection namespaces:
Αν διαχειρίζεστε πρώιμα crashes, κάντε dump των classes λίγο πριν τερματίσει για να εντοπίσετε πιθανές detection namespaces:
```js
Java.perform(() => {
Java.enumerateLoadedClasses({
@ -119,7 +119,7 @@ RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {}
});
Καταγράψτε και ουδετεροποιήστε ύποπτες μεθόδους για να επιβεβαιώσετε τη ροή εκτέλεσης:
Καταγράψτε και αδρανοποιήστε ύποπτες μεθόδους για να επιβεβαιώσετε τη ροή εκτέλεσης:
```js
Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
@ -131,9 +131,9 @@ return false;
```
## Bypass emulator/VM detection (Java stubs)
Συνηθισμένες ευρετικές μέθοδοι: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE που περιέχουν generic/goldfish/ranchu/sdk; QEMU artifacts όπως /dev/qemu_pipe, /dev/socket/qemud; προεπιλεγμένη MAC 02:00:00:00:00:00; 10.0.2.x NAT; έλλειψη τηλεφωνίας/αισθητήρων.
Κοινές ευρετικές μέθοδοι: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE που περιέχουν generic/goldfish/ranchu/sdk; QEMU ίχνη όπως /dev/qemu_pipe, /dev/socket/qemud; προεπιλεγμένη διεύθυνση MAC 02:00:00:00:00:00; 10.0.2.x NAT; έλλειψη τηλεφωνίας/αισθητήρων.
Γρήγορο spoof των Build fields:
Γρήγορο spoof των πεδίων Build:
```js
Java.perform(function(){
var Build = Java.use('android.os.Build');
@ -143,11 +143,11 @@ Build.BRAND.value = 'google';
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
});
```
Συμπληρώστε με stubs για ελέγχους ύπαρξης αρχείων και για αναγνωριστικά (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) ώστε να επιστρέφουν ρεαλιστικές τιμές.
Συμπλήρωσε με stubs για ελέγχους ύπαρξης αρχείων και αναγνωριστικά (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) ώστε να επιστρέφουν ρεαλιστικές τιμές.
## SSL pinning bypass quick hook (Java)
Αδρανοποιήστε προσαρμοσμένους TrustManagers και εξαναγκάστε permissive SSL contexts:
Αδρανοποίησε custom TrustManagers και εξανάγκασε permissive SSL contexts:
```js
Java.perform(function(){
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
@ -165,17 +165,17 @@ return SSLContextInit.call(this, km, TrustManagers, sr);
};
});
```
Σημειώσεις
- Επεκτείνετε για OkHttp: hook okhttp3.CertificatePinner και HostnameVerifier όπως χρειάζεται, ή χρησιμοποιήστε ένα universal unpinning script από CodeShare.
Notes
- Επέκτεινε για OkHttp: hook okhttp3.CertificatePinner and HostnameVerifier όπως απαιτείται, ή χρησιμοποίησε ένα universal unpinning script από CodeShare.
- Παράδειγμα εκτέλεσης: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
## Βήμα 6 — Ακολουθήστε το JNI/native μονοπάτι όταν τα Java hooks αποτύχουν
## Step 6 — Ακολούθησε το JNI/native μονοπάτι όταν τα Java hooks αποτυγχάνουν
Ιχνηλατήστε τα σημεία εισόδου JNI για να εντοπίσετε native loaders και detection init:
Ιχνηλάτησε τα JNI entry points για να εντοπίσεις native loaders και detection init:
```bash
frida-trace -n com.example.app -i "JNI_OnLoad"
```
Γρήγορη native triage των bundled .so files:
Γρήγορη εγγενής αξιολόγηση των συσκευασμένων αρχείων .so:
```bash
# List exported symbols & JNI
nm -D libfoo.so | head
@ -186,7 +186,7 @@ strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
Παράδειγμα: Αδρανοποιήστε ptrace για να παρακάμψετε απλό antidebug στο libc:
Παράδειγμα: εξουδετέρωση ptrace για να παρακάμψετε απλό antidebug στο libc:
```js
const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) {
@ -202,22 +202,22 @@ reversing-native-libraries.md
## Βήμα 7 — Objection patching (embed gadget / strip basics)
Όταν προτιμάτε το repacking από τα runtime hooks, δοκιμάστε:
Όταν προτιμάτε repacking αντί για runtime hooks, δοκιμάστε:
```bash
objection patchapk --source app.apk
```
Σημειώσεις:
- Απαιτεί apktool· βεβαιωθείτε ότι έχετε μια ενημερωμένη έκδοση από τον επίσημο οδηγό για να αποφύγετε προβλήματα build: https://apktool.org/docs/install
- Το Gadget injection επιτρέπει instrumentation χωρίς root, αλλά μπορεί να εντοπιστεί από ισχυρότερους inittime checks.
- Απαιτεί apktool· βεβαιώσου ότι έχεις μια τρέχουσα έκδοση από τον επίσημο οδηγό για να αποφύγεις προβλήματα στο build: https://apktool.org/docs/install
- Το Gadget injection επιτρέπει instrumentation χωρίς root, αλλά μπορεί ακόμα να εντοπιστεί από πιο αυστηρούς inittime ελέγχους.
Προαιρετικά, προσθέστε LSPosed modules και Shamiko για πιο ισχυρό root hiding σε περιβάλλοντα Zygisk, και επιμεληθείτε τη DenyList ώστε να καλύπτει child processes.
Προαιρετικά, πρόσθεσε LSPosed modules και Shamiko για καλύτερη απόκρυψη root σε περιβάλλοντα Zygisk, και διαμόρφωσε τη DenyList ώστε να καλύπτει child processes.
Αναφορές:
- Objection: https://github.com/sensepost/objection
## Step 8 — Εφεδρική λύση: Patch TLS pinning για ορατότητα δικτύου
## Βήμα 8 — Fallback: Patch TLS pinning για ορατότητα δικτύου
Αν το instrumentation μπλοκαριστεί, μπορείτε ακόμα να ελέγξετε την κίνηση αφαιρώντας το pinning στατικά:
Εάν instrumentation μπλοκάρεται, μπορείς ακόμα να επιθεωρήσεις την κίνηση αφαιρώντας το pinning στατικά:
```bash
apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
@ -233,7 +233,7 @@ make-apk-accept-ca-certificate.md
install-burp-certificate.md
{{#endref}}
## Χρήσιμη λίστα εντολών
## Χρήσιμη σύνοψη εντολών
```bash
# List processes and attach
frida-ps -Uai
@ -251,12 +251,30 @@ objection --gadget com.example.app explore
# Static TLS pinning removal
apk-mitm app.apk
```
## Συμβουλές & προειδοποιήσεις
## Καθολική επιβολή proxy + TLS unpinning (HTTP Toolkit Frida hooks)
- Προτιμήστε το attaching αργότερα αντί του spawning όταν οι apps crash κατά την εκκίνηση
- Ορισμένες detections επανεκτελούνται σε κρίσιμες ροές (π.χ., payment, auth) — κρατήστε τα hooks ενεργά κατά την πλοήγηση
- Συνδυάστε static και dynamic: string hunt στο Jadx για να shortlistάρετε κλάσεις· στη συνέχεια κάντε hook σε methods για να επαληθεύσετε σε runtime
- Εφαρμογές με hardening μπορεί να χρησιμοποιούν packers και native TLS pinning — περιμένετε να reverse native code
Οι σύγχρονες εφαρμογές συχνά αγνοούν τα system proxies και εφαρμόζουν πολλαπλά επίπεδα pinning (Java + native), καθιστώντας την καταγραφή του traffic δύσκολη ακόμα και με τα user/system CAs εγκατεστημένα. Μια πρακτική προσέγγιση είναι να συνδυάσετε universal TLS unpinning με proxy forcing μέσω έτοιμων Frida hooks και να δρομολογήσετε τα πάντα μέσω mitmproxy/Burp.
Ροή εργασίας
- Τρέξτε mitmproxy στον host σας (ή Burp). Βεβαιωθείτε ότι η συσκευή μπορεί να φτάσει στο host IP/port.
- Φορτώστε τα ενοποιημένα Frida hooks του HTTP Toolkit για να εφαρμόσετε TLS unpinning και να επιβάλετε χρήση proxy σε κοινές στοίβες (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, κ.λπ.). Αυτό παρακάμπτει τους ελέγχους CertificatePinner/TrustManager και αντικαθιστά τους proxy selectors, έτσι ώστε το traffic να στέλνεται πάντα μέσω του proxy σας ακόμη κι αν η εφαρμογή απενεργοποιεί ρητά τους proxies.
- Ξεκινήστε την target app με Frida και το hook script, και καταγράψτε τα requests στο mitmproxy.
Παράδειγμα
```bash
# Device connected via ADB or over network (-U)
# See the repo for the exact script names & options
frida -U -f com.vendor.app \
-l ./android-unpinning-with-proxy.js \
--no-pause
# mitmproxy listening locally
mitmproxy -p 8080
```
Σημειώσεις
- Συνδυάστε με έναν proxy σε επίπεδο συστήματος μέσω `adb shell settings put global http_proxy <host>:<port>` όταν είναι δυνατό. Τα Frida hooks θα επιβάλλουν τη χρήση του proxy ακόμα και όταν οι εφαρμογές παρακάμπτουν τις global ρυθμίσεις.
- Αυτή η τεχνική είναι ιδανική όταν χρειάζεται να κάνετε MITM σε διαδικασίες onboarding mobile→IoT όπου το pinning/η αποφυγή proxy είναι συνηθισμένα.
- Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning
## Αναφορές