La guerra de los bots

Antecedentes

Durante todo el mes de Abril, en canal once, se hicieron una serie de encuestas para escoger un programa del cual transmitirían un maratón los días viernes, mi primera incursión en esto fue para demostrar una teoría (bastante cínica, debo reconocer) respecto a la tendencia de la gente de sumarse a la opinión de los demás, en la primera semana competían un programa que ya se venía transmitiendo en ese canal "Exploradores de la Historia" contra un programa que recién había comenzado a transmitirse llamado "Walter y Tandoori"; desde luego el nuevo programa no contaba con el respaldo de nadie, pues se conocía poco, por lo que la encuesta estaba inclinada por más de 1000 votos a favor de "Exploradores de la Historia" (como dice el dicho, más vale malo conocido, que bueno por conocer...); así que dí mi voto por el nuevo programa, con el fin de analizar cómo funcionaba el sistema de encuestas, para lo cual use un plugin de firefox llamado "Live HTTP Headers". Lo primero que me salto, fue un "sistema" que prevenía el uso de bots y me pedía poner el resultado de la suma de dos números, pero como es un canal para niños los números no eran mayores a 10 jeje.

El resultado obtenido mediante "Live HTTP Headers":


http://www.oncetv-ipn.net/onceninos/vota/votar_3.php?answer=v2&pregunta=18&n1=5&n2=4&S=9&suma=9&submit=+++++votar+++++

GET /onceninos/vota/votar_3.php?answer=v2&pregunta=18&n1=5&n2=4&S=9&suma=9&submit=+++++votar+++++ HTTP/1.1
Host: www.oncetv-ipn.net
User-Agent: Mozilla/5.0 (Windows NT 5.1)
Cookie: blablabla
Connection: keep-alive

Vale aclarando un poco todo ese rollo, en azul la palabra GET indica el método usado por nuestro querido protocolo HTTP, en rojo están los llamados Headers, puede que no lo sepan pero su equipo los envía todo el tiempo al servidor al que se conectan y sirven para muchas cosas diferentes, entre otras saber si nuestra sesión es válida, de donde viene nuestra petición, etc, etc.

Lo interesante de todo esto es en si mismo la consulta de la cual señale en color fiusha el script en el servidor que es mandado a llamar y en azul los parámetros pasados a dicho script.
Ahora a analizar con detenimiento los parámetros:

answer=v2    indica por que pregunta estamos votando
pregunta=18  el número de pregunta a la que estamos respondiendo
n1=5         el primer número de la validación anti-bots (XD!!!)
n2=4         el segundo número de la validación anti-bots
S=9          el resultado de la suma de los anteriores y que tuve que escribir
suma=9       mismo número 
submit=+++++votar+++++  acción a realizar (o lo que es lo mismo la función dentro del script a ejecutar, seguramente el servidor quita los símbolos de "+" innecesarios).

Una vez que tuve esta información mi primer pregunta fue, ¿qué pasa si uso repito la consulta?, esto lo hice para saber si la cookie estaba siendo usada para algo en la seguridad o solo era un adorno jajajaja, bueno el resultado fue que obtuve un voto más. Acto seguido usé la misma consulta en otro navegador para terminar de comprobar que se pudiera usar y que no importaba tener o no tener cookie, así lo hice y como obtuve un voto más, me dí cuenta de que no existía nada que me impidiera reciclar la consulta previa, por lo tanto ya tenía una forma de hacer lo que me viniera en gana, ahora podía poner en práctica mi teoría...

Un poco de maldad

Como dije antes el propósito del experimento era ver que tan fácil era influenciar la opinión de la gente, ya explique al principio que el programa "Exploradores de la Historia" ganaba por más de mil votos, y el porque votaban por él, pero, ¿qué pasaría si un número suficientemente grande de "personas" votaran por el otro programa?, ¿más personas creerían que es tan bueno que merece la pena su voto y seguirían la tendencia?; bueno sólo había una forma de probarlo, con esto en mente y luego del análisis de como funcionaba el sistema de encuestas, decidí hacer un script que se encargará de otorgar unos 7000 votos a favor de "Walter y Tandoori" así el programa tendría al menos 5000 votos a favor y de acuerdo a mi teoría la gente votaría por él, pensando que era mejor que el otro (después de todo más de 5000 "personas" no podrían estar equivocadas jajajajaja), es posible que ya hayan imaginado en que lenguaje programe el script, jajajaja, Python mi navaja suiza personal.

import os
comando = "curl --url \'http://www.oncetv-ipn.net/onceninos/vota/votar_3.php?answer=v2&pregunta=18&n1=5&n2=4&S=9&suma=9&submit=+++++votar+++++'" + " -o prueba"
for x in range(7000):
    os.popen(comando+str(x)+".html")
os.popen("rm *.html")
print 'completado!!'
Pocas líneas, poca maldad y un propósito concreto, una vez hecho esto, deje que la gente votará por quién ellos quisieran (claro había un poco de influencia y tendencias, pero aún así era su decisión jeje).

El resultado del experimento:



La teoría estaba probada, yo solo hice creer que al menos "5000" personas respaldaban el programa y la gente hizo lo que yo pensaba, se sumo a lo que la "mayoría" consideraban mejor.


El inicio de una guerra

En las semanas siguientes me abstuve de influenciar las encuestas, sin embargo en está última semana alguien más decidió jugar con los resultados, lo que dio por resultado algo que seguramente el personal del canal no pasará por alto debido a la cantidad de votos con los que terminó la encuesta.

Para el día martes 23 de Abril a las 16:39 aproximadamente, la encuesta de la semana iba de la siguiente forma:


Aunque debo reconocer que "El mundo de Beakman" siempre me ha gustado, tanto como un par de monstruos cómo yo queríamos que ganará "Historias Horribles", que pesé a que tiene poco tiempo al aire ha conseguido mucho publico jeje, cómo iba ganando decidí no intervenir, sin embargo, me dí cuenta de que algo extraño estaba pasando.
Hagamos una consideración llegados a este punto, a 21 horas de iniciada la encuesta la votación estaba como ya se mostró, lo cual indica que tenían una tendencia de 458 / 467 votos por hora, respectivamente, pero eso cambio y para el miércoles por la noche la tendencia mostraba como una clara ganadora a "Historias Horribles" con más de 18000 votos, no es un secreto para nadie que soy un animal de hábitos nocturnos y como había dejado abierta la página, decidí refrescarla y mi sorpresa fue grande, para las 01:49 hrs del jueves 25 de Abril todo había cambiado:


Cerca de las 21 hrs del miércoles 24, "Historias Horribles" tenía unos 31000 votos, mientras que "El mundo de Beakman" tenía apenas unos 13000 y unas pocas horas más tarde un milagro había ocurrido, 20000 votos en la madrugada jajajajaja, estaba claro que alguien quería que ganará "El mundo de Beakman". 
Por lo que decidí darle una pequeña ayuda a "Historias Horribles", pero por alguna razón el mismo truco no funcionó, quizá se habían dado cuenta de su fallo la vez anterior, como sea, si usaba la misma consulta más de 10 veces seguidas, la conexión no terminaba e impedía que las siguientes peticiones fueran hechas, así que pensé en generar mis propias consultas, porque al final eso pasaría inadvertido quizá...

Así que luego de una modificación, para las 08:43 hrs del jueves, la encuesta quedaba así:



Durante el transcurso del día las cosas se mantuvieron más o menos en orden, pero entre las 18:00 y las 19:45 del jueves la votación fue nuevamente alterada con otra inyección de más de 10000 votos, quedando de la siguiente manera:


Eso ya era demasiado, sin embargo para las 23:00 "El mundo de Beakman" ya tenía más de 69000 votos, así que decidí modificar más el script hasta convertirlo en un pequeño bot, no solo inyectaría votos usando sus propias consultas, ahora cambiaría de "User-Agent", para fingir ser otro navegador diferente, además de volver a inclinar la balanza lo dejé listo para inyectar poco a poco, usando de la librería time la función sleep(), es decir inyectaría un voto cada "n" segundos, sólo para asegurarme de que todo siguiera en orden jeje, para el viernes a las 01:49 hrs las cosas estaban así jeje, yo había respondido de manera firme a la declaración de guerra...


Victoria?

Cómo era de esperarse, recibiría una respuesta de parte de un adversario invisible y de quien en realidad sospecho que era el mismo personal de canal once, la respuesta llego en las primeras horas (laborales) de la mañana de hoy, para las 11:40 hrs mis pequeño bot había sufrido un revés...



Había perdido una batalla pero no la guerra, decidí levantar más bots sin embargo el juego no era limpio, llegado a cierto punto tome el tiempo y cada segundo mi oponente estaba inyectando 7.6 votos, había que tomar medidas drásticas así que recurrí a usar mis bots mediante un par de maquinas virtuales conectadas a diferentes redes, alteré el time.sleep() para que no durmiera más y entonces lance un ataque bastante hostil debo de reconocer, pero para las 13:05 hrs. mis bots (10 en total) ya habían ganado la guerra...



Mi oponente no se rindió, sin embargo estaba claro que la diferencia entre nuestros bots era inmensa, deje que mis bots a partir de ese momento descansarán nuevamente usando el time.sleep() pero ahora ya no era una sola maquina, ni una misma red, la guerra de los bots fue ganada.
Espero que de esto la gente del canal cambie sus políticas en futuras encuestas, pues aunque hice algo no debido y me siento mal por ello, no es ilegal, pues su campaña dice claramente vota las veces que quieras y su sistema "anti-bots" era sólo un título pretencioso, el resultado final de la guerra...


Al final en una guerra no hay vencedores, sin embargo me divertí viendo "Historias Horribles" jejeje

SaluDoS!!!

Comentarios

  1. Jajajajaja al leer la reseña también me divertí.

    ResponderEliminar
  2. muy buen artículo, solo me pregunto de donde habrás sacado los bots, espero que hayan sido máquinas tuyas jaja

    ResponderEliminar
  3. genial artículo, si las cosas se ponían pesadas podías usar proxies dinámicas para cambiar tu IP en cada consulta

    ResponderEliminar
    Respuestas
    1. jajajajajaja si, quedó aclarado que virtualice maquinas para levantar mis bots, nunca podría haber dejado que fuera de otro modo, saluDoS!!!

      Eliminar

Publicar un comentario

Tu opinión es importante compartela...

Entradas populares de este blog

Detener la sincronización de tiempo/fechas entre Host y Guest en Virtual Box

Extraer datos de un archivo.mdb (Access) con python

Solución al problema con odbc pgsql (postgresql) en Windows 7 de 64 bits