Espiar y suplantar a usuarios en Viber (autenticación bug) [solucionado]
Editado: Informé a Viber el 26/06/2013 y en menos de 12 horas lo solucionaron.
Hace unos días me dio por analizar unas cuantas aplicaciones de mensajería instantánea para móviles, a ver si encontraba algún fallo de seguridad. Inicialmente mi intención era fijarme en las versiones para PC del Line y del Viber, y empecé por esta última.
Analizando el proceso de autenticación de la aplicación para PC del Viber encontré varios fallos de seguridad que permiten averiguar el PIN que utliza, lo que permite acceder a dicha cuenta del Viber desde el ordenador, con lo que ello implica: espiar conversaciones en tiempo real (imágenes que se envían incluidas), espiar el histórico de llamadas, suplantar la identidad, y acceso a la agenda de contactos. Todo esto sin que la «victima» se percate prácticamente de nada: sólo recibe un mensaje en el Viber (móvil) una única vez indicándole un PIN.
Más o menos el proceso de autenticación es el siguiente…
Se instala la aplicación del Viber para PC y al ejecutarla te pregunta si tienes algún móvil (da igual la plataforma) con Viber ya funcionando. Le dices que sí y te pregunta el número de móvil, lo introduces y llegará al Viber en el móvil un mensaje con un PIN de 4 dígitos, el cual tienes que escribir en la aplicación del PC y ya tienes el Viber autenticado en tu ordenador. El primer error es claro: ¿un PIN de 4 dígitos?, es totalmente insuficiente desde el punto de vista de la seguridad.
Internamente lo que hace la aplicación cuando introduces tu número de móvil en el PC (primer paso), es generar una cadena (pseudo)aleatoria de 40 caracteres de longitud que se usará más adelante como clave para identificar tu cuenta de Viber. Esto lo hace el propio programa sin consultar antes al servidor, con la siguiente petición HTTPS:
<RegisterUserRequest>
<PhoneNumber>660100200</PhoneNumber>
<PushToken></PushToken>
<CountryIDDCode>34</CountryIDDCode>
<UDID>27b828c2768a7d7b65cg7dced6icb2aa90420c29</UDID>
<DeviceType>Desktop</DeviceType>
<SystemVersion>NT6.1</SystemVersion>
<System>Windows</System>
<ViberVersion>3.0.1</ViberVersion>
<SecondaryDevice>1</SecondaryDevice>
</RegisterUserRequest>
Si interceptas ese UDID (en tu ordenador), luego puedes calcular el PIN que ha llegado a la aplicación del Viber en el móvil. Cada vez que la aplicación para PC intenta validar un PIN lo que hace es una petición HTTPS como la siguiente:
<ActivateUserRequest>
<UDID>27b828c2768a7d7b65cg7dced6icb2aa90420c29</UDID>
<ActivationCode>1234</ActivationCode>
<ProtocolVersion>14</ProtocolVersion>
<System>Windows</System>
</ActivateUserRequest>
Como vemos vuelve a utilizar el UDID, e intenta validar el PIN 1234. Viber (del lado del servidor) tiene una protección por la que si metes mal el PIN 3 veces el sistema se bloquea, el problema es que se puede saltar. Seguramente porque el sistema utiliza una base de datos MySQL y el UDID se guarda en un campo de tipo VARCHAR (u otro no binario), la comparación que realiza no distingue si añades espacios en blanco al final del UDID o si cambias una minúscula por una mayúscula y viceversa. Con lo cual, con este pequeño truco puedes enviar muchísimos más intentos y no sólo 3.
El UDID que acepta el servidor tiene una longitud máxima, con lo cual no puedes añadir espacios hasta el infinito. Pero teniendo en cuenta que te deja 3 intentos por cada UDID, que puedes añadir bastantes espacios (más de 300) y que puedes ir jugando con las minúsculas/mayúsculas: el resultado es que con tal de que el UDID tenga 8 letras ya es suficiente para llegar a las 9000 combinaciones diferentes de UDID para poder probar todos los PIN posibles (en las pruebas que he realizado siempre genera un UDID con más de 8 letras).
He hecho un pequeño programilla que prueba todos los PIN, desde el 1000 hasta el 9999, tarda algo menos de 2 horas en probarlos todos. Una vez con el PIN + una key que devuelve el servidor, hay que interceptar la petición que hace el Viber para PC y modificar la respuesta al vuelo con un proxy como Burp Suite (el PIN será invalido puesto que ya lo has validado anteriormente al hacer la petición para comprobar si era correcto). Una vez hecho esto se consigue acceso completo a la cuenta de Viber desde el ordenador.
Hay que resaltar que no se recupera el historial de mensajes y llamadas anteriores a ese momento, sino que se empezarán a sincronizar desde entonces en adelante.