Urielmania

“El Mundo de Uriel… Pero la voz de todos”

Hackeando Apalabrados

Apalabrados, o «Angry Words» es el clásico Scrabble de toda la vida pero jugando de forma online y si bien  es  un juego muy divertido,  hay que decir que si eres un poco flojo para pensar palabras aveces llega  a ser aburrido o un poco decepcionante que te ganan siempre y si bien hay  aplicaciones online o servicios que te «ayudan» con la generación de palabras, en base a las letras que dispones, y las ya colocadas en el tablero, para que efectúes la mejor de las jugadas, por que no ir un poco mas lejos y mejor aprender a hackear el servicio…

O al menos esto es lo que se les ocurrió en http://www.securitybydefault.com por lo cual se dispusieron a montar una herramienta de intercepción de tráfico, que me permitiese analizar los mensajes intercambiados entre la aplicación, y el servidor correspondiente. y una vez que identificaron  las peticiones, que  eran simples llamadas a una API web, trabajaron con el  proxy Paros para poder estudiar las mismas.

Algunas de las cosas interesantes que sacaron de este proceso fue:

  • El servidor hacia el que realiza las peticiones el juego es api.apalabrados.com y se encuentra en Amazon EC2.
  • Se puede ver que la contraseña de login viaja completamente en claro en una petición POST.
  • Si situamos a un cliente en una situación MiTM sencillo, forzando a jugar a los usuarios mediante una red wireless, podemos interceptar el identificador de usuario enviado en todas las peticiones GET y POST, y la cookie de sesión necesaria, así podríamos hacer peticiones del tipo: GET http://api.apalabrados.com/api/users/[mi_usuario_ID]/games con la cookie «ap_session» con el valor interceptado y obtendríamos la lista completa de los juegos de un usuario, con un montón de información de cada uno
  • Cuando se crea una palabra, con nuestras letras y las del tablero, el cliente envía una primera petición GET a http://api.apalabrados.com/api/dictionaries/ES?words=palabra. Así comprueba en su diccionario (depende del idioma) si la palabra existe o no. La respuesta es del tipo{«answer»:true,»wrong»:[],»ok»:[«palabra«]} si es válida; o del tipo {«answer»:false,»wrong»:[«palabra«],»ok»:[]} cuando es incorrecta.
  • Es posible manipular las peticiones y las respuestas entre el cliente y el servidor, de manera que le llegue al cliente lo que nosotros queramos, y que lógicamente, la aplicación ejecutará sin comprobar nada más. Es decir, que podemos modificar la respuesta del servidor diccionario, para que devuelva por válida cualquier palabra que le pongamos, sin problemas, pero los desarrolladores han tenido en cuenta estas trampitas, y hacen que, cuando confirmas posición de las letras, se comprueben, de nuevo, en el diccionario internamente y claro, dará un error por no existir la palabra. De momento, no he encontrado forma de engañar al servidor para que acepte palabras que no existen.
  • Entonces, ya que el servidor no permite modificaciones de las letras disponibles, del número de fichas o que se coma aquellas palabras que yo quiera, está claro: si no puedo engañar al servidor ,engañemos a los clientes!  Aquí ya viene la parte maliciosa. En Apalabrados, la API permite preguntarle al servidor por la situación de algún juego (o de todos) mediante GET, y también ejecutar un comando, mediante POST, pasando en el POST DATA la acción. Las más agresivas son «Paso» o «Rendirse», de manera que enviaríamos al servidor, falseando al cliente, en nuestro entorno MiTM una petición POST a http://api.apalabrados.com/api/users/[mi_usuario_ID]/games/[juego_ID]/turns con el POST DATA el valor {«type»:»PASS»}, y estaremos simulando que el cliente ha pasado. Si hacemos esto por cada vez que sea el turno del usuario,a éste podemos devolverle un error cualquiera de conexión al servidor, mientras vamos jugando alegremente una partida en la que la víctima siempre pasará, perdiendo la partida por goleada.
  • Otra opción más agresiva aún es forzar a un usuario a Rendirse a una partida. ¿Cómo? pues enviando la petición POST ahttp://api.apalabrados.com/api/users/[usuario_ID]/games/[juego_ID]/turns el valor{«type»:»RESIGN»} en el cuerpo del POST. Con esto al servidor le llega, la petición fraudulenta de Rendirse, por lo que forzaremos que esa partida se pierda y se deprecie el valor del usuario en su perfil, por partidas renunciadas. Por contra, si estamos jugando contra la víctima, ganaremos automáticamente la partida, porque el contrario renunció.
  • En estos  últimos casos, estamos causando un perjuicio a un jugador, en nuestro beneficio. Sin embargo, también podemos enviarle lo que queramos a la víctima, o a nosotros mismos. Desde un «Has Ganado» o un «Has perdido», aunque sea ficticio puesto que el servidor conoce el estado real de la partida. Pero, en cualquier caso, siempre es divertido enviarle mensajes malformados a un usuario para ver su reacción….

Para saber un poco mas http://www.securitybydefault.com

Acerca del Autor