Scanner com porta mais curta

8

Escreva o programa mais curto que tentará se conectar às portas abertas em um computador remoto e verifique se elas estão abertas. (É chamado de Port Scanner )

Obtenha entrada dos argumentos da linha de comando.

your-port-scanner host_ip startPort endPort

Suponha que startPort <endPort (e endPort - startPort < 1000)

Saída: Todas as portas abertas entre esse intervalo devem espaço ou vírgula separadas.

st0le
fonte
Existem razões legais para usar scanners de portas? Exceto para impedir que outras pessoas invadam sua rede fechando portas desnecessárias?
Alexander Craggs

Respostas:

5

sh / netcat, 39

nc -vz $1 $2-$3 2>&1|cut -f3 -d\ |xargs

O Netcat faz a varredura e retorna os resultados neste formulário em erro padrão:

localhost [127.0.0.1] 22 (ssh) open
localhost [127.0.0.1] 25 (smtp) open

cute xargsextraia o número da porta e faça uma única linha.

Lembre-me de desligar o SMTP nesse nó.

JB
fonte
3

Perl, 92

$_='use I;$h=shift;grep I->new("$h:$_"),shift..shift';
s/I/IO::Socket::INET/g;@_=eval;say"@_"

Perl 5.10 ou posterior, execute com perl -E 'code here'.

Usos expressões regulares para comprimir tanto tempo IO::Socket::INET, então eval; formatação final feita com interpolação de matriz.

Por solicitação, uma explicação mais detalhada. Para ungolf, primeiro vamos redefinir o espaço:

$_ = << 'EOC';
  use I;
  $h = shift;
  grep I->new("$h:$_"), shift..shift;
EOC
s/I/IO::Socket::INET/g;
@_ = eval;
say "@_";

A linha anterior à evalsubstitui todas as (duas) ocorrências de 'I' por 'IO :: Socket :: INET', que é um truque padrão de golfe Perl para reduzir o impacto de inevitáveis ​​identificadores longos. Nomeando alguns dos temporários, o código é equivalente a isso:

use IO::Socket::INET;
$h = shift;
$p1 = shift;
$p2 = shift;
@_ = grep IO::Socket::INET->new("$h:$_"), ($p1 .. $p2);
say "@_";

Em poucas palavras: leia os argumentos do host e do intervalo de portas na linha de comando; tente uma conexão com todos eles em sequence ( IO::Socket::INET->new()); mantenha uma lista daqueles que conseguiram ( grep); exibir o resultado bem ( say).

JB
fonte
não consigo entender de alguma forma :( parece com a mais profunda magia negra para mim: P mas ainda um +1 para estranheza
masterX244
@ masterX244 Eu detalhei um pouco as entranhas. HTH
JB
1

sh / nmap / GNU grep / xargs - 36

nmap -p$2-$3 $1|grep -Po '^\d+'|xargs

Segue as especificações de entrada e saída:

$ sh 1109.sh 127.0.0.1 1 80
22 25 80
Arnaud Le Blanc
fonte
2
Eu não sei se nmapconta como uma resposta válida aqui, mas é definitivamente não sh :)
Eelvex
O formato de saída também pode usar um pouco de polimento.
JB
2
@Eelvex que é um script sh, com uma your-port-scanner host_ip startPort endPortinterface, chamando nmap ;-)
Arnaud Le Blanc
@JB, feito :-) __
Arnaud Le Blanc
não nmapvem empacotado com linux? : - \ eu não sabia disso ... :(
st0le 22/02
1

Ruby - 85

require"socket"
h,p,e=$*
p.upto(e){|p|begin
TCPSocket.new h,p
$><<"#{p} "
rescue
end}
Arnaud Le Blanc
fonte
1

BASH - 105

No BASH puro (ou seja, sem nmap ou netcat).

exec 2>&- && exec 2<> /dev/null
for p in $(seq $2 $3); do
    > /dev/tcp/$1/$p &&
    echo -n "$p "
done

Ao usar com um endereço que não seja o host local, o tempo limite é bastante longo (na ordem de minutos) ao encontrar uma porta fechada; portanto, é provável que algum tipo de função de tempo limite / alarme seja necessária.

JOgden
fonte
0

PHP - 70

<?for(list(,$h,$p,$e)=$argv;$p<=$e;++$p)@fsockopen($h,$p)&&print"$p ";
Arnaud Le Blanc
fonte
eu tenho certeza que você pode espremer o $p++em outra menção de $p, vai economizar um caracter ...
st0le
0

Perl, 178

Eu sou novo no Perl, qualquer conselho sobre redução é apreciado!

use IO::Socket::INET;for($x=$ARGV[1];$x<$ARGV[2]+1;$x++){if(fork()){if($sock=new IO::Socket::INET(PeerAddr=>$ARGV[0],PeerPort=>$x,Proto=>'tcp')){print"$x ";}close($sock);exit;}} 
Timtech
fonte