ASPL Port Scan - um poderoso port scan feito pra rodar online


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?

Vamos ao que interessa

Bom, antes de entrar na parte técnica, há alguns pontos que os "marujos" de plantão deveriam saber:

  1. ASP não é linguagem, é originalmente uma especificação de uma "API" do IIS. Assim como toda especificação, ela pode ser portada para outras plataformas e sistemas operacionais.
     
  2. ASP no IIS pode ser codificado em diversas linguagens diferentes: VBScript, JScript, Perl, Python, PHP, etc.

  3. ASP, além de ser nativo no IIS, foi portado para diversas plataformas: ASPL, ASP4 (Apache::ASP) e o Sun Java Systems Active Server Pages (ChiliASP).

  4. Perl é uma linguagem muito poderosa e madura apesar de não ser muito conhecida de desenvolvedores que "consomem tecnologias hype". É utilizada em grande escala em aplicativos de diversos tipos, que vão desde softwares de roteadores, softwares baseados em GUI até à web.
     
  5. Perl já foi portado para mais de 100 plataformas diferentes. Isso quer dizer que "funciona" em diversos sistemas operacionais, sejam eles windows, linux ou unix.

  6. Há várias formas de se programar em Perl para web, porém escolhi ASP para aplicativo deste post por ser uma forma mais fácil de se ensinar Perl aos desenvolvedores desse ambiente. 

Criando o port scan

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
"; } } } %>

A mágica

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
            )

Testando o Port Scan

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



Por favor, confirme ser uma pessoa respondendo abaixo:

Comentários

" 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


buscar na WEB2:

pesquisar

receber nossa newsletter:

participar da newsletter

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. Microsoft Partner

PostgreSQL Perl