sábado, 3 de marzo de 2012

Tutorial: construyendo "Kidnapped Trending Topics" (0verKTT.pl v0.2)

Saludos,

Antes que nada quiero aclarar que yo no soy programador, y que por ello la gente que sí se dedique a la programación quizás se encuentre muchos errores básicos en el script. Mi única intención con este breve tutorial es acercar un poco el cómo pasar de una idea abstracta en la cabeza a una herramienta. Dejando esto claro, continúo.

La idea de la herramienta que tenía era la de un bot spammer automático que twiteara un mensaje de spam en los Trending Topics del momento, y que además esta herramienta se pudiera coordinar con otros ordenadores que también la tuvieran corriendo, para realizar de esta forma un floodeo con el mismo mensaje. Por lo tanto teníamos que resolver los siguientes problemas:

1) Conseguir loguearnos en Twitter y poder escribir tweets
2) Averiguar los TTs del momento
3) Coordinar el ataque


--[0x01 Trabajar con Twitter: misión API]---->


Lo primero que tuve que hacer fue investigar cómo diablos poder autenticarnos desde una aplicación en twitter y tener acceso a la API, respuesta que encontré en un documento de la sección de twitter para desarrolladores. De ahí pude sacar en claro que para poder postear tweets era necesario previamente una autenticación 0auth, consistente en un par de claves asignadas a la herramienta y otro par de claves asignado al usuario. Para poder obtener dichas claves se debe de registrar previamente el proyecto de la herramienta en Twitter Developers (cuentas falsas, cof cof), donde tendremos que seleccionar qué permisos queremos darle a la herramienta.

Una vez descubierto cómo tener acceso a la API de twitter sólo restaba averiguar si tenía que hacer todas las conexiones en crudo o existía algún wrapper que me permitiera agilizar las operaciones, por lo que hice una búsqueda en CPAN y me encontré con que existía un módulo llamado Net::Twitter para tal fin. Consultando su documentación podía verse que para la autenticación no había ningún misterio, simplemente asignar a las variables necesarias:

Código: Perl

use Net::Twitter;

my $nt = Net::Twitter->new(
traits => [qw/OAuth API::REST/],
consumer_key => $consumer_key,
consumer_secret => $consumer_secret,
access_token => $token,
access_token_secret => $token_secret,
);



$consumer_key y el resto de variables son las claves que nos dieron al registrar el proyecto de la herramienta.



--[0x02 Extraer los TTs del momento]---->

El siguiente paso lógico es averiguar cuales son los TTs para poder postear en ellos. Los TTs podemos encontrarlos en formato JSON en la URL http://api.twitter.com/1/trends/1.json , por lo que para poder extraer los datos que nos interesan tenemos que tirar de regexp o usar un módulo, que en este caso se llama JSON y permite el trabajo con los datos de estos ficheros de forma sencilla. Luego en resumidas cuentas tenemos que lanzar una petición GET al archivo 1.json y después extraer de él los datos que nos interesan:

Código: Perl

use LWP::UserAgent;
use JSON;

sub sacarTT {

$nav = LWP::UserAgent->new;
$nav = $nav->get('http://api.twitter.com/1/trends/1.json');
$nav = $nav->decoded_content;
$json_result = from_json($nav);

return $json_result;

}


Como podemos comprobar estoy usando una subrutina que me devolverá el contenido de 1.json decodificado.


--[0x03 Coordinar el ataque]---->

El siguiente problema a resolver es encontrar una forma simple y efectiva de poder coordinar todas las herramientas, de tal forma que todas posteen el mismo mensaje, además de que en caso de que el mensaje cambie, la herramienta detecte este cambio y postee el nuevo mensaje. Tras pensarlo detenidamente he creído sacar en claro que la manera que aporta más ventajas es a través de .txt localizados en algún servidor. Es decir, se colocaría un .txt con la frase en un servidor, y todos los usuarios de la herramienta tendrían que pasar como parámetro la URL donde se encuentra el mensaje. Las ventajas que encuentro a este sistema es que es independiente de las herramientas, puede modificarse el .txt rápidamente, pesa poco y se puede ir cambiando la localización de éste en distintos servidores. Si se quiere rizar el rizo se podría aplicar algún tipo de encriptación, pero en mi caso no lo he hecho.

Por lo tanto con que la herramienta haga una simple petición GET al archivo .txt y lea el contenido será suficiente:

Código: Perl

sub actu {

$nav = LWP::UserAgent->new;
$nav = $nav->get($_[0]);
$nav = $nav->decoded_content;

return $nav;

}






--[0x04 Twitteando que es gerundio]---->

Habiendonos autenticado ya, extraído cuales son los TTs, y conociendo qué mensaje queremos dar, sólo nos queda twittear. Para ello tiraremos de un bucle foreach que aplicaremos a lo que nos devuelva la subrutina &sacarTT para ir sacando los hashtags, los cuales serán añadidos al mensaje de SPAM, e ir actualizando nuestro estado:

Código: Perl

$TT = &sacarTT;
foreach $trend (@{$TT->[0]->{'trends'}}) {

$xc = $trend->{'name'};
print $xc . "\n";
$spam = $Tweet . " " . $xc;
$nt->update($spam);
sleep 45;
}

}


Podeis ver que no tiene misterio alguno ya que gracias al uso de módulos todo el código se resume en apenas unas pocas líneas.



--[0x05 Detalles finales]---->

Por último sólo nos queda atar algunos cabos sueltos, como es que la herramienta sea "automática", o en otras palabras, que trabaje en un bucle infinito:

Código: Perl

while(true) {

Código que se tiene que repetir

}



Además de comprobar si se le ha pasado el argumento con la URL:

Código: Perl

$ARGC = @ARGV;
if ($ARGC != 1){
print "\nUso: 0verKTT.pl <url del txt>";
exit(0);
}




--[0x06 Código completado]---->

El source de la herramienta una vez integrado todo sería el siguiente:


Código: Perl


#Tutorial para CPH
#Codeado por The X-C3LL
#http://0verl0ad.blogspot.com


use Net::Twitter;
use LWP::UserAgent;
use JSON;

my $consumer_key = "";
my $consumer_secret = "";
my $token = "";
my $token_secret = "";


$ARGC = @ARGV;
if ($ARGC != 1){
print "\nUso: 0verKTT.pl <url del txt>";
exit(0);
}


print q(
-===Kidnapping Trending Topics v0.2 Public===-
By The X-C3LL



);

print "[-->] Autenticandonos en Twitter... \n";

my $nt = Net::Twitter->new(
traits => [qw/OAuth API::REST/],
consumer_key => $consumer_key,
consumer_secret => $consumer_secret,
access_token => $token,
access_token_secret => $token_secret,
);



while(true) {


print "[-->] Conectando con el servidor [" . $ARGV[0] . "]...\n";
$Tweet = &actu($ARGV[0]);
print "[-->] Tweet actual... " . $Tweet . "\n";
print "[-->] Trends Spammed...\n\n";



$TT = &sacarTT;
foreach $trend (@{$TT->[0]->{'trends'}}) {

$xc = $trend->{'name'};
print $xc . "\n";
$spam = $Tweet . " " . $xc;
$nt->update($spam);
sleep 45;
}

}

sub sacarTT {

$nav = LWP::UserAgent->new;
$nav = $nav->get('http://api.twitter.com/1/trends/1.json');
$nav = $nav->decoded_content;
$json_result = from_json($nav);

return $json_result;

}


sub actu {

$nav = LWP::UserAgent->new;
$nav = $nav->get($_[0]);
$nav = $nav->decoded_content;

return $nav;

}




--[0x07 Comentario final]---->

Esta herramienta está diseñada para aprender, no para ser usada, con esto quiero decir que espero que no sea usada por la jauría de Skiddies para jugar a los Anonymous. Como dije al principio no soy programador, por lo que habré errado en cosas simples, y probablemente habré hecho las cosas de la forma menos eficiente, pero si a alguien le sirve, bienvenido sea.
5 0verl0ad Labs: Tutorial: construyendo "Kidnapped Trending Topics" (0verKTT.pl v0.2) Saludos, Antes que nada quiero aclarar que yo no soy programador, y que por ello la gente que sí se dedique a la programación quizás se ...

2 comentarios:

Anónimo dijo...

Hey, tío estúpido, es "Vulnerabilities", no Vulnerabilitys"

The X-C3LL dijo...

Hey, anon gayer, ya está corregido.

< >