Asterisk – INVITE attack

Cuando hablamos de VoIP, la mayoría de los ataques con éxito están relacionados con malas configuraciones. A parte de posibles 0-days que puedan surgir y permitan a un atacante hacerse con el sistema, hay infinidad de scripts y programas que no sólo intentan buscar y crackear cuentas de usuario, como el famoso sipvicious sino que hay un tipo de ataque en concreto que se ha hecho bastante conocido y que ha dado muchos quebraderos de cabeza.


A pesar de que es algo antiguo, se sigue viendo este tipo de ataques, por ejemplo, en este proxy SIP de pruebas que ha montado el amigo @linuxmaniac:

Feb 14 19:55:48 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:55:48 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:40879903080866@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:40879903080866@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJf94b43055bQNdlDwuK8IgNjjWNGgnp@184.106.171.219
Feb 14 19:55:48 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:55:48 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:0442032988742@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:0442032988742@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed94x2TTRksZHBKr@184.106.171.219
Feb 14 19:55:50 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:55:50 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:00442032988741@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:00442032988741@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed92FESbviHe6VIp@184.106.171.219
Feb 14 19:55:52 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:55:52 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:000442032988740@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:000442032988740@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed90LMpE7cf6xj0g@184.106.171.219
Feb 14 19:55:54 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:55:54 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:001442032988740@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:001442032988740@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed8eTxhaDNCbgBoV@184.106.171.219
Feb 14 19:55:56 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:55:56 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:9011442032988741@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:9011442032988741@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed8cEyW8PTMdM9xK@184.106.171.219
Feb 14 19:55:58 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:55:58 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:900442032988742@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:900442032988742@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed8a8PtrObFtggpA@184.106.171.219
Feb 14 19:56:00 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:56:00 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:011442032988743@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:011442032988743@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed87e4w6VZm12C7X@184.106.171.219
Feb 14 19:56:02 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:56:02 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:+9011442032988734@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:+9011442032988734@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed851dWaeL3kSQTp@184.106.171.219
Feb 14 19:56:04 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:56:04 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:+900442032988739@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:+900442032988739@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed832nfhK1PnDBhq@184.106.171.219
Feb 14 19:56:06 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:56:06 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:+9442032988740@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:+9442032988740@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493ed815SQTGS3vOzNl@184.106.171.219
Feb 14 19:56:08 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:56:08 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:9442032988741@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:9442032988741@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edbfyeVcmlm4Bi41@184.106.171.219
Feb 14 19:56:10 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:56:10 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:+90442032988742@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:+90442032988742@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edbdQOj7GUW7ft7P@184.106.171.219
Feb 14 19:56:12 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:56:12 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:90442032988738@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:90442032988738@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edbb5fzz8bUYCteH@184.106.171.219
Feb 14 19:56:14 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:56:14 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:+00442032988734@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:+00442032988734@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edb9p3RCA6IavNWv@184.106.171.219
Feb 14 19:56:16 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:56:16 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:+011442032988742@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:+011442032988742@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edb7SmzBrJIb3oOJ@184.106.171.219
Feb 14 19:56:18 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:56:18 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:+442032988741@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:+442032988741@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edb5efuPiaVPGrEN@184.106.171.219
Feb 14 19:56:20 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:56:20 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:+000442032988741@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:+000442032988741@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edb3gLzf7noBsq32@184.106.171.219
Feb 14 19:56:22 linux /usr/sbin/kamailio[8104]: INFO: <script>: FLT_ACC
Feb 14 19:56:22 linux /usr/sbin/kamailio[8104]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:1442032988742@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:1442032988742@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edb1wCL2P0rcTk2t@184.106.171.219
Feb 14 19:56:24 linux /usr/sbin/kamailio[8103]: INFO: <script>: FLT_ACC
Feb 14 19:56:24 linux /usr/sbin/kamailio[8103]: ALERT: <script>: INCOMING from unknown source M=INVITE RURI=sip:442032988734@XX.YY.ZZ.189 F=sip:unknown@184.106.171.219 T=sip:442032988734@XX.YY.ZZ.189 IP=184.106.171.219 ID=aJfA4b43055b3493edafyoQN4NAWd100@184.106.171.219

Llevamos 2 días sufriendo este ataque y la solución es fácil, bloquear la IP, pero como es un servidor de pruebas, estamos aprovechando para testearlo 🙂



Como podemos ver, hay alguien desde la IP 184.106.171.219 (de Texas – USA) que está enviando diferentes INVITEs, y tratando de hacer llamadas al Reino Unido. Además, está jugando con diferentes prefijos para ver si se salta las restricciones del Dialplan: con 00, 0044, +0044, etc.



Al contrario de lo que piensa mucha gente, NO es necesario estar registrado para realizar una llamada. El comando REGISTER únicamente sirve para que nuestro servidor de VoIP sepa que estamos ahí y si llega una llamada destinada a nosotros, nos la pase. Es decir, nosotros nos registramos y le indicamos nuestros datos al servidor para nos tenga localizados y sepa contactar con nosotros.

Por el contrario, a la hora de hacer una llamada, basta con enviar una petición (INVITE).



¿Qué ocurre cuando tratamos de realizar una llamada?
Da igual que marquemos 100 que marquemos 0044545454545, aunque nosotros visualmente pensemos que 100 es una extensión interna y lo otro un geográfico, para el sistema es sólo un número y lo que va a hacer es, tras recibir un INVITE, intentar conectar con el destinatario. Al ser una llamada externa, buscará en el contexto ‘default’.



Normalmente, tendremos algo así en nuestro extensions.conf (de forma muy resumida):

[internal]
exten => 100,1,Dial(SIP/100,30,t)
exten => 100,n,Hangup()
exten => 101,1,Dial(SIP/101,30,t)
exten => 101,n,Hangup()

[external]
exten => _X.,1,Dial(SIP/trunk/${EXTEN})

[phones]
include => internal
include => external

[default]
include => internal


Y en nuestro sip.conf incluiremos las extensiones en el contexto ‘phones’, para que puedan realizar llamadas tanto internas como externas:

[100]
type=peer
secret=xxxxxxxxxx
context=phones
[101]
type=peer
secret=xxxxxxxxxx
context=phones

De esta forma, al recibir una llamada, se intentará localizar únicamente las extensiones internas, que son las permitidas en el contexto por defecto. Del mismo modo que permitimos realizar llamadas fuera, a través del trunk, únicamente a los teléfonos registrados.


¿Qué es lo que hace la configuración de arriba?
En ‘internal’ se permite sólo llamar a las extensiones 100 y 101, pero en ‘external’ le estamos permitiendo realizar cualquier llamada (X puede ser cualquier número y el . indica cualquier longitud).


Por tanto, si pusiéramos en ‘default’ algo así:

[default]
include => internal
include => external

En este caso, estaríamos permitiendo a cualquiera que mande un INVITE, realizar llamadas a cualquier destino (sin necesidad de tener una cuenta registrada). Esto, aunque parece una tontería, ocurre mucho. Es un fallo tonto de configuración que nos puede salir muy caro. Y una muestra de que sigue ocurriendo esto es el ataque que hemos recibido tratando de sacar llamadas.


Los ejemplos los he intentado poner lo más sencillos posibles para una mejor comprensión, pero en realidad podemos (y debemos) discriminar los posibles destinos a los que permitimos llamar, y no poner .X_


Otra buena opción es poner en sip.conf la variable allowguest=no (que por defecto viene a yes, no se porqué) y que impide realizar llamadas a usuarios que no están dados de alta en el sistema.


Para comprobar si tu Asterisk es seguro puedes acceder aquí.


Y como lectura obligada:

http://www.sinologic.net/2007-05/una-configuracion-incorrecta-puede-costarte-mucho-dinero/

http://www.sinologic.net/blog/2009-02/la-voip-mal-configurada-llama-a-cuba/

http://www.sinologic.net/blog/2010-04/test-sip-sinologic/



Si quieres ver las posibles consecuencias de este tipo de ataques mira esto:

Warning! : Un Asterisk nos ha costado 15.000 Euros en un día


¿Quién me sigue en Twitter?

Son muchos los que viven obsesionados con su Twitter. ‘¿Tengo algún seguidor nuevo hoy?’ ‘¡mierda! ¡tengo 2 menos que ayer!’

Dado que no me fío mucho de las herramientas online que te exigen meter tu usuario y contraseña, he hecho unos pequeños scripts para ver mis seguidores, comprobar si me sigue la gente que yo sigo, etc.

Para comenzar, vamos a ver un sencillo script, al que pasándole dos usuarios, nos dice si se siguen entre ellos …

#! /bin/perl
# by Pepelux (@pepeluxx)

use Net::Twitter;

my $nt = Net::Twitter->new(legacy => 0);

my ($user1, $user2) = @ARGV;

unless($ARGV[1]) {
	print "Usage: perl $0 <user1> <user2>\n";
	exit 1;
}

my $res = $nt->friendship_exists($user1, $user2);

if ($res eq true) {    
	print "$user1 is following $user2\n";
}
else {
	print "$user1 is not following $user2\n";
}

$res = $nt->friendship_exists($user2, $user1);

if ($res eq true) {    
	print "$user2 is following $user1\n";
}
else {
	print "$user2 is not following $user1\n";
}

Y el funcionamiento es sencillo:

pepelux@debian:~/twitter$ perl amigos.pl 
Usage: perl amigos.pl <user1> <user2>

pepelux@debian:~/twitter$ perl amigos.pl pepeluxx chemaalonso
pepeluxx is following chemaalonso
chemaalonso is following pepeluxx

Aquí vemos que yo sigo al ‘maligno’ y él me sigue a mí.

pepelux@debian:~/twitter$ perl amigos.pl 
Usage: perl amigos.pl <user1> <user2>

pepelux@debian:~/twitter$ perl amigos.pl pepeluxx reversemode
pepeluxx is following reversemode
reversemode is not following pepeluxx

En este caso, Rubén no me está siguiendo, a pesar de que yo le sigo hace años … mmm }:->

Bueno, pues esto es un chorrada de script, la verdad, pero nos sirve para ver un poco cómo usar el API de Twitter con Perl.

Tras esto, pensé en hacer algo automático que me sacara toda la gente que sigo y verificara si ellos me siguen a mí, por lo que me creé este otro script:

#! /bin/perl
# by Pepelux (@pepeluxx)

use Net::Twitter;
use WWW::Curl::Easy;

my ($user) = @ARGV;

unless($ARGV[0]) {
	print "Usage: perl $0 <user>\n";
	exit 1;
}

my $curl = WWW::Curl::Easy->new;
my $nt = Net::Twitter->new(legacy => 0);
my $url = "https://api.twitter.com/1/followers/ids.json?cursor=-1&screen_name=$user";

$curl->setopt(CURLOPT_HEADER,1);
$curl->setopt(CURLOPT_URL, $url);

my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);
my $retcode = $curl->perform;

if ($retcode == 0) {
	my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
	$response_body =~ /\[([0-9|,]+)\]/;
	my @followers_id = split(/,/, $1);

	foreach (@followers_id) {
		print get_user($user, $_)."\n";
	}
} else {
	die("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n");
}

exit;               

sub get_user {
	my $user = shift;
	my $id = shift;
	
	my $url = "https://api.twitter.com/1/users/lookup.json?user_id=$id";
	$curl->setopt(CURLOPT_HEADER,1);
	$curl->setopt(CURLOPT_URL, $url);

	my $response_body;
	my $username = "";
	my $screenname = "";
	$curl->setopt(CURLOPT_WRITEDATA,\$response_body);
	my $retcode = $curl->perform;

	if ($retcode == 0) {
		my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
		$username = $response_body;
		my $pos = index($username, "\"name\"");
		
		if ($pos > -1 && length($username < 100)) {
			$username =~ /\"name\"\:\"(.+)\"/;
			$username = $1;
			$pos = index($username, "\"");
			$username = substr($username, 0, $pos) if ($pos > -1);
		}

		$screenname = $response_body;
		$screenname =~ /\"screen_name\"\:\"([a-z|A-Z|0-9|-|_|]+)\"/;
		$screenname = $1;
	} else {
		die("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n");
	}

	my $res = $nt->friendship_exists($screenname, $user);
	my $follow = "";

	if ($res eq true) {    
		$follow = " :: is following $user";
	}
	
	return "$username ($screenname - ID: $id)$follow";
}        

Pasando un usuario como parámetro, nos dice los seguidores que tiene y si le siguen a él o no:


pepelux@debian:~/twitter$ perl seguidores.pl
Usage: perl seguidores.pl <user>

pepelux@debian:~/twitter$ perl seguidores.pl pepeluxx
Paul Thompson (raganello - ID: 72968446)
Pablo Dom\u00ednguez  (PabloDgzRg - ID: 276615022)
Jes\u00fas (jesusninoc - ID: 231410165) :: is following pepeluxx
Darkasakerionz (Darkasakerionz - ID: 438326182) :: is following pepeluxx
p0is0n-123 (p0is0nseginf - ID: 434205269) :: is following pepeluxx
..........

La cosa pintaba bien pero de repente …

"error":"Rate limit exceeded. Clients may not make more than 150 requests per hour.

Cagontó!! 150 por hora??? imposible!!! Así que tras indagar un poco traté de hacer una validación de usuario con el curl pero parece que desde el 2010 no se puede, así que no me quedó otra que crearme un ID de desarrollador en https://dev.twitter.com/apps/new y modificar de nuevo el script, que quedó así:

#! /bin/perl
# by Pepelux (@pepeluxx)
# to get a key => https://dev.twitter.com/apps/new

use Net::Twitter;

my ($myuser) = @ARGV;

unless($ARGV[0]) {
	print "Usage: perl $0 <user>\n";
	exit 1;
}

# write here your API KEY data
my $consumer_key = "XXXX";
my $consumer_secret = "XXXX";
my $token = "XXXX";
my $token_secret = "XXXX";

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,
	);

# uncomment this line if you don't want to use an API KEY (only 150 requests)
#my $nt = Net::Twitter->new(legacy => 0);

my $cont = 0;

for ( my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor}) {
	$r = $nt->friends_ids({screen_name=>$myuser,cursor=>$cursor});
 
	while(@{$r->{ids}}) {
		my @ids = splice @{$r->{ids}},0,100;
		my $friends = $nt->lookup_users({user_id=>\@ids});
 
		foreach (@$friends) {
			my $user = $_;
			my $screen_name = $user->{"screen_name"};
			my $name = $user->{"name"};
			print $screen_name." ($name)";

			my $res = $nt->friendship_exists($screen_name, $myuser);

			if ($res eq true) {    
				print " => is following $myuser";
				$cont++;
			}

			print "\n";
		}
	}
    
	print "\nYou follow $#friends\n";
	print "You have $cont followers\n";
}

Si lo ejecutamos, podemos ver la gente que sigo y, de ellos, los que me siguen a mí:

pepelux@debian:~/twitter$ perl siguiendo.pl pepeluxx
sandrogauci (Sandro Gauci) => is following pepeluxx
borjalanseros (Borja Lanseros) => is following pepeluxx
k3170Makan (Keith Makan) => is following pepeluxx
virtualminds_es (I�aki R.) => is following pepeluxx
jordi_prats (Jordi Prats) => is following pepeluxx
JordanSec (Jordan)
bytemarehack (Daniel Torres) => is following pepeluxx
tinpardo (tinpardo) => is following pepeluxx
...........

Si queremos hacerlo a la inversa y listar todos los que nos siguen, usaríamos este otro script:

#! /bin/perl
# by Pepelux (@pepeluxx)
# to get a key => https://dev.twitter.com/apps/new

use Net::Twitter;

my ($myuser) = @ARGV;

unless($ARGV[0]) {
	print "Usage: perl $0 <user>\n";
	exit 1;
}

# write here your API KEY data
my $consumer_key = "XXXX";
my $consumer_secret = "XXXX";
my $token = "XXXX";
my $token_secret = "XXXX";

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,
	);

# uncomment this line if you don't want to use an API KEY (only 150 requests)
#my $nt = Net::Twitter->new(legacy => 0);

my $cont = 0;
my @followers;

for ( my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor} ) {
	$r = $nt->followers({ screen_name=>$myuser,cursor => $cursor });
	push @followers, @{ $r->{users} };

	for my $user (@followers) {
		my $screen_name = $user->{"screen_name"};
		my $name = $user->{"name"};
		print $screen_name." ($name)";

		my $res = $nt->friendship_exists($myuser, $screen_name);

		if ($res eq true) {    
			print " => $myuser is following";
			$cont++;
		}

		print "\n";
	}
    
	print "\nYou follow $cont\n";
	print "You have $#followers followers\n";
}

Y en este caso, al ejecutarlo, veríamos algo así:

pepelux@debian:~/twitter$ perl seguidores.pl pepeluxx
raganello (Paul Thompson)
PabloDgzRg (Pablo Dom�nguez )
jesusninoc (Jes�s) => pepeluxx is following
Darkasakerionz (Darkasakerionz)
p0is0nseginf (p0is0n-123) => pepeluxx is following
CharSecurity ([hat~se[urity) => pepeluxx is following
Darkvidhck (David Galisteo)
fpalenzuela (Pensador)
k3170Makan (Keith Makan) => pepeluxx is following
violetaromero3 (violeta romero)
..........

Estos scripts no es que sean muy útiles, pero nos sirven de iniciación para adentrarnos un poco en la API de Twitter. Toda la documentación está aquí: https://dev.twitter.com/

Saludos