PortScan TCP em SH

O linux tem um arquivo especial dentro de : /dev/tcp/host/porta/ nesse arquivo você pode ler/escrever na pilha tcp/ip.
Escrevendo nesse arquivo especial você pode fazer uma festança e abrir uma conexão TCP com a sintaxe: host/port.

O arquivo é simples, se você consegui escrever a porta está aberta, se não então a porta está fechada.

Então vamos fazer uma repetição usando o google.com como exemplo.

for porta in {1..100} ; do echo > /dev/tcp/google.com/$porta && echo -e "porta: \t\t $porta \t\t aberta" done

Mas a conexão demorava de mais principalmente quando a porta estava fechada, pensei em desistir e usar um for com o netcat então eu fiz:

for porta in `seq 1 100`; do nc -v -z www.google.com $porta; done

Deu certo ele me deu uma tela suja, mas deu certo, mesmo assim resolvi desistir do nc e voltar com aquele arquivo especial, não sei ao certo o porque, mas acho que não queria depender de um software que fazia tudo por mim, então voltei a luta.

Pensei em fazer algo em C , ou Python para tentar reduzir o tempo, mas queria fazer em bash. Depois de muita pesquisa encontrei algo que poderia ser uma luz no fim do túnel, um utilitário que executa um comando com um limite de tempo, chamado timeout. Então ficou assim:

for porta in {1..100} ; do
timeout 1 bash -c "echo >/dev/tcp/google.com/$porta" && echo "porta: $porta aberta"
done

A saída feia, então mandei tudo para o limbo do linux. ( o for continuou o mesmo )

timeout 1 bash -c "echo >/dev/tcp/google.com/$porta" >\
 /dev/null 2>&1 && echo "porta: $porta aberta"

Mesmo com uma saída um pouco mais limpa ainda não me satisfiz, queria usar o script em conjunto com o arquivo /etc/service que contém vários serviços ou todos por padrão. Então levei outra surra para conciliar os dois, mas no fim da tarde consegui. Ficou uma linha bem grande de código, mas ficou bonito:

timeout 1 bash -c "echo >/dev/tcp/$1/$porta" > /dev/null 2>&1 \
&& echo "`grep -w "$porta/tcp" /etc/services |cut -d "/" -f1`"

Ficou bom, mas queria algo excelente ou quase isso então pensei, o usuário poderia dar duas portas uma de inicio e a outra de parada, como se fosse um “-p 1-1000” do nmap, não precisei pensar muito por que já tinha o código feito só precisei mudar a sequencia (seq) do meu laço. Ficou assim:

for porta in {$2..$3};do
 timeout 1 bash -c "echo >/dev/tcp/$1/$porta" > /dev/null 2>&1 \
 && echo "`grep -w "$porta/tcp" /etc/services |cut -d "/" -f1`"
done

Então o usuário entrava com o host apos com a porta de inicio e em seguida a porta de  arada, com o código feito, então apenas tratei os passivei erros, como quantidade de argumentos diferente do que é esperado, coloquei um help, atribui o parâmetro ” –all ” para um scan com todas as portas só pra dar um charme.

No fim de tudo ficou da seguinte maneira:

#! /bin/bash
if [ -z "$1" ] || [ -z "$2" ] || [ "$#" -gt 3 ] || [ "$2" == "--help" ]; then
 echo "Usagem: $0 "
 echo "Ex:. $0 192.168.0.102 1 1000 "
 echo "Ex:. $0 192.168.0.102 --all"
 exit
fi
echo -e 'SERVICE\t\tPORT\t\tSTATE'
if [ "$2" == "--all" ];then
 for porta in {1..65365}; do
 timeout 1 bash -c "echo >/dev/tcp/$1/$porta" > /dev/null 2>&1 \
 && echo "`grep -w "$porta/tcp" /etc/services |cut -d "/" -f1`"
 done
 exit
fi
for porta in $(seq "$2" "$3");do
 timeout 1 bash -c "echo -e >/dev/tcp/$1/$porta" > /dev/null 2>&1 \
 && echo -e "`grep -w "$porta/tcp" /etc/services |cut -d "/" -f1` \t\topen"
done

Lembrando que o objetivo não é substituir o nmap ou qualquer outro scan de portas,  as ter uma alternativa divertida de desenvolver.

Good Hacking ;;

Anúncios

Um comentário sobre “PortScan TCP em SH”

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s