12 agosto 2014

Alterando el contenido de un APK (parte 1 de 2)

Al igual que en otras plataformas móviles, Android dispone de múltiples alternativas a su market oficial Google Play:
  1. Markets alternativos donde los desarrolladores publican aplicaciones gratuitas y de pago como el de Amazon y Slideme
  2. Black markets donde se ofrecen aplicaciones de pago de forma gratuita como AndroidBlackMarket y BlackMart Alpha
  3. Múltiples foros y otras comunidades donde los usuarios publican aplicaciones propias, retiradas de otros markets y/o crackeadas
El problema de las alternativas (al igual que el del propio Google Play), son los excasos e incluso nulos mecanismos de control a los que se someten las aplicaciones que son publicadas permitiendo así la aparición de todo tipo de malware.
Cuanto más laxos sean estos mecanismos de control, más se delega en el usuario final la responsabilidad de la instalación:


En este primer artículo vamos a ver lo sencillo que es generar un troyano que podríamos encontrarnos publicado "as is" en cualquier de los canales alternativos citados (especialmente en los casos 2 y 3), para en el siguiente artículo centrarnos en utilizar este conocimiento para inyectar el troyano alterando una aplicación ya existente.

El usuario final, a veces incauto, siempre desprotegido


Sea cual sea el canal alternativo de descarga de apps que elijamos estaremos obligados a habilitar en Ajustes la característica Orígenes desconocidos, la cual permitirá la instalación de aplicaciones a través de canales alternativos a Google Play:


Una vez activada esta opción podremos instalar cualquier APK que descarguemos:


Y con esta última captura re-afirmamos la opción que acabamos de habilitar: Cuando se instala un APK descargado no se presenta al usuario información sobre quién ha firmado el APK que estamos instalando, de modo que dadas dos aplicaciones twitter.apk y twitter-modificado.apk, no podríamos determinar durante la instalación cuál de ellas es original y cuál no.


Diseccionando el payload Meterpreter de Android


Entremos en faena, vamos a comenzar creando un troyano utilizando la herramienta msfpayload:


Utilizando las herramienta dex2jar y jd-gui podemos ver el contenido del APK generado:

1. En el arranque invocará al método startWithContext de la clase Payload:



2. EL método startWithContext ubicado en la clase Payload realizará una serie de llamadas internas de forma asíncrona para descargar e instalar la siguiente fase del ataque:


3. En mi caso se ejecutará el siguiente método al haber generado el payload reverse_tcp. Como se puede ver, se ha incrustado dentro del código las variables que definimos en el momento de hacer msfpayload desde la consola:


4. Con la conexión establecida en el paso 3, se descargará el código de Meterpreter y se cargará de forma dinámica invocándose a su método Start


5. En este punto ya podemos probar el APK que hemos generado, para ello basta con poner a la escucha el exploit multi/handler de Metasploit:


6. Y conseguir que un usuario instale y ejecute la aplicación en su dispositivo Android:


Como se puede ver la aplicación solicitará bastante permisos para poder explotar al máximo las posibilidades de Meterpreter, y si finalmente el incauto usuario la instala y ejecuta, veremos como se inicia la sesión en la consola de Metasploit:



En resumen hemos visto que:
  • Generar un APK con Meterpreter incluido es trivial utilizando la herramienta msfpayload
  • La simpleza del código generado, aislando en una única clase todo el código necesario para descargar y cargar la sesión vía Meterpreter a través de la invocación de un sólo método.

Visto esto estamos listos para el siguiente artículo: alterar una aplicación ya existente para inyectarle este Meterpreter.

Artículo cortesía de Miguel Ángel García

4 comments :

Adrián Ruiz dijo...

Buen artículo!


Para extenderlo, hice una herramienta que "bindea" apks y está alineado con el artículo.


https://github.com/funsecurity/apk_binder_script


saludos,

Miguel Ángel García dijo...

Muy interesante la herramienta Adrián!, te has adelantado a mi próximo artículo, ya lo verás ^^.


Por cierto, ha quedado muy políticamente correcto eso de implementar puertas "administrativas" jejeje, me gusta.

maymaster dijo...

excelente articulo espero con muchas ancias la parte 2 :)

0xroot dijo...

Esto que comentas de unificar dos APKs, acabarás encontrando bastantes problemas si la aplicación tiene implementadas medidas anti-tampering, por decir algo.


Si quieres una opinión, lo mejor que puedes hacer es portar todo esto con xposed framework o cydia substrate :). Así de paso te codeas también algo que haga un bypass de las comprobaciones a nivel de packageManager.