lunes, 10 de febrero de 2014

Como saber si un móvil remoto está conectado a la red móvil

Analizando un troyano Android que interactuaba directamente con el modem GSM, hemos encontrado una funcionalidad llamada sendPingMessage o mas conocido como SilentSMS. Por curiosidad hemos analizado dicha función y queremos compartir con vosotros nuestros hallazgos en este artículo. En primer lugar, veremos los términos técnicos necesarios para entender el articulo y luego diseccionaremos la función sendPingMessage.

El protocolo GSM es usado para enviar un SMS, saber si el SMS fue recibido por el operador, etc. Cada vez que un usuario envía un SMS (mensaje mas el destinatario), el móvil añade información al SMS para construir un Protocol Data Unit (PDU). El PDU se compone del tamaño de Short Message Service Center (SMSC), el tipo de dirección del SMSC, el numero SMSC (numero del móvil del receptor), los datos del usuario (el mensaje), etc.


Ejemplo de un PDU de SMS (tomado de http://www.smartposition.nl/resources/sms_pdu.html)

Cuando un usuario recibe un SMS, el móvil lo interpreta como un SMS normal, es decir lo guarda en el buzón de los mensajes, y lo muestra al usuario. Sin embargo, podemos extender el SMS y transformarlo en un SMS binario donde el contenido del SMS puede ser contenido binario o aumentar el tamaño del SMS y así enviarlo en múltiples partes, etc. Por eso, es necesario de añadir una cabecera User Data Header (UDH) para que el móvil lo trate de manera diferente al SMS normal. El UDH es añadido al principio del “user data”. Un UDH se compone de la cantidad de bytes y seguidamente a este campo, puerto de origen, puerto de destino, etc.


El puerto de origen y destino permite de multiplexar el flujo de SMS y permitir a diferentes aplicaciones recibir los SMS que han registrado. Es decir que las aplicaciones en el móvil pueden escuchar en un puerto y recibir todos los SMS destino a ese puerto como los protocolos UDP y TCP de la pila TCP/IP. ¿Y que pasa si enviamos un SMS en un puerto donde ninguna aplicación está escuchando? Aquí estamos.


(Tomado del http://www.ozekisms.com/index.php?ow_page_number=221)

Haciendo ingeniería inversa de la función “sendPingMessage”, hemos conseguido el código desensamblado del código Dalvik, mostrado en la imagen de abajo. Podemos observar que el programa consigue una instancia del SmsManager, construye una tabla de bytes, y la envía por SMS usando la función “sendDataMessage”. Hemos conseguido reconstruir esa tabla:

byte[] data = {0x7C, 0x06, 0x03, (byte)0xBE, (byte)0xAF, (byte)0x84, (byte)0x8C, (byte)0x82, (byte)0x98, 0x31, 0x32, 0x33, 0x34, 0x00, (byte)0x8D, (byte)0x90, (byte)0x89, 0xE, (byte)0x80, 0x00, 0x00, (byte)0x96, 0x00, 0x00, (byte)0x8A, (byte)0x80, (byte)0x8e, 0x01, 0x56, (byte)0x88, 0x03, (byte)0x80, 0x01, 0x00, (byte)0x83, 0x00, 0x00};

Sin embargo, mediante pruebas realizadas, hemos averiguado que la tabla de caracteres puede ser compuesta de caracteres aleatorios (no hay ningún significado o interpretación de esos caracteres como código).



Reconstruyendo la función en Java, hemos logrado el código mostrado abajo. Definimos en primer lugar el puerto de destino (8091) y la tabla de bytes a enviar (data). Luego recogemos una instancia del SmsManager, y finalmente enviamos la tabla de bytes al destino (PHONE_NUMBER) en el puerto 8091 vía la función “sendDataMessage”. Es muy importante hacer notar que hemos elegido un puerto aleatorio donde ningunas aplicaciones están escuchando en el móvil del destino. De esta manera sabremos si hemos enviado el SMS y el destino lo ha recibido, registramos dos “receivers” llamados respectivamente “piSend” y “piDelivered”. Así sabemos si el destino ha recibido el SMS, es decir el móvil de destino esta conectado a la red móvil.




¿Qué pasa en el móvil de destino?

Cuando el SMS llega al destino, el móvil va a tratar el SMS como un SMS especial (por la presencia de la cabecera UDH) y no va a guardarlo en el buzón de correos. Igualmente, como ninguna aplicación esta escuchando en el puerto 8091, el móvil no va a alertar el usuario. En otra palabra, este SMS llega al móvil de manera “silenciosasin que el destino no se de la cuenta. Sin embargo, el operador va a alertar el origen de que el SMS fue recibido por el destino y entonces sabremos que el destino esta conectado a la red móvil.

Hemos probado con los móviles MotoG, Nexus4, y iPhone 4 y funciona con todos. El único móvil que mostraba el SMS silencioso era un Siemens a50. Pensamos que el Siemens no sabe interpretar la cabecera UDH y entonces trata el SMS como un SMS normal.

Esta técnica es usada por los operadores móviles para probar la conexión de los móviles a la red. También, es usada por los servicios secretos y la policía para localizar un móvil. Quizás los servicios secretos están espiándose :=)

Mas información:

Hash de la muestra analizada

e1de5717fcffe116a13ed9811bdbfa73552eb8c15e8c087bdf5f34e1d44146dd

Laurent Delosières
ldelosieres@hispasec.com

3 comentarios:

  1. Hola, muy interesante el artículo!
    Sería posible hacer una aplicación que escuchara en todos los puertos para detectar los "SilentSMS"?
    He encontrado un proyecto que entre sus objetivos(https://github.com/SecUpwN/Android-IMSI-Catcher-Detector#development-roadmap) está el de detectar este tipo de mensajes, pero parece que aún no lo han empezado por falta de desarrolladores(https://github.com/SecUpwN/Android-IMSI-Catcher-Detector/issues/2).
    Por cierto, estaría bien ver el código fuente completo ya que, he probado dos aplicaciones(https://github.com/domi007/silentSMS y https://github.com/bratwurzt/ZeroSMS) para mandar este tipo de mensajes y ninguna de ellas me funciona(aunque tampoco he dedicado demasiado tiempo en probarlas).
    Saludos,
    Aleix.

    ResponderEliminar
  2. Hola,
    interesante artículo sobre esta aplicación.

    En realidad este mecanismo es "heredero" de mecanismos GSM tradicionales. Algunos comentarios:

    1. La primera versión del "aviso de disponibilidad" consistía en mandar un SMS con confirmación de entrega ocultando el remitente y activando el modo FLASH (el SMS se mostraba en pantalla pero no se almacenaba en el terminal). En este caso el usuario podía ver que algo pasaba con su móvil, se iluminaba la pantalla.

    2. Existen muchas aplicaciones que están registradas para recibir SMS (además del propio cliente de SMS), por ejemplo WAP-PUSH, notificación SMS, configuración OTA de terminales, configuración OTA de tarjetas SIM, aplicaciones STK (SIM Toolkit).

    3. En realidad, un operador móvil no necesita mandar un SMS para saber si un móvil está conectado a la red. El propio terminal se encarga de "avisar" a la red cuando se conecta, cuando se desconecta y cuando cambia de ubicación (procedimiento Location Update).

    4. Hay una confusión (común) sobre el mecanismo de localización de móviles en red. Tradicionalmente este mecanismo utiliza un mecanismo de PAGING similar al que produce el envío de un SMS (incluyendo la localización de la ubicación del móvil mediante un SRI-SM: "send routing info for short message") pero, al final, no se produce el envío de ningún SMS. Lo que hace el operador es interceptar la respuesta del móvil al paging para calcular su ubicación.

    En resumen, lo que se comenta en el artículo es aplicable cuando no se tiene acceso a la red móvil.

    ResponderEliminar
    Respuestas
    1. Existe algun api de info sobre el tema? y que herramientas de programacion son necesarias?

      Eliminar