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.
UDH header
(tomado de http://help.cardboardfish.com/?q=UserDataHeader)
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 “silenciosa”
sin 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
Hola,
ResponderEliminarinteresante 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.
Existe algun api de info sobre el tema? y que herramientas de programacion son necesarias?
Eliminar