14 enero 2013

Cómo ganar siempre a Mezcladitos



Disclaimer: Desde Security By Default, no nos hacemos responsables de los malos usos que se puedan extraer de la información explicada en el presente artículo.

Tras el éxito que tuvo Apalabrados, la empresa argentina Etermax, nos sorprendió este verano con una nueva creación: Mezcladitos. Si en el primero de los juegos, teníamos que ir buscando palabras una a una y contrastando su validez contra un servidor, pasando el turno a nuestro contrincante, en el caso de Mezcladitos, el tiempo sí que juega en nuestra contra, de manera que tenemos que buscar palabras válidas en un tablero de 4x4 letras en dos minutos.

Así como meses atrás, ya me senté a destripar el funcionamiento interno de Apalabrados, en el caso de Mezcladitos he tenido que postergarlo hasta las vacaciones navideñas puesto que mi aventura en Securízame, no me ha dejado apenas tiempo para "mi ocio".

Después de unos días jugando de forma legal y sin trampas a Mezcladitos, me he aburrido de perder algunas partidas, así que me he sentado con ello y aquí os presento mi investigación al respecto.

Para ello, he utilizado las mismas herramientas que en el caso de Apalabrados: Mi iphone, una red wireless y un proxy web intermedio que me permita analizar y modificar las peticiones salientes y las respuestas del servidor a mi voluntad.




if (Apalabrados == Mezcladitos) {
#A nivel de programación ¿en qué se parecen ambos juegos? Pues, desgraciadamente, en varios puntos, veamos:
  • En ambos, el usuario que autentica puede ser nativo de Etermax, o usar Twitter o Facebook para autenticarse. Esto, como ya vimos, permite identificar personas que no tenemos por qué conocer (si elegimos un oponente aleatorio).
  • La autenticación se realiza sin CAPTCHA, por lo que podría realizarse los mismos ataques de fuerza bruta que en el caso de apalabrados.
  • La comunicación se realiza en claro, por lo que la única cookie de sesión disponible, podrá ser robada y reusada por otro usuario, en caso de ser interceptada.

  • Si se juega en un entorno MiTM (utilizando wireless por parte de nuestra víctima), las mismas vulnerabilidades que comentamos en el caso de Apalabrados, aplican a Mezcladitos. Modificar las letras que le llegan a la víctima (haciendo que ninguna palabra sea válida, al no coincidir con las que el servidor envía), resignar partida, perder turno, etc,… son ataques totalmente factibles en mezcladitos utilizando la cookie de sesión que robemos a nuestro pobre adversario. 

Aquí podéis ver cómo hacer que las letras que llegan sean las que queramos (y con los puntos extra que queramos, TL, DL, TP o DP,... aunque luego no valgan)





Esto mismo sucede con la comunicación de chat por parte de los usuarios, por lo que procurad no enviar datos sensibles a través del mismo si jugáis (vosotros o vuestro contrincante) vía wireless.

Aquí tenéis una muestra de chat real,… y otra con unos mensajitos "de más" que mi contrincante nunca escribió…







}

else {
# ¿En qué se diferencian?

  • La propia naturaleza del juego es diferente "per se". Es decir, en el caso de Apalabrados, las comprobaciones de las palabras se hacen una a una en el servidor, siendo bastante poco dinámico esas paradas constantes para ver cuántos puntos le metemos al contrario o si hay suerte y la palabra que probamos, cuela. Las formas de trampear ese juego se reducían a estar en un entorno controlado MiTM, siendo capaz de controlar las partidas, hacerle vivir un universo paralelo a nuestro contrincante y enviar al servidor lo que nos de la gana (palabras de mínimo valor, acciones de "resignar partida" o de "pasar turno" ), pero no se podía hacer nada en caso de que nuestro adversario estuviese jugando vía 3G a no ser que fueses un taddong.
  • Sin embargo, en el caso de Mezcladitos, las palabras válidas son recibidas directamente por el cliente al principio del todo, así el programa comprueba en local si la palabra que hemos encontrado es válida o no, por lo que, si queremos asegurarnos que ganaremos la partida, podremos interceptar la recepción de estas palabras y conocer cuáles serán aquellas que nos vayan a aportar mayor puntaje.


He realizado un script sencillo que coge las palabras desde un fichero (primero las intercepto, las copio/pego en el fichero) les asigna un puntaje en base a lo que "pesa" cada letra teniendo en cuenta la progresión de encontrar palabras de más de 4 letras (va sumando 2 puntos si tiene 4 ó 5 letras, 4 puntos en las letras 6 y 7, 6 puntos en la 8 y 9,… y asi sucesivamente….) y las muestra ordenadas de mayor a menor.



Me ha dado pereza ponerme a implementar un "resuelve-mezcladitos" teniendo en cuenta las letras con "bonus" (que valgan triple/doble letra/palabra). Podría haberlo hecho, pero como pude comprobar que, simplemente con la ayuda del script anterior, ya ganaba todas las partidas,… no me era necesario, aunque ahí dejo el testigo a quien se quiera sentar a programarlo :)

Asimismo, como al final de cada turno, ambos contrincantes tienen acceso a las palabras encontradas por uno mismo y por el contrario, conviene hacer alguna palabra de puntaje medio o bajo para evitar que cante demasiado la aplastante victoria.

  • Otros paquetes que envía el servidor a los clientes, contienen mensajes como la puntuación conseguida por ambos jugadores en los turnos jugados hasta el momento. Se supone que, para que no sepas cuántos puntos ha hecho tu contrincante en el mismo turno que te toca a tí, el cliente te dice que está oculto,… así no sabes cuántos puntos tienes que hacer para ganar y te devanas los sesos buscando palabras como loco…. 
       

Bueno, esto… si eres completamente íntegro. En mi caso, me dí cuenta que en la comunicación cliente-servidor había mensajes como este (que aunque pertenece a otro juego, es totalmente válido), en el que se ven las puntuaciones de los diferentes turnos de ambos jugadores. Teóricamente, el valor 371, aparecería como Oculto para nosotros en este momento.



Es decir, que podemos saber cuántas palabras (o puntos) necesitaremos para vencer al contrario. No comprendo por qué los desarrolladores han hecho esto así, siendo que podían haberse ahorrado enviar el puntaje del contrario. Ya que las palabras encontradas han de enviarse al servidor (como veremos más adelante) para ser validadas allí, y determinar si un jugador ha ganado o perdido, no es necesario disponer en el cliente del puntaje previamente.

  • La utilización de trucos (o "Power Ups"): En el caso de mezcladitos, cuentas con una serie de monedas iniciales que puedes canjear por diversos trucos, que te permiten congelar el tiempo disponible, pedir pista de sabiduría, etc,… Lógicamente según haces uso de estos trucos, tu número de monedas va decreciendo. Para ganar nuevas monedas, hay dos opciones: o ir ganando partidas o directamente pasar por la tienda de Mezcladitos y pagar por ellas.

       

       Analizando cómo se descuentan las monedas, pude ver que es al final del turno, cuando se envía al servidor, además de las palabras encontradas, los trucos que se han utilizado "power_ups" y el número de monedas gastadas para conseguirlos.

       

Es decir, que todo se hace en local y luego se envía el resultado al servidor, ¿verdad? Estupendo. Con modificar el mensaje de envío al servidor diciendo que no has consumido ningún power-up y que Coins=0, podemos haber usado todos los trucos disponibles para encontrar las palabras y enviar que nos ha costado 0 monedas. Evidentemente, ganaremos todas las partidas (es decir que incrementaremos nuestro saldo de monedas) y tendremos trucos de forma gratuita. ¿Se podrán canjear estas monedas por dinero real o bitcoins en alguna parte? ;)

  • No he podido fuzzear la parte de compra de monedas puesto que cuando llego a ello, me indica que mi dispositivo no soporta la operación.


  • De todas maneras, aunque seamos derrochadores y nos quedemos sin monedas, el número disponible de las mismas viene en un mensaje desde el servidor, por lo que tranquilamente podremos modificar ese valor para tener cuantas queramos para el uso de los trucos que necesitemos para el desbloqueo (en local) de los mismos, aun no teniendo dinero



Con cambiar el 77 y poner lo que queramos, por ejemplo 9999, el cliente se lo cree y nos deja comprar cuantos powerups queramos


  • El formato de las palabras encontradas. Cuando se completa un turno, el cliente envía al servidor un mensaje como el que hemos visto en imágenes anteriores. Como se puede ver, se manda la sucesión de posiciones de las letras correspondientes a cada palabra en modo \u0005 (para la posición de la letra número 5) \u0006 (para la 6), etc,… y la puntuación total de cada palabra. Así por cada palabra, los power_ups y monedas consumidas (a partir de descubrir esto, siempre 0), así como los puntos totales de ese turno. Entendemos que si desarrollamos un resuelve-mezcladitos, sería muy sencillo incluir que nos generase un mensaje con las posiciones utilizadas para cada palabra, sumas parciales y sumas totales ¿verdad? Es decir, que no tendríamos siquiera que buscar las palabras de mayor puntaje, directamente, ya lo haría nuestro script por nosotros.


}


Conclusiones:
  • A nivel de seguridad en la programación, el juego 'mezcladitos' está igual de mal desarrollado que 'Apalabrados'
  • A diferencia del primero, en el que todo se comprueba en el servidor, en el segundo, las palabras válidas se envían al cliente, pudiendo obtenerse una lista previa y jugar "con ventaja"
  • En Apalabrados, aparte de la incesante y molesta publicidad por cada jugada, no existía otra forma de ganar dinero por parte de Etermax (incluídas las miles de llamadas que hace a diferentes Ads). En Mezcladitos, la empresa desarrolladora ha ideado un juego mucho más adictivo y dinámico, que incluso permite interactuar con una tienda de compra de monedas canjeables por trucos, por lo que no me hago responsable del uso que no tenga fines académicos de la información publicada en este artículo.
  • De hecho, siguiendo una política Responsible-Disclosure, al conllevar posibles pérdidas de ventas de monedas por parte de Etermax, me puse en contacto con ellos vía Twitter. Como después de unos 15 días, ni siquiera me han respondido, pues directamente lo publico y ya está.

5 comments :

pagestronic dijo...

Recuerdame que NUNCA juegue a NADA contigo online :D

Bart dijo...

Creo que no esta en IPhone pero a ver si puedes sacar algo para el Triviados (es como un Trivial) que alguno me da unas palizas que lo flipas!! jeje

Lorenzo_Martinez dijo...

Me lo comentó un colega... que probara Triviados, pero sólo está para Android :)

Bart dijo...

Vicia mucho, esta muy bien, es el que mas me gusta de los tres, pero los servidores son una castaña y da errores de conexion continuamente, llega a desesperar, si te haces con un android echale un vistazo porque es muy divertido.

Alberto dijo...

uhmmm, me podrias recomendar un proxy para android?