Seguridad en cliente, una farsa que no existe
Tal como hablé con algunos en OFFF al fin me he decidido a montar una pequeña explicación de como hackear una página web para modificarla a nuestro gusto y poder, por ejemplo, mandar formularios con datos incorrectos, saltarnos validaciones, modificar puntuaciones de juegos ... no se, lo que se quiera :) (esto va para zárate y rolf ruiz)
Para empezar voy a poner un ejemplo de como poner un logo diferente en esta misma página. Se que es una tonteria pero para empezar a entender como funciona es interesante. Tengo que hacer incapié en que este sistema ya lo conoce mucha gente, como zigotica que por ejemplo el lo usa en su bookmarklet para sacar los CSS y JS de una página (léase post https://www.domestika.org/foros/viewtopic.php?t=26029 ).
Vamos con la teoria del ejercicio, ya muchos de vosotros sabeis que para ejecutar un javascript desde un enlace lo podemos hacer de varias formas, desde un manejador de evento (como un onClick) o desde el mismo href="" iniciando el script con un javascript:"script aquí". Pues bien, los navegadores tienen la peculiaridad (antes creía que era un bug pero simplemente es eso, una ventaja más a la hora de desarrollar) de poder ejecutar javascript desde un enlace, eso significa que a más a más de poder ejecutarlo desde un href también lo podemos hacer desde la barra de direcciones. Para ver un ejemplo, copiad el siguiente código i pegadlo en la barra de direcciones (sin miedo) y pulsad intro como si quisierais visitar una web con eso:
<code>
javascript:alert("domestika rules");
</code>
Como podeis comprobar, el javascript se ejecuta... lo mejor de todo es que lo hace en ambito global, como sería window.alert("txt"). (gracias a zigotica por la corrección)
Ahora partiendo de esa idea y con un poco de DOM, vamos a modificar el logo de la web (uee... :P).
Empezaremos por escojer una imagen de algún sitio, me he decidido por el logo de zigotica ya que es mu moderlno ;) (espero que no se moleste, si se molesta ya lo modificaré :P), la url del logo es:
"http://zigotica.com/zgtclogowhite.jpg".
ahora, si miramos el código de la página vemos que la primera imagen de la jerarquia del HTML es el mismo logo de dmstk, eso no lo pone aún más facil, ya que podemos acceder a ella mediante document.getElementsByTagName("img")[0], de ese modo accederemos a la imagen, ahora para modificar el src pues sería:
<code>
document.getElementsByTagName("img")[0].src="http://zigotica.com/zgtclogowhite.jpg";
</code>
Pues cogemos el codigo este y lo ponemos en la barra de vinculos, pero le añadiremos un void para que no nos devuelva nada.
<code>
javascript:document.getElementsByTagName("img")[0].src=
"http://zigotica.com/zgtclogowhite.jpg";void(0)
</code>
Y una vez lo ejecutamos.... hoooip... ya tenemos el logo de zigotica en domestika (que maaaanguiiisss...).
bueno, eso es algo sencillo, la verdad :P, ahora vamos a ver como podemos hacer algo más interesante como por ejemplo entrar en el ranking de un juego. Para ello vamos a tomar como base los juegos de orisinal, buenissimos pero a la vez fragiles como un jarrón ming (jijiji...). Podemos tomar como base algun juego de orisinal, como por ejemplo el del hamster que cae en una hoja petando capullos para que salgan las mariposas (mu gonitos los juegos). La URL es "
http://www.ferryhalim.com/orisinal/g3/wake.htm".
Se que muchos de vosotros encontrareis esto inmoral y poco etico, pero bueno, que mejor que un caso real para aprender a hacer las cosas bien (luego propondré como hacer rankings más seguros).
No voy a explicar como está hecho el juego ni mucho menos, solo voy a buscar la variable donde que se manda al servidor con los puntos conseguidos, abrimos el SWF con algún desensamblador y vemos que ha una variable en el nivel 2 llamada score, pues nada ahora sabemos que en _level2/:score se esconde lo más interesante de todo.
ahora bien, accederemos al objeto object y le haremos un setVariable del qince mediante lo que os he explicado antes del ejecutar javascript desde la barra de vinculos, por pasos:
acceder al elemento object:
<code>
document.getElementsByTagName("object")[0]
</code>
definir una variable de un flash:
<code>
setVariable("_level2/:score",2125);
</code>
ahora lo unimos todo:
<code>
javascript:document.getElementsByTagName("object")[0].setVariable("_level2/:
score",2125);void(0);
</code>
bueno, pues ahora iniciamos una partida, y mientras el hamster se cae ejecutamos el código que hemos definido, y .... ante nuestros ojos ... magia, acavamos de petarle el juego al hombre este de orisinal.
Bueno, pues tal como indiqué a algunos en OFFF, esto es así de facil, da igual que desde el servidor digas que no aceptas peticiones que no vengan de la URL del juego, ya que si modificas el juego "en caliente" el lado del servidor no se entera de nada.
Recomendaciones:
Personalmente recomiendo siempre obfuscar al máximo la variable que se manda al servidor y sobretodo guardar tantos parametros como nos sea posible para confeccionar un resultado fiable desde el servidor (el cliente puede ver sus puntos y modificarlos pero donde se hace una multiplicación (por ejemplo) es en el servidor... entonces se tienen que modificar más parametros y en consecuencia se requiere de más tiempo y tecnica para reventar el juego.
Etica:
Realmente habría podido usar esta tecnica para entrar en multitud de rankings de concursos etc (y no lo digo por vacilar, ya habeis visto lo facil que es) y no lo he hecho, hay una cosa llamada etica profesional la cual nos tiene que impedir hacer mal uso de nuestros conocimientos técnicos para fines lucrativos (vamos, esto i robar es lo mismo)-
Hay que joderse:
Creía que el SWLIVECONNECT servia para evitar eso pero nah, solo sirve para poder pasar variables via FSCOMMAND.
Conclusión:
Estamos ante un bug? es esto otra falla de macromedia? ... yo creo que NO, esto simplemente es una propiedad que tienen los navegadores de ejecutar javascript. Ahora, que tendría que haber un parametro en el flash que no te permitiera hacer eso? pues si, pero .... desde dentro del flash, ya que si fuera via atributo del object/embed se podría modificar via DOM.
Bueno, pues espero que sepais usar esto con la cabeza para mejorar la seguridad de vuestras aplicaciones, ya que se pueden hacer cosas de escandalo con sites que requieren de una seguridad muy acurada.
(no me saco de la cabeza el bookmarklet del zigotica, que caña!!)
ala,saludines ;)
PD: tengo palabra eh :P que al final me he currado la explicación que prometí :)
javierd
hola
si quisiera entrar y cambiar algo a un movie clip, por ejemplo su estado de _visible como se haria?
juandelgado
Lo primero enhorabuena Marc! Me alegro de que por lo menos alguien se lo vaya a contar al de la mesa de al lado ñ_ñ No, en serio, me extraña que naie de MM estuviera pensando ya en esto... en fin.
También estoy de acuerdo contigo en lo del sniffer y el descompilador, ya requiere un poquito más por lo menos.
dagi3d
creo que la solucion pasaria por obligar a que las variables enviadas desde fuera se interpretasen de distinta manera, tal como se hace con php donde $variable no sera lo mismo que $_REQUEST['variable'] si se tiene desactivado el register globals de esta manera solo se dejarian enviar desde fuera las variables que el programador indicase
Esta me parece una buena idea, distinguir de dónde vienen las variables y que el programador define cuales acepta y cuales no.
Al final no he tenido tiempo este fin de semana de echarle un ojo, pero algún día de estos lo haré!
Bye!
xrv
pepevi
Pregunta: Cómo se detectan los cheats de juegos como CS?
Pues es un tema a tener en cuenta como lo hacen (pero ya te digo que siempre hay alguno que se pasa las protecciones por el culín), igualmente he leido que para evitar ciertos hacks en counterstrike tiene que haber un admin juzgando lo que hace cada jugador para evitar ciertos tipos de hacks (un marrón, vamos).
Sergi, sería interesante que me mandaras un mail con un poco más de info de a lo que te refieres porque ando algo pez con eso que me comentas (i así de paso lo aprendo bien) :). hasta septiembre!!!
zigotica
marc,
ya q estas en contactos con macromedia, ¿por que no les pides que al instalarse el flash player el HTTP_ACCEPT lleve el nombre de la aplicacion y la version en una variable? (y que no lo neutralicen para IE con el tipico q=* o */* )
por cierto, aprovecho para despedirme hasta septiembre, tendreis noticias en meddle :)
pepevi
Bueno el flash no, pero el shockwave tiene un pedazo de soporte 3d, se ven juegos increibles en un navegador. Un tracker sería muy erótico. Ya que tienes amistades en las cúpulas altas de macromedia mándales un mail xDDDD
Pregunta: Cómo se detectan los cheats de juegos como CS?
xrv
yo creo que al player de macromedia le faltan muchas cosas, si meten esto para el js será un buen avance en este sentido, pero... y un buen traker de música? y un buen soporte para 3d? (con lo que pesa el player ya podrían tener cosas mu potentes...) ahora resulta que le van a meter soporte para AOL messenger (o algo así me ha llegado) ...
igualmente la protección de datos en cliente es algo MUY delicado (todo lo chungo al server).
seguiremos estudiando :P
dagi3d
creo que la solucion pasaria por obligar a que las variables enviadas desde fuera se interpretasen de distinta manera, tal como se hace con php donde $variable no sera lo mismo que $_REQUEST['variable'] si se tiene desactivado el register globals
de esta manera solo se dejarian enviar desde fuera las variables que el programador indicase
pd: menudos vagos estos de macromedia
xrv
Lo importante es minimizar la gente que puede acceder a segun que hacks. Esto es un hack que puede hacer cualquier pardillo (sin quere ofender a nadie) mientras que meter un sniffer o compilar un player crackeado es algo de nivel alto (para que engañarnos, cuantos de aquí saben usar un sniffer/firewall para modificar paquetes o cuantos de aquí se han compilado su propia versión del player? ... no creo que más de 1)
EDITADO LUEGO:
a ver, he tado jugando con shared object ... i tb se dejan petar (del mismo modo):
javascript:document.getElementsByTagName("object")[0].setVariable
("/mySol/data/:puntos",12345)
saludines
pepevi
hm... bueno, pero es que eso no soluciona nada porque no sólo está el flash player de macromedia, el código si no recuerdo mal está liberado y cualquiera puede crackear el propio player y deshabilitar esa propiedad.
xrv
Parece ser que se lo van a tomar en serio:
Marc Palau
Hi Deneb, thanks for your fast response.
What i'm thinking about is a way to "close" the comunication flash player
<->
javascript with an AS property (on System for example). I know that the
comunication flash player <-> javascript is necesary (I use on some
projects)
by, as u know maybe i don't need to use javascript on one of my aplications
and I want to disable this kind of comunication.
Obviously flash player can't see the object/embed params to see if he can
accept javascript or not, because someone can modify the property via DOM in
navigator bar (for example:
document.getElementsByTagName("object")[0].setAttribute("jscomunication","tr
ue");
The solution you mention to securify the application is a good solution, we
are thinking in another solution based on download a document with a random
named variables, but the caches/sniffers/firewalls can detect all this kind
of
security trys. Another solution i have in mind is generate random variables
at
fly and store the values inside and go comparing at every loop if the
augmented score is inside the posible range to augment.
Macromedia, Deneb Meketa
Hi Marc -
Your suggestion of an ActionScript variable or method to control access from
JavaScript seems like a great idea. I will propose this feature here at
Macromedia. I can't guarantee that it will be implemented, but I will see
what I can do.
However, even if this is eventually implemented, keep in mind that it will
not be perfect. A determined hacker can decompile your SWF, edit out the
ActionScript that says System.allowScripting = false, and do whatever they
like.
Thanks again.
d.
pues eso, un flipe para miiiii :P
xrv
y el ancho de banda de más que se gasta ... pero bueno, sigo viendolo un sistema seguro (se puede llegar a forzar mucho, pero ya se tendría que pasar unas horas para llegar a hacer un buen ranking).
veremos que va saliendo de todo esto (más opiniones?)
pepevi
bueno, no me convence del todo el sistema xD Sigue siendo fácil descompilar y mirar.
xrv
Marc Palau
Hi,
my apologies for my english, i know isn't good.
I found a way to inject variables in online flash Movies, the way is really
easy and maybe you know at this point. I write a little article for a
spanish
forum named domestika ( https://www.domestika.org/foros/viewtopic.php?t=26224
), the little article is in spanish (sorry). The way is to execute
javascript
in the navigation bar.
As you know you can execute javascript in an hyperlink with the
"javascript:"
prefix (example: <a href="javascript:alert('hi
macromedia');void(0);">alert</a>). In this way, all navigators give you the
hability of execute javascript in the navigation bar (where u insert the
URLs).
Then you can access the object/embed element with the SWF and modify the
propierties of what you want, example:
javascript:document.getElementsByTagName("object")[0].setVariable("/:variabl
e","value");void(0);
I think (if u don't know that) that at this point we can modify our
punctuation in a game rank (imagine that a big corporation do a contest
with
a coded game in flash and a simple guy give, for example, ASV and decompile
the movie, see all the vars in game and modify to get in first place).
I know that is work of the developer to secirify the application but, is
extremely hard to get a easy way to do this one for every game we do. Maybe
an
interesting solution is a flash property (not in the embed/object
attributes)
to securify this secuirty isue (i think is not a bug, i know this is a
completely legal way to execute javascript... but modify the flashVars is a
posibly security isue).
Well, thanks for read.
I'll wait your reply.
Deneb Meketa, Macromedia
Hello Marc -
Thanks for writing to us with your concerns.
The behavior you describe is deliberate, and we do not intend to change it
at this time. The SetVariable method is very useful for integration between
HTML and Flash content, and in order to prevent the kind of attack you are
talking about, we would have to disable it completely.
Client-side attacks are very difficult to prevent. When a technically
knowledgeable user is deliberately hacking content on their own machine,
there is not much that software can do to stop the user from changing the
way the client operates. This is why it is a long-standing tradition that
any important security restrictions must be enforced on servers.
High scores for games are a difficult case, because typically you can't keep
the game engine on the server; the game engine must be on the client for
performance reasons. So the evidence proving that a user really did achieve
a certain score is only on the client, which means that the server has to
trust the client, and hacking the client can successfully alter scores.
There are many ways that you could make it more difficult for hackers to
falsify their scores. Here is one example. You could have a system of
"checkpointing", where your client sends game-in-progress data to the server
periodically, and then the server rejects final scores unless they have been
preceded by realistic game-in-progress data that has arrived at reasonable
time intervals, and with data about the game that could only be known by
actually achieving the reported score (such as the checksum of a combination
of game variables). This would probably stop most casual gamers, and let
through only the most determined hackers.
Best of luck.
Sincerely,
Deneb Meketa,
Flash Player engineering.
xrv
Hoy he mandado un mail a macromedia a ver que me dicen respecto al tema :P
xrv
Voy a ampliar un poco el campo de acción de esto:
para modificar un array:
javascript:document.getElementsByTagName("object")[0].setVariable
("/array/:0","valor");void(0);
para modificar una propiedad de un objeto:
javascript:document.getElementsByTagName("object")[0].setVariable
("/objeto/:propiedad","valor");void(0);
para modificar el texto de un campo de texto dinamico:
javascript:document.getElementsByTagName("object")[0].setVariable
("/campodetexto/:text","valor");void(0);
esto realmente no tiene nada de especial, pero tenia fe ayer por la noche que no se pudiera acceder a una posición de un array o a una propiedad de un indice ...
bueno, aparte, tb estube ideando una posible solución más sencilla.
El flash nos genera una variable:
_root[i++]
y eso puede ser usado para guardar valores, a partir de eso se puede tener varias variables con nombres aleatorios mirando que sus compañeras no varíen en más del tope de puntos que se puede hacer en un movimiento... pero sigo sin verlo demasiado claro.
Entonces, estoy pensando que incluso se puede chafar funciones simplemente haciendo un setVariable del nombre de la función ...
weno, a ver q te curras zárate, yo sigo rallandome con el tema :)
juandelgado
Yo si tengo tiempo trato de hacer algo con todo lo que hemos hablado aquí... ¿recomendáis alguna librería de php para generar swf's?
xrv
el tema del cliente me lo estoy intentando currar yo, me lo toy tomando con calma ya que siendo agosto, me muero de calor estando delante de un puto pc y no tengo capacidad de pensar más de media hora seguida.
De momento ya tengo un juego donde hay 2 variables, el tiempo y la puntuación.
Seguiremos informando.
jipipayo, entonces si paso los datos de un php via ssl y es interceptado por un navegador que lo desencripte y lo muestre ... realmente no nos servirá ... eso es interesante, muy interesante.
Alguien en la sala sabe si es posible "decodificar" los datos que viajan a traves de SSL, como por ejemplo una línea con unos 20bytes (por decir algo) con algún plugin de mozilla o algun parche del exploter (me suena un poco juanker 31337 pero estamos intentando encontrar una posible solución :P) ???
Usuario desconocido
el tema de SSL no es la contenido de la encriptacion si no el estado de la misma, ya que en el momento en que se detecta que la comunicacion ha sido intervenida los datos se corrompen,(muy chapuzeramente explicado pero es mas o menos asin)
eso es muy bueno para evitar snifeos de los datos enviados.
entonces tenemos 2 niveles de seguridad: uno encriptación del canal (SSL), y encriptación de los datos (blowfish,md5 ,etc.)
se ve la diferencia?
ahora queda securizar el lado cliente: el puto fuckin flash delator
:D
pepevi
<fieldset>
ahora pregunto, si un navegador es capaz de desencriptar un ssl.... un tio con un poco de nivel no sabrá hacerlo tb?</fieldset>
si xD
pepevi
Zárate
Esto no me queda claro..... cómo sabe Flash qué número aleatorio debe mandar.... Creo que es el mismo problema que ya arrastramos.
En el servidor se genera una tabla de correspondencias mediante un número semilla y se compila en el swf esta tabla.
La tabla solo será válida en cada sesión con lo que descompilarlo (PARA OTRA SESION) es inútil.
El problema está que lo descompilen en la misma sesión.
xrv
md5 no es una opción valida, de que nos sirve que mandemos los datos en md5, el problema de este hack es que se puede modificar cualquier variable (esté donde esté) desde javascript. Entonces necesitamos tener un sistema que nos permita ir guardando los valores reales del juego en variables las cuales el usuario no tenga acceso a ellas.
El problema del sniffer/firewall es una tocada de cojones, pero pensemos por un momento... quien organiza campeonatos de juegos en flash con premios? empresas que tienen alto beneficio, entonces como dice zárate tenemos 2 públicos:
a) ricos
b) no tan ricos
a los del grupo (a) se les facilita un certificado de seguridad que mandará los datos encriptados al navegador (solo los nombres de las variables por ejemplo).
a los del grupo (b) se pasa eso mismo sin el certificado (la pasta es la pasta)
ahora pregunto, si un navegador es capaz de desencriptar un ssl.... un tio con un poco de nivel no sabrá hacerlo tb?
Seguiremos informando (zárate, sigue así que lo vamos a sacar por cojones :D)
juandelgado
pepevi
3- Se genera el flash con una tabla de puntuaciones basada en las imágenes de la función. El número o la función no se guardarían en este flash, solo en servidor.
Esto no me queda claro..... cómo sabe Flash qué número aleatorio debe mandar.... Creo que es el mismo problema que ya arrastramos.
Tengo la impresión de que sea cual sea el algoritmo de encriptación de la puntuación o el nombre de la variable que se envía con ella, NO PUEDE ESTAR EN LA PELÍCULA FLASH CUANDO SE COMPILA, porque te lo petan con un ASV en un tris.
Creo que necesitamos que Flash cargue dinámicamente ése código "seguro". Además necesitamos que el código sólo esté disponible 1 vez y en un archivo generado dinámicamente (con php se puede, no me voy a meter en ColdFusion por el tema de $$$$) con nombre aleatorio para que no sea accesible.
Por cierto:
Flash y md5
Sólo el enlace, no he probado nada.
Bye!
juandelgado
Ummmmmmmmmm...
Creo que llegamos a un punto en el que deberíamos dividir el tema en 2:
1 - Seguridad para clientes pequeños / medios
2 - Seguridad para clientes grandes
La mayoría de mis clientes no su pueden permitir un servidor seguro ni comunicaciones encriptadas, por lo que me contento con darles un método lo más seguro posible dentro de sus posibilidades: lenguaje servidor + flash + nuestra inteligencia : )
Luego a los clientes grandes ya les podremos sumar SSL y cosas por el estilo, pero me gustaría llegar al método más seguro posible sin eso, para que esté al alcance de más gente.
Por lo demás, dadme un par de horas para que relea y piense donde estamos : )
Bye!
cbp
juer, en lo que se he transformado este hilo. menos mal que ayer falté porque hace rato que no os sigo :?
sois unos mostros !!!
pepevi
XrV
<div class="quote">
pepevi
<blockquote>Con un firewall decente... repites la comunicación paquete a paquete. </blockquote>
</div>
Pues hagamos lo que hagamos no hay solución posible a eso, yo planteaba un sistema mucho más universal de hackeo, eso a la vista parece ser algo realmente dificil de saltar. Va bien ver otras posibles maneras de petar un flash, pensaré también en esta posibilidad.
El post larguísimo es precisamente para evitar el snifin, o sea podrán ver lo que se manda pero no sabrán qué es o como aumentarlo.
xrv
Wences
Ufff, cómo va mejorando este tema. Sois cojonudos ;)
+
Siiii, tengo unos cajones llenos de calzoncillos! :P
zigotica, yo tampoco he entendido muy bien como hackear la web de un banco con javascript, si es tan hamable pepevi de aclararnoss un poco el tema.
jipipayo
CONFERENCIA Y TUTO YAAAAA! icon_smile.gif
Fdo, Club de Fans de Tutoman (alias XrV)
Tienes la primera parte del tuto aquí mismo, el primer post, la segunda parte del tuto es algo un poco más complejo (ya que tengo que hacer un jueguecito con su ranking y plantearme como hacerlo, ya que ... es realmente jodío el tema :). Si alguien se anima a montar una solución rallandose a muerte, pos jojonúo.
eso de club de fans me la ha puesto morcillona, será que soy freak al extremo? (que no me lea mi madre que me quita el ordenador 2 semanas)
Usuario desconocido
Ufff, cómo va mejorando este tema. Sois cojonudos ;)
zigotica
lo del juego vale, pero no he pillado que tiene que ver lo de añadir tu js con la seguridad en webs de bancos.
xrv
pepevi
Con un firewall decente, logueas toda la comunicación que se realice entre cliente y servidor, localizas el paquete que manda la puntuación, lo modificas y repites la comunicación paquete a paquete.
Pues hagamos lo que hagamos no hay solución posible a eso, yo planteaba un sistema mucho más universal de hackeo, eso a la vista parece ser algo realmente dificil de saltar. Va bien ver otras posibles maneras de petar un flash, pensaré también en esta posibilidad.
Respecto a lo de remoting, que le peten, tenemos el MING en php que es gratixxxx :).
Ya me he puesto a hacer el tutorial y la posible solución, y estoy ahora haciendo un juego simple con un ranking con posibilidad de guardar los datos, seguiremos informando (arruff... esto tiene nivel ya eh :P)
eyeclipse
Diox, decid que sí, de lo mejor que he leido por el foro ;)
Mi faceta de programador no es tan amplia como me gustaría para poder aportar algo al post, pero animo a toda la tropa para que la cosa continúe evolucionando, si puede ser con el mismo dinamismo y entusiasmo, ya que así podré seguirlo medianamente como hasta ahora :D
Grácias a todos por tener inquietudes ;)
P.D.: y por saber plasmarlas estructuralmente :lol: