MADBike – Destapando la seguridad de BiciMAD (Auditoría de seguridad)

Cuando salió el servicio de bicicletas eléctricas de Madrid estábamos encantados e inmediatamente nos hicimos la tarjeta de socio y comenzamos a usarlo. Como no, nos bajamos la app oficial tanto en iOS como en Android, pero no era lo que esperábamos, tanto el diseño como la experiencia de usuario nos decepcionó bastante con todas las estaciones apelotonadas en el mapa, además la sección de “Tiempo en Madrid” no funcionaba, el ranking de usuarios carecía de sentido porque no podíamos saber ni en qué posición estábamos.

BiciMAD MapBiciMAD WeatherBiciMAD Ranking
De modo que nos planteamos hacer nuestra propia app para solucionar estos problemas y hacerla a nuestro gusto. Buscamos sin éxito la API pública y leímos un artículo acerca de la primera API y lo vulnerable que era, pero la habían actualizado para securizarla.

Desesperados por encontrar una solución, usamos el Charles para saber qué llamadas hacía la aplicación oficial y poder replicarlas. Todas iban sin HTTPS de modo que no necesitamos ni activar el SSL Proxying para saber que estaba pasando ahí dentro. Todas las llamadas se hacían a “http://helena.bonopark.es:[PUERTO]/app/app/functions/”, a día de hoy no sabemos por qué llamaron al proyecto Helena porque precisamente no es la API mas bonita que hemos visto. El servicio más interesante era “get_all_estaciones_new.php”, preciosa mezcla de Español e Inglés que vimos a lo largo de todos los endpoints.

Todos recibían por POST los parámetros “id_auth” e “id_security”, esta era la nueva seguridad que habían introducido. El “id_auth” te lo devolvía el servidor cuando hacías login y era siempre el mismo a no ser que cambiases tu contraseña. El “id_security” cambiaba según la petición y tenía un formato que olía a dos MD5 concatenados.

En la petición de login que nos devolvía el “id_auth”, se mandaba “dni”, “password”, “codigo_push” (siempre a “NO”) y el dichoso “id_security”, de modo que probamos a hacer el MD5 de “00000000Apassword” (concatenar la contraseña al DNI) y… ZAS! ya teníamos el primer MD5 del “id_security” pero, ¿cómo saber el segundo? pxb1988/dex2jar + iBotPeaches/Apktool + java-decompiler/jd-gui al rescate!

Localizamos donde se generaba el “id_security”, vimos que partían el string “00000000Apassword” por la mitad y ese era el segundo MD5 que teníamos que hacer. Tras poner el “Content-Type” a JSON en utf-8 ya teníamos la forma de hacer login y obtener el preciado “id_auth”.

Con el “id_auth” y sabiendo como se generaba el “id_security” ya pudimos pedir todas las estaciones y acceder a todos los servicios, y tras un tiempo de desarrollo, ya teníamos lista MADBike.
MADBike

HUEVO DE PASCUA:

Tras pasársela a los colegas, nos dimos cuenta de que no todo el mundo tenía la tarjeta de socio y cuenta en BiciMAD, y sobre todo para los turistas, necesitábamos la información de las estaciones sin login. Pensamos en llevarnos la información a Parse (menos mal que lo descartamos) y un buen día probando la app oficial, vimos que había un “botón” en la pantalla de login que no habíamos visto antes que ponía “Ver mapa de estaciones” y que mandaba como “id_auth” y “dni” el string “INICIO_APP” tratado con el mismo algoritmo para generar el “id_security”, es decir, el MD5 de los dos concatenados (es decir “INICIO_APPINICIO_APP”) y este concatenado con el MD5 de la mitad de ese string (en este caso “INICIO_APP”), lo que nos dio un token prácticamente “hardcodeado” en la app oficial que te daba acceso a la información de todas las estaciones sin necesidad de hacer login.
BiciMAD Login

MADBike Written by:
  • darkgaze

    Dios nos salve del Apocalipsis. XD