Explotando el portal cautivo de Tigo
Hace unas semanas Tigo realizó una actualización del portal cautivo de Internet móvil, la nueva implementación utiliza Angular y una API REST en el fondo.
Como suelo utilizar el celular como hotspot, decidí inspeccionar el funcionamiento del nuevo portal. La idea de este post es describir algunos de los problemas que presenta esta implementación.
La vista principal es prácticamente igual a la anterior y es algo así:
La parte interesante aparece cuando inspeccionamos qué solicitudes HTTP se realizan para popular esta vista (con los datos como número de línea, tipo de cuenta, saldo, etc.):
Es notable que a pesar de que el servidor ya conoce nuestro número de línea, esta se vuelve a incluir en cada solicitud que se envía a la API, en esta imagen vemos la respuesta JSON del método getBalanceInfo, y en ella mi saldo actual (1437 Gs).
Dada esta situación, decidí que sería interesante emular esta solicitud desde la línea de comandos, utilizando Curl. Y de paso hacer una pequeña modificación y pasar un número de línea que no es el mío.
La emoción hizo que lo intente con tres números de línea distintos, obteniendo así el saldo de cada una de ellas:
A continuación, apliqué un “paquetigo” a mi línea y comprobé nuevamente lo que se envía al servidor:
Nuevamente, mi número de línea aparece ahí, así que la prueba más interesante fue la siguiente: ¿Si envío una solicitud para aplicar “paquetigo” y utilizo un número de línea que no es el mío, se aplicará?
¡La respuesta del servidor fue satisfactoria! Vale la pena aclarar que todas las “víctimas” que figuran aquí son líneas de mis amigos y todo fue realizado con autorización de ellos. Cuando realicé esta última prueba, también llegó el SMS de confirmación, que es enviado luego de aplicar un “paquetigo” y posteriormente comprobamos que el saldo correspondiente fue debitado, por lo que la conclusión y respuesta a la pregunta anterior es que sí se puede aplicar un “paquetigo” a una línea que no nos pertenece...
Ahora me gustaría arrojar algunos detalles sobre CORS, estas son las cabeceras del servidor:
Es decir, con estas cabeceras estaríamos permitiendo que se pueda realizar una solicitud desde un dominio que no sea el de “internet.tigo.com.py”. En la práctica sería posible que al visitar un sitio X, este sitio obtenga información como nuestro número de línea, tipo de plan, saldo, etc. Todo esto sin que nos percatemos de ello.
Preparé una página muy sencilla, alojada en Github Pages, para probar esto:
http://matiasinsaurralde.github.io/portalcautivo-prueba/
Otra cosa interesante es la cabecera “X-Codingpedia” que se indica más arriba, como parte de CORS, investigando un poco encontré este tutorial de Codingpedia:
E incluso las líneas específicas que mencionan dicha cabecera y establecen las otras:
La idea del post fue detallar estos errores de implementación y de paso compartirlos con la comunidad ya que muchos estamos usando SPA y cosas similares. Y ver si se llegan a solucionar :)
Update (10:00 - 12 de mayo): Aparentemente Tigo hizo un rollback a la versión anterior, asumo que van a parchear esto.