By: Eduardo Almeida- 18/7/2011
Em: Server side, Ambientes & Linguagens - Comentários: 2 - Leituras: 2883
Após alguns dias envolvidos com projetos importantes e sem poder postar no blog, resolvi escrever um post bacana que retratasse bem o poder do Perl usado dentro do ambiente ASP.
Eu pensei em diversos temas, como Crawlers ou algo que demontrasse o poder absurdo do Perl para manipulação de texto, mas acabei escolhendo uma temática bem exótica se levada em consideração a cultura ASP tradicional, o tema escolhido foi: Port Scan.
Por que exótico? Basta se responder: quantos port scan rodando em arquivos ASP você ja viu?
Bom, antes de entrar na parte técnica, há alguns pontos que os "marujos" de plantão deveriam saber:
Todo port scan é baseado no uso de sockets. Atravé do sockets é que podemos nos "conectar" a outro computador na "porta X" e testarmos se ela está aberta ou fechada.
Um port scan para ser produtivo, precisa ter algumas features básicas como entrada de intervalos de porta a serem testadas bem como o uso de arquivos contendo host e portas a serem testadas. E assim foi feito.
Vamos ao código:
Arquivo: port_scan.aspl
< % @ LANGUAGE = " PerlScript " CODEPAGE = "65001 " % >
< %
use strict;
use warnings 'all';
use Win32::ASP;
use IO::Socket;
use base 'ASP4::FormHandler';
use vars __ PACKAGE __ - >VARS;
$Response->{Buffer} = 1;
$Server->{ScriptTimeout} = 99999999999999;
$Response->{CodePage} = 65001;
$Response->{charset}="utf-8";
my $versao = "v1.0";
my $host;
my $porta;
my $porta1;
my $porta2;
my $socket;
my $abre;
my @portas_abertas;
my @portas;
my @comandos;
my $count;
my $auto;
my $s;
my $p;
my $all;
my $f;
my $c;
my $r;
my $l;
my $localdohost = $Request->QueryString("localdohost")->Item();
my $modo = $Request->QueryString("modo")->Item();
my $portadeinicio = $Request->QueryString("portadeinicio")->Item();
my $portafinal = $Request->QueryString("portafinal")->Item();
#==>>> inicia programa
start();
@comandos[0] = $localdohost;
@comandos[1] = $modo;
@comandos[2] = $portadeinicio;
@comandos[3] = $portafinal;
if((@comandos[0] eq "") || (@comandos[1] eq ""))
{
print "Parâmetros incompletos
";
forma_de_uso();
}
$host = @comandos[0];
seta_variaveis();
#==>>> inicia programa
sub start
{
$host = "";
$porta1 = 0;
$porta2 = 0;
$porta = 0;
$socket;
$abre = "";
@portas_abertas = "";
@portas = "";
@comandos = "";
$count = 0;
$auto = "";
$s = 0;
$p = 0;
$all = 0;
$f = "";
$c = 0;
$r = 0;
$l = "";
}
sub forma_de_uso
{
print "
-==============================-==============================-=-
";
print " ASPL Portscan $versao
";
print "Forma de uso:
";
print "
port_scan.aspl?localdohost=HOST&modo=-s&portadeinicio=NUMEROPORTAINICIAL&portafinal=NUMEROPORTAFINAL
";
print "
port_scan.aspl?localdohost=HOST&modo=-p&portadeinicio=NUMEROPORTA
";
print "-==============================-==============================-=-
";
exit;
}
sub seta_variaveis
{
if(@comandos[0] eq "-a")
{
if($auto ne "")
{
print "Impossível automatizar o scan automatizado!
";
forma_de_uso();
}
if(@comandos[1] eq "")
{
print "Faltando parâmetro!
";
forma_de_uso();
}
$auto = @comandos[1];
automatizado();
}
if($auto ne "")
{
$count = 2;
}
else
{
$count = 1;
}
while((@comandos[$count] ne "") && (@comandos[$count] ne "#"))
{
if (@comandos[$count] eq "-p")
{
if(($s eq 1) || ($p eq 1) || ($all eq 1) || ($l ne ""))
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$count ;
if((@comandos[$count] eq "") || (@comandos[$count] < 1) || (@comandos[$count] > 65535))
{
print "Especificação de porta inválida!
";
forma_de_uso();
}
$porta1 = @comandos[$count];
$porta2 = @comandos[$count];
$count ;
$p = 1;
}
if(@comandos[$count] eq "-s")
{
if(($s eq 1) || ($p eq 1) || ($all eq 1) || ($l ne ""))
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$count ;
$porta1 = @comandos[$count];
$count ;
$porta2 = @comandos[$count];
if(($porta1 < 1) || ($porta2 > 65535) || ($porta2 < $porta1))
{
print "Especificação de porta inválida!
";
forma_de_uso();
}
$count ;
$s = 1;
}
if(@comandos[$count] eq "-all")
{
if(($s eq 1) || ($p eq 1) || ($all eq 1) || ($l ne ""))
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$porta1 = 1;
$porta2 = 65535;
$count ;
$all = 1;
}
if(@comandos[$count] eq "-c")
{
if($c eq 1)
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$count ;
$c = 1;
}
if(@comandos[$count] eq "-f")
{
if($f ne "")
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$count ;
if(@comandos[$count] eq "")
{
print "Você não especificou o nome do arquivo!
";
forma_de_uso();
}
$f = @comandos[$count];
$count ;
}
if((@comandos[$count] ne "-f") && (@comandos[$count] ne "-s") && (@comandos[$count] ne "-p") && (@comandos[$count] ne "-c") && (@comandos[$count] ne "-f") && (@comandos[$count] ne "-r") && (@comandos[$count] ne "-l") && (@comandos[$count] ne "") && (@comandos[$count] ne "#"))
{
print "Escolha de comando inválida!: @comandos[$count]
";
forma_de_uso();
}
}
chomp($host);
chomp($porta1);
chomp($porta2);
chomp($f);
chomp($l);
scanneia();
}
sub automatizado
{
if((@comandos[2] ne "#") && (@comandos[2] ne ""))
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
open(a_arquivo, ")
{
$f = "";
$f = ;
#chomp($f);
@comandos=split(/ /, $f);
$f = "";
if(@comandos[0] ne "#")
{
start();
$host = @comandos[1];
seta_variaveis();
}
for($count = 0; scalar(@comandos) >= $count; $count )
{
pop @comandos;
}
}
close(a_arquivo);
}
sub scanneia
{
if($f ne "")
{
open(arquivo, ">$f") || die "Impossível abrir o arquivo! $!
"; #Linux
close(arquivo);
}
$porta = $porta1;
print "
Scanneando $host...
";
$Response->Flush;
if($f ne "")
{
print "salvando para o arquivo: $f
";
$Response->Flush;
}
print "==============================
";
print " ASPL Portscan $versao
";
print " Written by Eduardow
";
print "==============================
";
print "Port\t\tStatus
";
print "==============================
";
$Response->Flush;
for($porta = $porta1; $porta Flush;
}
$abre = eval
{
$socket = new IO::Socket::INET
(
PeerAddr => $host,
PeerPort => $porta,
Proto => getprotobyname('tcp') || 6
)
};
chomp($porta);
if ($abre)
{
if($c eq 1){print $porta;}
print "\t\tAberta ";
push @portas_abertas, $porta;
$Response->Flush;
}
else
{
if($c eq 0)
{
print "\t\tFechada
";
$Response->Flush;
}
}
if(defined($socket))
{
close($socket);
}
}
print "==============================
";
print "Resultado Final:
";
$Response->Flush;
my $abre_p = sort {$a$b;} @portas_abertas;
if(($s eq 1) || ($all eq 1))
{
print scalar(@portas_abertas)-1;
print " portas abertas entre as portas $porta1 e $porta2 no host $host
";
#if(scalar(@open) >= 1)
#{
print "Porta\t\tStaus
";
print "=-=-=\t\t=-=-=
";
$Response->Flush;
foreach $porta (@portas_abertas)
{
if($porta>0)
{
print "$porta\t\tAberta
";
$Response->Flush;
}
}
#}
}
if($p eq 1)
{
if(@portas_abertas[0] ne "")
{
print "Porta $porta1 está ABERTA no host $host
";
$Response->Flush;
}
else
{
print "Port $porta1 está FECHADA no host $host
";
$Response->Flush;
}
}
if($f ne "")
{
salva_arquivo();
}
print "
";
}
sub salva_arquivo
{
open(arquivo, ">$f") || die "Impossível abrir o arquivo! $!
";
print arquivo "==============================\n";
print arquivo " ASPL Portscan $versao\n";
print arquivo " Written by Eduardow\n";
print arquivo "==============================\n\n";
print arquivo "Host: $host\n";
if(($s eq 1) || ($all eq 1))
{
print arquivo "Portas scanneadas: $porta1 à $porta2\n\n";
print arquivo "Resultado final:\n\n";
print arquivo scalar(@portas_abertas);
print arquivo " portas abertas entre as portas $porta1 e $porta2 no host $host
";
print arquivo "Porta\t\tStatus\n";
print arquivo "=-=-=\t\t=-=-=\n";
foreach $porta (@portas_abertas)
{
print arquivo "$porta\t\tAberta\n";
}
}
if($p eq 1)
{
print arquivo "Porta scanneada: $porta1\n\n";
print arquivo "Resultado final:\n\n";
if(@portas_abertas[0] ne "")
{
print arquivo "Port $porta1 está FECHADA no host $host
";
}
else
{
print arquivo "Porta $porta1 está ABERTA no host $host
";
}
}
}
%>
Com apenas uma linha (abaixo divida em 4 para maior compreensão) em Perl, podemos testar a disponibilidade de uma porta.
$socket = new IO::Socket::INET
(
PeerAddr => $host,
PeerPort => $porta,
Proto => getprotobyname('tcp') || 6
)
Quem quiser testar o port scan feito em ASP e Perl, basta acessar : www.web2solutions.com.br/port_scan.aspl
Sinopse
port_scan.aspl?localdohost=HOST&modo=-s&portadeinicio=NUMEROPORTAINICIAL&portafinal=NUMEROPORTAFINAL
port_scan.aspl?localdohost=HOST&modo=-p&portadeinicio=NUMEROPORTA
" ola preciso de uma porta aberta,qual? "
Por: Roger. Em: 16/2/2012
" Roger, não entendi sua pergunta "
Por: Eduardo Almeida. Em: 17/2/2012
Desde de 1998 ...
a WEB2 vêm desenvolvendo sites, softwares, implementando ambientes servidores,
prestando consultoria na área de segurança para diversas empresas
como bancos, imobiliárias, agências, cartórios, escritórios de advocacia e até
empresas multi-nacionais. Trabalhamos para criar
experiências intuitivas para os usuários, desenhar interfaces ricas e
elegantes, desenvolver aplicativos úteis, consolidar sites e produtos
que ajudamos a criar, seja desenvolvendo, analisando ou melhorando sua performance. Resumindo, construímos "business" para internet.
Copyright © 2012 WEB2 Soluções LTDA. CNPJ: 14.832.733/0001-05.