UMA BREVE INTRODUÇÃO
Como já é sabido,o port scan é uma ferramenta essencial para o mundo da cibersegurança. Existem diversos programas gratuitos e bem eficientes que são muito usados em testes de segurança, como o maior exemplo, pode ser citado o Nmap. Caso queira saber um pouco mais sobre o papel das portas e do port scan, aconselhamos dois textos dispostos em nossos materiais: Como máquinas se comunicam e Portscan: explorando seu alvo.
Além de conhecer minimamente o papel das portas nas redes de computadores, será necessário para este pequeno tutorial ter noções básicas de programação com Python. Sem mais delongas, hands on !
Em um primeiro momento estaremos mostrando todo o código e posteriormente vamos destrinchá-lo e explicar linha por linha.
Fonte: Via CiberBox
EXPLICANDO
#1 - Na primeira linha importamos uma biblioteca de baixo nível para trabalharmos com sockets. Se não souber o que é, novamente indicamos o texto Como máquinas se comunicam.
import socket
#2- Nesta etapa criamos uma variável para indicarmos o endereço IP do host que estaremos realizando a análise, ou seja, o nosso alvo. Como o host é local, o nome da variável parece pertinente (Local Host).
LHOST = "192.168.1.128"
#3 - Aqui é criado um laço de repetição que irá escanear as primeiras 1024 portas das totais 65.535, que também são conhecidas como "well know ports" , que em tradução significa "portas bem conhecidas".
for PORT in range(0,1024):
#4 - Nesta etapa é onde começa realmente o nosso portscan. Criamos um objeto na variável port_scan. Este objeto é responsável por criar propriamente dito o socket de conexão que vamos poder chamar os métodos, que nada mais são do que funções atreladas aos objetos da classe socket.
port_scan = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Se você não tem muita experiência com Python não se preocupe , aqui o que precisamos saber é que a parte socket.(socket.AF_INET, socket.SOCK_STREAM) apenas significa que estamos criando um socket com dois parâmetros: O primeiro indicando a família de IP ,o IPv4 (socket.AF_INET) , e o segundo, o protocolo de transporte que neste caso será o TCP (socket.SOCK_STREAM). É necessário ser o TCP pois ele é orientado à conexão, diferentemente do UDP.
#5 - Aqui nós aplicamos ao nosso objeto port_scan um tempo máximo de espera de resposta de 0.1 segundos. Caso não definamos esse tempo, nosso programa ficará extremamente lento (praticamente inutilizável), pois irá esperar o tempo padrão de conexão.
port_scan.settimeout(0.1)
#6 - Nessa parte nós criamos uma variável para receber e armazenar o retorno do método chamado port_scan.connect_ex(). Este método exige como parâmetro dois valores, a porta em questão, que será icrementada pelo laço de repetição e o nosso alvo, que está armazenado na variável LHOST, que já discutimos na etapa #02. Caso esse método retorne o valor "0" como um inteiro, sabemos que a porta está aberta .
status = port_scan.connect_ex((LHOST, PORT))
#7 - Aqui fazemos uma rápida verificação do valor da variável status. Como mencionado acima, caso o valor seja "0", sabemos que a porta está aberta.
if status == 0:
#8 - Se o valor da variável status for "0" é printado na tela a porta e seu status (aberta) .
print(f"{PORT}/OPEN")
#9 - Se o valor da variável status for qualquer um diferente de "0" é printado na tela a porta e seu status (fechada) .
port_scan.close()
EXECUTANDO
Fonte: Via CiberBox
Ao executar este exato código tendo em sua rede local um host com o endereço 192.168.1.128 e tendo apenas as portas 80 e 443 abertas dentre as portas bem conhecidas, é muito provável que você tenha esse retorno em seu terminal. É também possível que tenha notado uma pequena demora, principalmente se já tiver experimentado o Nmap, por exemplo. De qualquer forma você concluiu com êxito a criação de um simples port scan que pode ser muito melhorado e adaptado para suas análises.
CONCLUSÃO
Por fim, gostaríamos de incentivar a realização da atividade com pequenas mudanças e adaptações próprias, por isso não vamos disponibilizar o código em texto para copiar e colar. Você poderá compartilhar seu código no nosso fórum ou nos comentários desse post no LinkdIn. Como mencionado, esse código pode ser muito mais eficiente e modificado para ficar bem semelhante ao Nmap. Caso queira um exemplo pode estar deixando nos comentários do post em nosso site ou no LinkedIn.
Para meditação deixamos a frase do excelente livro "A arte da guerra" de Sun Tzu.
“Para vencer, deve conhecer perfeitamente a terra (a geografia, o terreno) e os homens (tanto a si mesmo quanto o inimigo). O resto é uma questão de cálculo."
-Sun Tzu
Comments