diego sevilla’s weblog
it is better to remain silent and be thought a fool,
than to open your mouth and remove all doubt -- groucho marx

30/3/2005

Un reto: crackear mi plugin

Filed under: español, blogging, código/code — Diego Sevilla @ 15:35 — In English

Crackear está bien. Sobre todo si se hace para aprender y los conocimientos se aplican para hacer el bien. Os propongo un mini-reto. Hace un tiempo desarrollé un plugin anti-spam para Wordpress (WP-Morph). No es porque lo haya hecho yo, pero es la caña :) . El resultado: ni un spam desde que lo puse. Incluso mostré en mi weblog el código fuente y también lo discutieron en BloggingPro. El único requisito del plugin es tener activo javascript para enviar comentarios. Las ventajas: ni un spam, por lo que no hace falta moderar los comentarios.

¿Cómo se consigue eso? Pues muy sencillo. El plugin genera para cáda página un código JavaScript aleatorio que el browser tiene que interpretar para conseguir un resultado. El browser entonces tiene que devolver el resultado de ejecutar el javascript como un campo más del formulario de comentario. Por ejemplo, un código al azar generado es el siguiente:

function go_anti_spam()
{
        eElement = document.getElementById("chk");
        if(!eElement){ return false; }
        else
        {
 v0=1368;v1=1581;v2=927;v3=802;v4=1280;v5=968;v6=1745;v7=1147;v8=661;v9=1376;v10=2086;v11=1539;v12=165;v13=1380;v14=1407;v15=114;if ( v15 > 2059)
                                    { v7 = v15; }if ( v15 > 1735)
                                    { v10 = v12; }if ( v11 > 1503)
                                    { v12 = v8; }v10=(v13-v5)%2514;v4=Math.abs(v4);
                                   v4%=26; while (v4--) {
                                   v0++; }v0=(v8+v12)%2514;eElement.value = (v0+v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v11+v12+v13+v14+v15)%2514;
            return true;
        }
}

El gran problema que les plantea esto a los spammers es que tendrían que hacer que sus programas de envío de comentarios automáticos supieran interpretar JavaScript… Hasta este punto de sofisticación no llegan. Sin embargo, aquí viene el reto:

Pensando se me han ocurrido al menos tres formas de saltarse el plugin de una forma más o menos sencilla (o al menos, en teoría). Una de ellas ya os la he dicho: Que los spammers tengan un programa que interprete también el javascript de la página (harto improbable).

¿Cuáles son las otras dos formas? Grandes premios para los acertantes. :D

27 Comments »

  1. ¿Enviando por POST al wp-comments-post.php directamente, falseando el referrer?

    Comment by Martín — 30/3/2005 @ 17:36

  2. No. El wp-comments-post.php REQUIERE los valores correctos del formulario. No lo he dicho ahí, pero el formulario ya contiene una variable que contiene el md5 de:

    1. valor resultado, y
    2. una clave interna del weblog (que pone el propietario del weblog)

    y wp-comments-post.php comprueba que ambos valores sean iguales después de aplicarles el algoritmo MD5.

    Comment by dsevilla — 30/3/2005 @ 17:59

  3. Amigos, yo he resuelto el karma del spam 100% (ni un spam en 2 meses) de una forma muy pero muy sencilla que paso a explicarles. Basicamente se basa en el anterior codigo que nos brindó diego (que verificaba un campo hidden fijo) pero con un truquito de javascript.

    en wp-comments.php
    agrego el siguiente campo al formulario (apox linea 58)

    Y en el codigo del boton submit de ese formulario (linea 80 aprox) agrego un evento javascript que cambie el valor del campo oculto anterior al hacer click.


    " />

    Simple y efectivo. El javascript se ejecuta en el cliente, y si no es un ser humano el que hace click, entonces no se carga la cadena correcta al campo.
    Sólo queda chequear esta variable post en el wp-comments-post.php agregando en algun punto del script el siguiente if (yo lo agregué en la linea 37 aprox, pero da igual)


    if ('spammers_a_cagar' != trim(strip_tags($_POST['check_spam'])) ) die( "Spammers, a cagar!" );

    Supongo que el codigo de Diego, al ser mas robusto será mas dificil de craquar, pero mi truquito me ha dado frutos, y por eso lo comparto para quien le sirva.

    abrazos.
    Matin Gaitan
    Argentina.

    Comment by Martin Gaitan — 30/3/2005 @ 18:18

  4. Marín, qué pena. No se ve tu código. ¿Podrías meterlo dentro de tags “pre”?

    Muy buena idea. El problema que tienes con tu solución es que solucionas el problema de hecho, pero no te limita a que algún spammer simplemente lea tu código y cambie la manera de enviar comentarios. En el momento en el que rellene todos los campos con los valores adecuados, podrá enviar spam. La diferencia con el plugin es que el valor que se genera cada vez es distinto y además tiene que ser ejetuado el javascript para saber el valor.

    De todas formas, tu solución es en efecto simple y limpia.

    Saludos!
    diego

    Comment by dsevilla — 30/3/2005 @ 18:25

  5. bastante garcha que suprima el codigo si está entre <code>…</code>, o no?

    se los dejo en mi wiki

    Comment by Martin Gaitan — 30/3/2005 @ 18:27

  6. Lo pongo de su web:


    <input type="hidden" name="check_tin" value="aun sin click" />

    y en el botón:


    <input name="submit" type="submit" tabindex="5" onClick="check_tin.value='spammers_a_cagar'" value="Comentar!" />

    ¡Buena definición! ¡A cagar! :P

    Comment by dsevilla — 30/3/2005 @ 18:28

  7. Pues diría que un programita en Visual C++ y MFC con un CHtmlView es capaz de acceder al código javascript y a la página entera actuando como si fuera un navegador. Solo hay que automatizar el proceso para que cargue la página, y ejecute varias acciones, volviendo a hacer lo mismo en repetidas ocasiones.

    Comment by sistemasorp — 30/3/2005 @ 20:38

  8. Tal como yo lo veo, uno de los puntos débiles del sistema está en que el nombre de la función que genera el número parece ser siempre constante, por lo que el robot:
    Buscaría si la página contiene el substring go_anti_spam(), buscaría el string go_anti_spam() y lo reemplazaría por document.getElementById(’chk’).value=’0′;
    Luego buscaría el campo de capcha de usuario, y lo inicializaría también a 0; de forma que ambos coincidan
    Siempre hay formas de saltarse un sistema así, que se haga o no, depende de cuanta gente utilice esta protección. Cuantos más sean, más vale la pena el esfuerzo de hackeo.

    function go_anti_spam()
    {
    eElement = document.getElementById(”chk”);
    if (!eElement)
    {
    return false;
    }
    else
    {
    v0=1368;v1=1581;v2=927;v3=802;v4=1280;v5=968;v6=1745;v7=1147;v8=661;v9=1376;v10=2086;v11=1539;v12=165;v13=1380;v14=1407;v15=114;
    if ( v15 > 2059)
    {
    v7 = v15;
    }
    if ( v15 > 1735)
    {
    v10 = v12;
    }
    if ( v11 > 1503)
    {
    v12 = v8;
    }
    v10=(v13-v5)%2514;
    v4=Math.abs(v4);
    v4%=26;
    while (v4–)
    {
    v0++;
    }
    v0=(v8+v12)%2514;
    eElement.value=(v0+v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v11+v12+v13+v14+v15)%2514;
    return true;
    }
    }

    ¿Cuales son tus dos formas de saltarlo?

    Comment by Guti — 30/3/2005 @ 20:50

  9. sistemasorp, sí, efectivamente, como decía, cuando una clase permita interpretar también el javascript y hacer como que pulsa el botón realmente, se podrá saltar la protección. El caso es que no es tan sencillo hacerlo. Ni siquiera con esa clase, porque si te das cuenta, es un “View”, una vista hacia el usuario, que se podrá automatizar, pero no es trivial.

    De nuevo, faltan dos maneras más al menos…

    Saludos!
    diego

    Comment by dsevilla — 30/3/2005 @ 23:11

  10. Guti, Pondré la solución mañana o pasado, así aumento la emoción :)

    En cuanto a lo que dices, no es posible. Si pones el valor a 0, incluso aunque pongas el otro valor a 0, ten en cuenta que se van a comparar el md5 del valor que devuelvas con el md5 que se envía al formulario y que se recibe tal cual. Ese md5 se genera a partir de una clave interna que sólo sabe el propietario del weblog.

    Las soluciones son bastante sutiles, así que mañana o pasado las haré públicas. A ver si hago un diagrama de flujo de información para que se vea más claro.

    Lo bueno de este sistema es que aún sabiendo cómo está implementado, no es nada fácil crackearlo (salvo si un spammer tiene un programa que es capaz de interpretar JavaScript).

    Saludos!
    diego

    Comment by dsevilla — 30/3/2005 @ 23:16

  11. Una forma sencilla es la siguiente:

    1/ Primero me bajo la página a local.
    2/ Cambio el método del formulario a GET y elimino el action.
    3/ Envío (esto no envía nada pero puedo ver el valor de los campos hidden del formulario, ya calculados por el javascript).
    4/ Me anoto el valor calculado y el MD5 de los parámetros. Estos dos valores ya son válidos para cualquier post de tu weblog.
    5/ Modifico mis robots de spam para que incluyan estos dos parámetros en mis ataques a tu weblog.

    Bueno, esta es la base, según el código fuente que he visto habría que añadir un tercer parametro que se llama checkpoint y tal. Pero bueno, creo que se entiende la idea ¿no?

    Un saludo.

    Comment by Juanjo Navarro — 31/3/2005 @ 7:47

  12. Bueno, yo creo que es más fácil que lo que apuntas. Con este ejemplo, o este otro, o este otro, o este otro se podría hacer lo que te comento. Como verás hay muchos ejemplos documentados de como interactuar con páginas web, y no solo interactuar con el javascript, sino hasta con el action script de los flash (aunque en los ejemplos que te he dado no venga como).

    Comment by sistemasorp — 31/3/2005 @ 9:16

  13. Juanjo: ¡¡Premio para el caballero!! :) Sí, esa es una de las formas. Esperemos que los spammers no se den cuenta :) Una solución a esto es cambiar periódicamente la clave interna del weblog. En la siguiente versión trabajaré en eso.

    Saludos!
    diego

    Comment by Diego Sevilla — 31/3/2005 @ 9:30

  14. sistemasorp: Sí, lo sé… Casi ningún método es totalmente efectivo… Si los spammers aprenden a hacer eso que pones en los ejemplos, tendré que idear otro método o poner un captcha, etc.

    Saludos y gracias por la información!
    diego

    Comment by Diego Sevilla — 31/3/2005 @ 9:32

  15. ¿Tengo ya medio premio? ;-)

    “Esperemos que los spammers no se den cuenta”

    Bien eso me recuerda una frase, que venía a ser algo así:

    “Hay dos tipos de ladrones de coches: Los que quieren robar “un” coche, y los que quieren robar “tu” coche. Contra los primeros basta cualquier método que se lo ponga más difícil que con el coche de al lado. Contra los segundos no hay ningún método que funcione.”

    Fíjate que yo reduje drásticamente mi spam (hace meses) por el simple hecho de cambiar el nombre de los cgi de comentarios y trackback (en MT). Si los spammers no se preocupan de saltarse esta forma sencilla, mucho menos se preocuparán del tuyo.

    Pensaré en la segunda forma, que quiero el premio completo :-)

    Comment by Juanjo Navarro — 31/3/2005 @ 9:39

  16. Esto es un proceso automatizado: Thu Mar 31 16:36:39 UTC+0200 2005

    Comment by sistemasorp — 31/3/2005 @ 15:36

  17. Bueno, pues como ves en el mensaje de arriba ya he crackeado el formulario. Si te vas a http://www.quejateportodo.com/crackspam veras un formulario. En la caja de texto pones la url del post del blog (en el ejemplo sale esta). Pulsais el botón Acceder y cuando este cargada la nueva página pulsas el botón Escribir, lo que provocará un mensaje igual que el anterior pero con la hora de tu sistema.

    El truco esta en usar el Internet Explorer o Firefox como interprete de javascript. Como de una ventana a otra no se puede ejecutar nada si estan en distintos dominios, la página php se encarga de leer la página remota, por lo que ambas estan aora en el mismo dominio y desde la primera se puede acceder a los campos de la segunda.

    El código del php es el siguiente:


    <?
    $h=fopen($HTTP_GET_VARS["url"],"r");
    if($h)
    {
    fpassthru($h);
    fclose($h);
    }
    ?>

    Bueno, pues reto superado, sin embargo, ¿es este alguno de los dos métodos que comentabas?. Un saludo.

    Comment by sistemasorp — 31/3/2005 @ 15:44

  18. Ah!! Eso no vale. El objetivo del juego es obtener dos formas “aparte” de interpretar el javascript. :-)

    Un saludo.

    Comment by Juanjo Navarro — 31/3/2005 @ 16:15

  19. Eso de “a parte” no estaba en las normas del concurso :) , y como se refiere a un programa que interprete javascript también (diferenciando a los navegadores) de momento es válido.

    En el anterior comentario se me olvidaba decir que aunque el programita en javascript es una chorrada, se podría modificar de tal forma que interpretara el xml del feed e iterativamente pusiese un comentario de spam en cada
    uno los post que hubiese en dicho feed.

    En cuanto al php, solo decir que ya teniendo el control de la página, puedo buscar y reemplazar cadenas con lo que puedo saltame muchas medidas de seguridad, como la que más arriba se pone del boton y el evento onclick.

    Comment by sistemasorp — 31/3/2005 @ 17:29

  20. Vaya, estoy impresionado, sistemasorp. Como ya dije, un programa que interprete javascript puede hacer eso. Sin embargo, tengo varias puntualizaciones sobre tu código. Todavía requiere firefox o internet explorer (según creo entender de tus comentarios y del código). Lo suyo sería que el proceso pudiera ser totalmente automático. Como has mostrado, se puede hacer, pero a lo que me refiero es a que los spammers no llegan hasta tanta sofisticación, porque con menos trabajo tienen acceso a millones de (otras) bitácoras para poner su spam.

    Aquí enlazo con el comentario de Juanjo sobre los ladrones de coches. Jaja, ¡¡cuánta razón tienes!! Efectivamente, la mejor medida anti-spam es estar “escondido en la maraña”. Si eres un weblog que no tiene muchos accesos y la gente no te conoce, los spammers tampoco te conocerán y no intentarán crackear tu sitio. Si eres muy conocido, habrá muchas personas intentando putearte, aunque sea por deporte…

    Y sí, efectivamente, eran formas sin usas Javascript :) A ver si a alguien se le ocurre la última forma y le doy el premio final. Si no, mañana publico las soluciones, incluyendo la impresionante de sistemasorp.

    Saludos!
    diego

    Comment by dsevilla — 31/3/2005 @ 18:14

  21. Bueno, pues como bién dices, solo hay que ponerle empeño para lograr un cosa. De ahi que sitios como barrapunto pongan imágenes en los comentarios donde el número o texto que aparece hay que ponerlo en una caja de texto. De momento ese es un bueén sistema para combatir el spam.

    Como bién dices, se necesita de un navegador para poder hacer lo que he comentado. Lo que pasa es que los spammers si llegan a ese nivel de sofisticación o aun mayor, solo hay que fijarse en como crean virus (o los encargan) que sirvan de pasarela para que los usuarios infectados envien spam sin que estos se den cuenta.

    Y si se trataba de no usar interpretes de javascript, entónces he de dar la razón a Juanjo Navarro, puesto que su versión no lo usa. Aunque quedaría bién hacer una implantación práctica de esa teoría :)

    Lo dicho. Un reto interesante donde todos hemos podido aportar nuestro granito de arena. Por cierto, al final de esta semana quitaré el codigo de crackspam para no tenerlo hay siempre y que te puedan fastidiar.

    Un saludo.

    Comment by sistemasorp — 31/3/2005 @ 18:52

  22. Muchas gracias, sistemasorp. Para mí también ha sido muy estimulante y he aprendido mucho.

    Mañana sin falta: La manera de romperlo que falta.

    Saludos!
    diego

    Comment by Diego Sevilla — 31/3/2005 @ 23:31

  23. Diego, cuando dices mañana …

    y no dices a partir de que dia …

    Venga, no nos tengas en ascuas

    Un saludo,

    Antonio

    Comment by malaga — 3/4/2005 @ 12:17

  24. Ahí lo tienes :P

    Saludos!
    diego

    Comment by dsevilla — 3/4/2005 @ 21:07

  25. hola! yo no veo mucho problema en ejecutar el javascript de la pagina y emular el navegador para romper la proteccion, pero claro. como bien han escrito en un comentario este esfuerzo solo estaria justificado si un numero muy muy grande de personas empleara wp-morph como unica proteccion contra el spam. en el momento de que cualquiera haga el script que ejecute el javascript del wp-morph se podria pasar rapidamente a cualquiera de las soluciones que hay por ahi lo cual no le quita merito a la efectividad del wp-morph y lo que defiendo es CONTRA EL SPAM MASIVO: LA DESMASIFICACION DE LOS METODOS ANTISPAM.
    pese a que segun el esfuerzo necesario para conseguirlo no este justificado crackear wp-morph en terminos de rendimiento de la campaña de spam. hay gente que lo haria por ocio y solo para joderte el coche.
    sobre lo de la metafora de robar coches y robar “tu” coche (que me ha gustado bastante):
    puedo contar acerca de la experiencia que tuve con el trencaspammers. que en un primer momento lo libere bajo la pretension de erradicar el spam de comentarios masivos en mi pagina y en las paginas de los colegas con quien habia hecho las pruebas (luego se fue pasando la voz). claro que no cai en lo que explican tb en un comentario anterior sobre que hay una diferencia entre robar un coche y robar “tu” coche. por lo que un tiempo mas adelante alguien se dedico a hacer un script para hacer ataques de inundacion de comentarios en mi blog y en los blogs de algunos que habian escrito comentarios en ella. este ataque consistia en que una vez el spammer leia el codigo del captcha, podia postear varias veces el mismo mensaje simplemente refrescando la pagina varias veces. esto no es precisamente un ataque masivo ya que es imposible automatizar el proceso de manera que no hiciera falta asistencia humana y por lo tanto no representaba un peligro de ataque masivo propiamente dicho. lo solucione con un simple cookie en una version del trencaspammers cuya referencia deje en un comentario para aquellos que pudieran sentirse amenazados por esta activida y de forma que a traves de una variable de sesion se evitara repetir 2 veces el mismo codigo… chapuza pero efectivo contra este ataque de inundacion teniendo en cuenta que el objetivo del plugin era rechazar el spam de comentarios sin gastar en muchos recursos ya que la gente con quien hice las pruebas del plugin tenian problemas en sus servidores de hosting para hacer funcionar las sesiones y no crei que un “spammer” tuviera interes en joder el coche de nadie en concreto ya que no es un esfuerzo no justificado para un spammer de verdad que quiere cientos de comentarios distribuidos en cientos de blogs, no 100 comentarios en 1 solo. pero bueno…. hay gente muy mala por ahi suelta. la version “oficial” del trencaspammers sigue siendo aquella que no usa las variables de sesion para evitar inundacion de comentarios ya que uno de los motivos por los que la gente se lo instala es porque hay otros plugin antispam que tienen unos requerimientos no soportados por su servidor de hosting.

    Comment by coffelius — 11/5/2005 @ 17:49

  26. just checking to see the behavior of the anti-spam plugin

    Comment by phpNeophyte — 12/5/2005 @ 22:49

  27. yo quisiera que me enseñaras a como aprender a crackear, la verdad apenas estoy empezando pero, tengo muchos deseos de aprender a crackear, espero que tu me puedas enseñar a hacerlo, por que yo creo que tu eres muy bueno con el programa de cracker, te admiro y yo solo lo quiero aprender por que en la escuela nadie lo sabe como apenas somos principiantes, y todos me critican no se como salir y ponerlos en su lugar, por eso yo quiero que tu me enseñes, espero que tu puedas

    Comment by gilmer david chimal bak — 6/6/2006 @ 16:43

RSS feed for comments on this post. TrackBack URI

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


Anti-Spam by WP-Morph 

Creative Commons License
This work is licensed under a Creative Commons License.
EWWV  AWStats  Site Meter 24 queries. 0.092 seconds. Powered by WordPress
406022 email messages processed in this box. 10858 were spam

0