Nueva herramienta: GmtCheck. ¿De dónde viene esta app de Android o applet?

lunes, 10 de febrero de 2014


Existen millones de applets maliciosos (ficheros JAR) y apps de Android (ficheros APK) ahí fuera. ¿De dónde vienen? ¿De qué país? ¿Al menos, cuál es su zona horaria? En un estudio forense, puede ser relevante conocer (o al menos establecer indicios) si provienen de Rusia, Brasil, China, la India o Estados Unidos. Veamos cómo.

Los ficheros dentro de los ZIP

Los APK (apps de Android) y los applets (y programas Java) vienen todos del mismo formato: son un fichero ZIP. Esto quiere decir que comparten buena parte de las especificaciones PKzip. A la hora de crear un fichero ZIP, el atributo "fecha" de modificación de cada fichero se almacena dentro del ZIP. Se puede comprobar simplemente abriendo un fichero con cualquier herramienta.
 
La forma en la que se almacena este dato es curiosa, y hablaremos de ella en alguna otra entrada. La parte interesante es que el atributo "fecha y hora de modificación" con el que se almacenan es el mismo que el del sistema en el que se han compilado. También, que hay ficheros que se crean justo cuando se compila el programa, como el manifiesto (.mf). Pero, no se da ningún "offset" a esa hora, así que este dato por sí mismo no permite saber si el APK o el JAR está creado en un país concreto. Un fichero dentro del ZIP con fecha de modificación a las 23:45 no significa nada por sí solo. ¿Las 23:45 de qué país?


Fechas de modificación de los ficheros dentro de un APK

Ficheros firmados y certificados

Algunos applets se firman, de forma que pueden escapar de la sandbox de Java y atacar a los usuarios. Los APK casi siempre están firmados, porque Google Play y Android dicen que así debe ser para usarlo en su plataforma. Cuando están firmados, se añade un certificado dentro de los ficheros ZIP. Este certificado está en una estructura PKCS7, que es un fichero con extensión (entre otras) RSA o DSA en el directorio META-INF. Los certificados puede que estén autofirmados. Esto es gratis y los atacantes no tienen que demostrar a nadie quiénes son en realidad.

Atacantes y certificados
Fecha de creación del certificado... "Válido desde..."
Los atacantes odian los certificados firmados por CAs, pero les encantan (y tienen que hacerlo) los certificados autofirmados. Son gratis y desechables. Pueden crear un certificado autofirmado ad-hoc para una app y nunca usarlo más. Eclipse y otras plataformas de desarrollo ayuda en esta tarea de crear expresamente certificados a la hora de compilar ficheros apk, como último paso antes de enviarlo a Google Play.

Los certificados se almacenan dentro de los APK cuando se crean. Y aquí está el truco. Su hora de creación se almacena sin "zona horaria, o sea, en UTC. En concreto en formato YYMMDDHHMMSSZ. La Z corresponde a "hora zulú", que es UTC o a efectos prácticos,, casi igual que GMT+0. time zone.

Vista en formato ASN.1 de la fecha de un certificado
Como curiosidad, si un certificado contiene una fecha más allá de 2049, se usa un formato llamado "generalizado", que es fundamentalmente el mismo pero incluye la especificación completa del año con cuatro cifras. YYYYMMDDHHMMSSZ.

Poniéndolo todo junto

Así que por un lado tenemos la fecha de sistema del creador, y la hora UTC, que no es más que GMT+0. Solo tenemos que asumir que el certificado y los ficheros son creados justo en el mismo momento para hacer las cuentas y calcular el "offset" de la zona horaria.

Si un fichero manifest o de firmas (que son los últimos creados en la compilación de un JAR o APK) contiene la fecha de sistema 16:00, 1 de enero de 2014, y la hora UTC del certificado pone que fue creado a las 15:00 del 1 de enero de 2014, si asumimos que se crearon en el mismo momento, podríamos decir (a menos que el atacante haya modificado su hora de sistema) que el atacante vive en una zona horaria GMT+1.

Hora UTC - Ficheros ZIP... en su diferencia está el offset y, por tanto, la zona horaria (fuente del mapa: timeanddate.com)
La herramienta que hace el cálculo

Hemos creado una herramienta que realiza el cálculo. Lee un fichero JAR o APK y, si está firmado:
  • Intentará extraer la hora de creación (UTC) de un certificado.
  • Intentará leer la hora de modificación del último fichero creado en la compilación (normalmente el fichero .sf en el directorio meta-inf).
  • Hará las cuentas y dirá en qué zona horaria vive el desarrollador, asumiendo que la creación del certificado y la compilación han ocurrido en el mismo momento (minuto arriba, minuto abajo) y que el desarrollador no ha modificado su hora de sistema.
Estos son algunos ejemplos reales:

Una app fraudulenta desde España

Malware desde E.E.U.U

Una aplicación falsa desde Hong Kong

Este APK es de una aplicación india falsa. Teen Patti poker
La herramienta está disponible en Python y compilada en C#. Ambas pueden ser descargadas desde este enlace: http://elevenpaths.com/downloads/gmtcheck.zip

Invitamos al uso de la herramienta.
Sergio de los Santos
ssantos@11paths.com

2 comentarios:

  1. ¿Podríais subir el código fuente en C#, por favor?

    ResponderEliminar
  2. @Anónimo, disculpa, por ahora no tenemos la intención de subir el código fuente del C#, aunque tienes la versión en Python. Muchas gracias por el interés.

    ResponderEliminar