Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Analizando Bankbot, un troyano bancario móvil

entdark
October 06, 2017

Analizando Bankbot, un troyano bancario móvil

entdark

October 06, 2017
Tweet

More Decks by entdark

Other Decks in Research

Transcript

  1. whoami Analista de Malware en Hispasec. ▪ https://medium.com/@entdark_ ▪ http://unaaldia.hispasec.com/

    ▪ http://blog.koodous.com/2017/0 5/bankbot-on-google-play.html @entdark_
  2. ¿Qué es Bankbot? Es un troyano bancario que dispone de

    las siguientes características: Robo de SMS. Envío de dinero. Tracking de la geolocalización vía GPS. Peticionar nuevos permisos en dispositivos. Webinjects remotas. Overlays en aplicaciones target.
  3. ▪ Esta imagen se incluye por defecto en el panel

    de control del troyano. ▪ Todos los que hacen uso del troyano suelen mantener el esquema de imagenes. ▪ El panel no suele sufrir modificaciones, salvo visuales o de seguridad.
  4. Por tan solo 2 euros, los atacantes pueden montar de

    manera sencilla y rápida una infraestructura para el troyano.
  5. Overlays ▪ Android 6.0 bloquea el uso de overlays. ▪

    Esto provoca problemas con aplicaciones legítimas como Facebook Messenger que hacían uso de este para notificar los mensajes. ▪ En Android 6.0.1, Google retiró la medida al estado anterior. ▪ Android O continúa permitiendo los overlays pero bajo los componentes críticos, como el teclado y la barra de estado. (En teoría, estas medidas permitirán al usuario identificar el overlay con mayor facilidad.)
  6. Android Toast ▪ Descubierto por investigadores de Palo Alto ▪

    Afecta a todas las versiones anteriores a Android 8. ▪ Explota Toast, un tipo de notificación que aparece en la pantalla, usada para mostrar mensajes y alertas. ▪ Al no requerir tantos permisos, puede utilizarse para renderizar overlays para mimetizar ventanas.
  7. Mecanismo de infección En caso de haber instalado la aplicación

    pero no haber concedido los permisos necesarios para su ejecución, el troyano continuará solicitando dichos permisos hasta serle concedidos. Sin ellos, no puede realizar su actividad mínima.
  8. if (Build.VERSION.SDK_INT >= 23) { int i = checkCallingOrSelfPermission("android.permission.SEND_SMS"); if

    ((Build.VERSION.SDK_INT >= 23) && (i != 0)) { requestPermissions(new String[] { "android.permission.SEND_SMS", "android.permission.READ_CONTACTS", "android.permission.ACCESS_FINE_LOCATION" }, 1); } }
  9. Mecanismo de infección Entre otros, los permisos que continúa solicitando

    hasta serle concedidos son: ▪ android.permission.SEND_SMS ▪ android.permission.READ_CONTACTS ▪ android.permission.ACCESS_FINE_LOCATION ▪ android.permission.DEVICE_ADMIN
  10. ¿Permisos de administrador? El motivo por el que el troyano

    solicita permisos de administrador es porque sus intenciones son realizar el robo de credenciales mediante overlays.
  11. Envío de datos IMEI, compañía telefónica SERVIDOR REMOTO Versión del

    sistema operativo, país de la víctima, modelo del dispositivo…. ¿Permisos de root? ¿Datos robados? ¿Online? ¿Apps objetivo instaladas?
  12. Robo de datos El troyano detectará que una de las

    aplicaciones objetivo están instaladas en el dispositivo y será comunicado al servidor remoto. Cuando se abra la aplicación, el troyano la “intercepta” y lanzará un overlay sobre la aplicación objetivo.
  13. Targets iniciales... Al ser de procedencia rusa, la lista de

    targets ataca mayormente a entidades del este: • ru.sberbankmobile • ru.sberbank_sbbol • ru.alfabank.* • ru.mw • ua.privatbank • com.ziraat.* • com.tmobtech • com.pozitron • com.akbank.* • tr.com.serkerbilism • com.teb • com.ykb.* • com.garanti.* • biz.mobinex.* • …
  14. Aumento de targets Como es normal, en poco tiempo la

    lista de targets utilizada aumentó y se extendió por Europa, hasta llegar a España. Las aplicaciones de entidades tales como Popular, BBVA, Santander, Kutxabank se vieron afectadas por esta serie de ataques. Sin embargo, tenían que diseñar los overlays de cada aplicación individualmente, lo cual ralentiza y dificulta la posibilidad de crear overlays con gran similaridad en un corto periodo de tiempo.
  15. Obtención de la lista de targets La lista de targets

    inicial estaba hardcodeada en el código fuente del troyano y contaba con un switch con el nombre de los paquetes sobre los que actuar. Esto permite la fácil identificación de las entidades afectadas. if (packagename.equals(“ru.sberbankmobile”)) { ... }
  16. Obtención de la lista de targets Más adelante, la lista

    de webinjects pasa a ser dinámica. El APK no contiene información acerca de las entidades afectadas, y algunas veces tampoco del Command & Control a simple vista. Estos injects utilizan un formato XML, fácilmente localizable en los datos privados de la aplicación.
  17. Targets Posteriormente, uno de los atacantes decidió modificar el código

    y una vez obtenido el acceso root, el artefacto obtenía la lista de marcadores del navegador del usuario. Si en dicha lista de marcadores se encontraba alguna de las entidades objetivo, se lanzaba un overlay sobre el navegador correspondiente a dicha entidad. Sin embargo, se han avistado muy pocos en comparación.
  18. JNI Para evitar ser detectados al examinar los archivos .dex,

    algunos atacantes probaron trasladando parte del código a librerías ejecutadas vía JNI. • Arm64-v8a • armeabi • armeabi-v7a
  19. JNI Al buscar en el decompilado del .dex no podemos

    encontrar el C&C remoto. Sin embargo, al echarle un ojo a las librerías si podemos obtener información más clara. El atacante ocultó el C&C remoto en dicha librería.
  20. JNI Encontramos una función utilizada para el envío de datos

    por POST. Previamente, comprueba que el C&C responda para así realizar la petición con seguridad.
  21. JNI Contamos con otra función, getProc() para obtener información de

    /proc A través de por ejemplo, /proc/cmdline se puede obtener información como el estado actual de kernel R-O
  22. JNI send_sms ejecuta por debajo una llamada a /android/telephony/SmsManager/ y

    a través de sendTextMessage realiza el envío de mensajes. https://developer.android.com/referen ce/android/telephony/gsm/SmsMana ger.html
  23. JNI Esta estrategia no solo les permitió (muy levemente) ocultar

    un poco de información. Los antivirus tuvieron un notable descenso en las detecciones.
  24. Backend Cuando se liberó la botnet, el código contaba con

    el componente server-side permitiendo a aquellos que descarguen la aplicación montar su propia botnet. Muchos de los que lo hicieron al principio, descuidaron la seguridad de la instalación, permitiendo descargar la totalidad de los componentes del servidor.
  25. C&C El panel por defecto nos muestra la siguiente información:

    ✓ IMEI ✓ Estado de la ROM ✓ Versión de Android ✓ Versión del APK instalado ✓ Estado del dispositivo ✓ Fecha de infección ✓ Información recolectada del usuario.
  26. Componentes ▪ add_inj.php ▪ add_log.php ▪ commands.php ▪ config.php ▪

    crypt.php ▪ kliets.php ▪ tuk_tuk.php ▪ set_data.php
  27. Comunicaciones Comunicaciones cifradas utilizando su propia rutina, cuentan con una

    clave en el lado del servidor y en el cliente. Ejemplo: <tag>37 55 67 78 79 37 55 67</tag>
  28. <form action="/private/add_inj.php?p=5w 53 56 53 5w 55 48 5e 55

    54 54 53 55 48 55 37 55 67 37 68 48 37 57 7q 37 68 49 37 56 48 7 68 48 37 66 56 37 68 48 37 66 5q 37 68 48 37 66 48 37 68 49 37 56 5q 5q 5e 37 55 67"method="post"id="mf"name="mf"onsubmit="return true"> <input type="tel" value="+380" placeholder="Логин" id="privat24-login" name="privat24_login" maxlength="13"> <input placeholder="Пароль" id="privat24-password" name="privat24_password"> <input placeholder="ПИН-код любой вашей карты ПриватБанк" id="privat24-pin" name="privat24_pin"> <button class="btn btn-success mb"onclick="send_info()"style="">ВОЙТИ</button>
  29. Cifrado function encrypt(string, key) //шифрование траффа логов str = urlencode(string)

    ret = "" for(i=0 i<mb_strlen(str) i++) r1 = ord(mb_substr(str, i, 1)) ret = "ret r1" for(i=0 i<mb_strlen(key) i++) ret = str_replace(i, mb_substr(key, i, 1), ret) ret = mb_substr(ret, 1, mb_strlen(ret)) //! return ret
  30. Google Play En enero de 2017, se encuentran los primeros

    Bankbot’s que habían logrado con éxito introducirse en la Play Store.
  31. Dropper workflow ¿Se pueden instalar aplicaciones de terceros? Solicitar al

    usuario habilitar “orígenes desconocidos” Descargar el malware real a la tarjeta SD Malware no se activa Mostrar el diálogo de instalación al usuario ¿ÉXITO? SÍ NO NO NO SI SÍ Siguiente reinicio...