miércoles, 12 de marzo de 2014

Anuncios en moviles para hacer creer que estamos infectados

Dentro de las familias de malware, conocemos los "scamware" que te avisan que tu sistema esta infectado con malware y te proponen un antivirus gratuito que es en realidad un malware. Pero también se usan los anuncios en páginas legítimas con el objeto de instalarnos una aplicación maliciosa. Vamos a analizar un caso reciente que hemos encontrado para Android .

La semana pasada mirando un periódico francés muy famoso, se mostró un "popup" en mi pantalla recomendándome instalar un "cleaner" para limpiar mi móvil. La primera vez el popup estaba en inglés, tras pulsar el botón "Cancelar" se mostró el mismo popup pero esta vez en español (curiosamente no en francés).


Quizás pensaban que no entendía el ingles y que con el español tendrían más éxito. Pero no quería instalar este software. Al pulsar "Cancelar", automáticamente me redireccionó a otra pagina con una ventana que quería aparentar un mensaje de aviso de Android OS como la siguiente:


Parece que esperaba tener más éxito imitando la interfaz grafica de Android OS, para hacer creer al usuario que realmente está infectado. Al pulsar sobre cualquier parte del mensaje, redireccionaba a GooglePlay.
  

Vamos a analizar como hemos llegado a Google Play desde el periódico francés. Cuando el navegador de Android carga la pagina del periódico descarga un anuncio con la petición HTTP siguiente:

GET /ttj?
id=1028520&size=1000x300&promo_sizes=970x250,1000x90,970x90,728x90&promo_alignment=center&referrer=pagina.fr&cb=7741390030&pt1=http://ww14.smartadserver.com/call/pubj/252/82917/225/S/9665235358/origine%3Dasq? HTTP/1.1
Host: ib.adnxs.com
Referer: http://www.pagina.fr/

Vemos que recoge el anuncio del sitio web "ib.adnxs.com" para recibir el anuncio de otro servidor "http://ww14.smartadserver.com/call/pubj/252/82917/225/S/9665235358/origine%3Dasq?". El servidor responde con un código JavaScript ofuscado:

document.write('<a id=\"banner\" target=\"_blank\" href=\"http://fra1.ib.adnxs.com/click?Z2ZmZmZm2j8TYcPTK-XYPwAAAAAAAPA_E2HD0yvl2D9mZmZmZmbaP0LmHtvClCBBSI_mp8QbEgiuixlTAAAAAKixDwBIBgAAmQcAAAIAAAA9L8UA-8YCAAAAAQBVU0QARVVSANgCWgDVjlUFyYwAAgUCAQUAAIoAayUAdgAAAAA./cnd=%21aQaHPQin5MQBEL3elAYY-40LIAA./referrer=pagina.fr/clickenc=http%3A%2F%2Fsofcotrk.com%2Fmt%2Fv2b4x234d4t233s244u2u2%2F%26subid1%3Dfra1CMiemr_K-IaJCBACGMLM-9itmKWQQSINNjIuMTUuMjMwLjE2NCgBMK6X5pgF\"><img src=\"http://cdn.adnxs.com/p/b7/ed/ba/90/b7edba903816d39881e9db7acabab42b.jpeg\" border=\"0\" /></a>\r\n<scr'+'ipt type=\"text/javascript\">eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!\'\'.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return\'\\\\w+\'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c])}}return p}(\'5 2=[\"g\",\"f\",\"h\",\"i\"],7=j.e.c(),4=9;8(5 d=0;d<2.a;d++){3(7.b(2[d])!=-1){4=l}}3(4){3(y(\"6 u t 8 o n m 6 p!\")){q.s.r=v.x(\"k\").w}}\',35,35,\'||mobiles|if|ismobile|var|Clean|uagent|for|false|length|indexOf|toLowerCase||userAgent|ipod|iphone|ipad|android|navigator|banner|true|with|now|FREE|Master|window|location|top|Android|your|document|href|getElementById|confirm\'.split(\'|\'),0,{}));</scr'+'ipt>\r\n    ');document.write('<scr'+'ipt type="text/javascript" src="http://pixel.alephd.com/post_asq?LgDc=&L4DK=285147&rZzC=&aNVl=1&ZzpC=&Dsph=&Hsyz=440&0ZGY=12922685&Xyes=&iK5S=&b6lE=0.1385&-tgi=-1&wziz=1&vKcZ=4692914376340858434&2jSB=0.4125&-Zu8=8613&e9iH=581557833328660296&b5ho=class_1&GAa8=1028520&DH5k=62.15.230.164&8rSZ=&-Z06=0.4125"></scr'+'ipt>');document.write('<scr' + 'ipt src="http://cdn.adnxs.com/ANX_async_usersync.js"></scr'+'ipt>');

Con http://jsunpack.com/, hemos descifrado la función siguiente. Dentro de la página del anuncio, hay un código JavaScript que busca la presencia de la cadena "android" en el "user-agent". El "user-agent" forma parte de las peticiones http y permite identificar el navegador del usuario (incluyendo versión y sistema operativo) para que el servidor muestre las paginas mas adecuadas para él. El anuncio se sirve de esto mismo para comprobar si el usuario visita la pagina con un dispositivo Android. En tal caso, se muestra automáticamente un "popup" con el mensaje en ingles "Clean your Android for FREE now with Clean Master!". Si el usuario está de acuerdo, se le redirecciona a Google Play.

Mostramos el código desofuscado:

href = “http://fra1.ib.adnxs.com/click?...”
var mobiles=["iphone","ipod","ipad","android"],
uagent=navigator.userAgent.toLowerCase(),
ismobile=false;
for(var d=0;d<mobiles.length;d++){
   if(uagent.indexOf(mobiles[d])!=-1)
   {
      ismobile=true
   }
}

if(ismobile)
{
   if(confirm("Clean your Android for FREE now with Clean Master!"))
   {
      window.top.location=document.getElementById("banner").href
   }
}

En caso contrario, la página web hace una nueva petición HTTP al servidor de anuncios:

GET /ttj?
id=1028475&size=300x1050&promo_sizes=300x1000,300x900,300x600,300x250&promo_alignment=center&referrer=pagina.fr&cb=7296786274&pt1=http://ww14.smartadserver.com/call/pubj/252/82917/163/S/9665235358/origine%3Dasq? HTTP/1.1
Host: ib.adnxs.com
Referer: http://www.pagina.fr/
Accept: */*
X-Requested-With: com.android.browser
User-Agent: Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/JB_MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

Se abre la misma ventana esta vez con el mensaje en español. Al pulsar sobre "Cancelar",  la página web hace otra petición HTTP al servidor de anuncios:

GET /ttj?
id=1029172&size=300x600&promo_sizes=300x250&promo_alignment=center&referrer=pagina.fr&cb=6542638935&pt1=http://ww14.smartadserver.com/call/pubj/252/82917/828/S/9665235358/origine%3Dasq? HTTP/1.1
Host: ib.adnxs.com
Referer: http://www.----------.fr/
Accept: */*
X-Requested-With: com.android.browser
User-Agent: Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/JB_MR1) AppleWebKit/534.30

El servidor responde con el siguiente contenido:

document.write('<iframe frameborder="0" width="300" height="250" marginheight="0" marginwidth="0" target="_blank" scrolling="no" src="http://pureads.com-trckr.co/c2/300_46555/"> </iframe>');
document.write('<scr'+'ipt type="text/javascript" src="http://pixel.alephd.com/post_asq?LgDc=&L4DK=285145&rZzC=&aNVl=1&ZzpC=&Dsph=&Hsyz=440&0ZGY=11836032&Xyes=&iK5S=&b6lE=0.1385&-tgi=-1&wziz=1.236&vKcZ=4241021722314788001&2jSB=0.181413&-Zu8=8613&e9iH=581557833328660296&b5ho=class_1&GAa8=1029172&DH5k=62.15.230.164&8rSZ=&-Z06=0.181413"></scr'+'ipt>');document.write('<scr' + 'ipt src="http://cdn.adnxs.com/ANX_async_usersync.js"></scr'+'ipt>');

Abriendo un iframe, el navegador carga la pagina alojada en "http://pureads.com-trckr.co/c2/300_46555/". Tenemos otro código en JavaScript que comprueba de nuevo si el usuario usa un dispositivo móvil. En cuyo caso, le redirecciona a la pagina "http://k5lme.trackvoluum.com/2d9c041a-48b3-44d8-b601-0c8cabafd377". Que a su vez, redirecciona a "http://mobilesecurity.com-trckr.co/warning/...". Mostramos el código del iframe:

<a id="banner" target="_blank" href="http://k5lme.trackvoluum.com/2d9c041a-48b3-44d8-b601-0c8cabafd377"><img src="https://pureads.com-trckr.co/im/300s.jpg" border="0" /></a>

<script type="text/javascript">
var mobiles = ['android'];
var uagent = navigator.userAgent.toLowerCase();
var ismobile = false;
for (var d=0;d<mobiles.length;d++) {
  if (uagent.indexOf(mobiles[d]) != -1) {
    ismobile = true;
  }
}
if (ismobile) {
     window.top.location = document.getElementById('banner').href;
}

Han creado un dominio que se llama "http://mobilesecurity.com-trckr.co" para aparentar venir de una entidad de seguridad. Al pulsar sobre la imagen, redirecciona finalmente a Google Play. Es muy importante hacer notar que la pagina "http://k5lme.trackvoluum.com/2d9c041a-48b3-44d8-b601-0c8cabafd377" (el servidor de publicidad) devuelve páginas diferentes (distintos anuncios) según el momento del día.

Hemos visto un anuncio que se parece a un ataque. El problema es que los sitios web (o las aplicaciones) contratan servicios de terceros para la publicidad, pero no tienen ningún control sobre los métodos usados para ofrecer los anuncios. Lo que puede afectar a la imagen directa del sitio web, como en este caso el periódico francés. Pensamos que los atacantes pueden aprovecharse de esos terceros servicios para infectar los dispositivos móviles. Ademas con los anuncios que cambia cada x minutos, seria muy difícil de encontrar la fuente de infección.

Desde luego no es la primera vez que encontramos como una página legítima intenta infectarnos a través del servidor de anuncios. Ya en el 2005 nos encontramos como "Dilbert intentaba infectarnos" En aquella ocasión, al visitar la (muy recomendable) tira cómica diaria de Dilbert aparecía una ventana emergente donde se informaba de errores de registro o del sistema de archivos. Obviamente era falsa, pues (en aquella ocasión) aparecía el mismo aviso independientemente del sistema operativo con que se visitara.


Laurent Delosières
ldelosieres@hispasec.com

martes, 4 de marzo de 2014

Un Rootkit para Android

En el departamento antifraude hemos analizado un troyano Android que envía SMS premium y hemos encontrado una rutina muy interesante para ocultarse al usuario. Para ello, cuando la aplicación se ejecuta por primera vez, el icono de la aplicación desaparece de la lista de aplicaciones mientras que la aplicación sigue ejecutándose en segundo plano. Por eso, podemos clasificar este troyano como rootkit a nivel del usuario. Hemos usado DEXInspector para hacer ingeniería inversa sobre el.

Cuando la aplicación se ejecuta, se llama a la función "onCreate" (mostrada abajo). En primer lugar, invoca una clase denominada "Utilities" que contiene funciones para instalar aplicaciones Android, mover archivos, etc. Posteriormente va a usar esta misma clase para quitar el icono ejecutando la función "iconRemoval" e instalar otra aplicación que se llama "GrandThieftAuto3-Uncut-v1.3.apk" que se encuentra en la carpeta "assets". Finalmente ejecutará la parte maliciosa a partir de la clase "com.example.smsmessaging.TestService" para recoger los números SMS premium y enviarlos de manera periódica.


Reconstruyendo la función "iconRemoval" en alto nivel (el código desensamblado en Dalvik está abajo) obtenemos el siguiente código, que es sencillo:

 packageManager = getPackageManager()
 packageManager.setComponentEnabledSetting(componentToDisable, 0x2, 0x1)


En primer lugar, el malware obtiene una instancia del gestor de paquetes para tener acceso a los paquetes instalados y luego va a cambiar el estado de su propio componente. Para ello, usa la función "setComponentEnabledSetting" pasándole el nombre de su componente; su nuevo estado, 0x2, que se corresponde con COMPONENT_ENABLED_STATE_DISABLED lo que permite desactivar el componente de la interfaz gráfica (com.example.smsmessaging.Main) y 0x1 que corresponde a DONT_KILL_APP para que la aplicación siga funcionando en segundo plano. Sin embargo no se desactiva el componente responsable de la ejecución en segundo plano (com.example.smsmessaging.TestService).

Abajo vemos dos capturas con el antes y después de la ocultación del troyano que se llama "GamerPluskit".

  Antes de ocultar el icono                                                                  Después de ocultar el icono

Por supuesto, el malware necesita el permiso
"android.permission.CHANGE_COMPONENT_ENABLED_STATE". En otras palabras, el usuario debería sospechar cuando un programa requiere dicho permiso. Sin embargo hemos probado en Jelly Beans sin ese permiso y funciona.

Para persistir al reinicio, el malware se registra al evento "BOOT_COMPLETED" que le permite ejecutarse cuando Android arranca. En efecto, el troyano solo había desactivado el componente responsable de la interfaz gráfica (com.example.smsmessaging.Main) y no el componente responsable del servicio que ejecuta la parte maliciosa (com.example.smsmessaging.TestService).

Hemos analizado un rootkit Android sencillo que usa las funciones de la API de Google para ocultarse. Es decir, instala otra aplicación y quita el icono de la lista de aplicaciones mientras sigue en ejecución en segundo plano. Vemos que los troyanos de Android se vuelven más sofisticados y podríamos hacer un paralelismo entre la complejidad del malware para PC con el malware de Android.

Más información:

SHA-256 de la muestra:
77d7217013a5539a1611e13d67dcb8ad8756e9dd34ef8515d71409cadf323a0f


Laurent Delosières