Crie uma varredura SYN com Python e Scapy

Índice

Neste tutorial vou te ensinar realizar uma varredura TCP SYN nas portas, para isso vou usar Pitão com a livraria Scapy.

Para instalar o Python, você pode ver o seguinte tutorial. E para instalar a biblioteca Scapy para Python, clique no seguinte botão:

BAIXAR BIBLIOTECA SCAPY

Saber o que é uma varredura SYNA varredura SYN é uma técnica de varredura também conhecida como varredura aberta, usada por hackers para determinar o status das portas sem estabelecer uma conexão completa. Também é possível usar esta técnica para realizar ataques DDOS (ataques de negação de serviço).

ObservaçãoO objetivo é ensinar como funciona esse tipo de programa e que você pode testar suas portas, mas não a usá-lo de forma maliciosa.

Vamos começar com o scanner de porta.

Passo 1
A primeira coisa que fazemos é importar as bibliotecas de que precisamos.

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) de scapy.all import *
Nós importamos scapy em nosso programa, e eu também importei o registro para que não nos mostre um aviso incômodo se não tivermos um endereço IPv6.

Passo 2
Um passo que serve para iniciar nossas variáveis.

 conf.verb = 0 portlist = list (range (20.130)) host = "192.168.0.1"
A primeira instrução desta etapa faz uma pequena configuração para que não nos mostre as informações do Scapy na tela. A seguir adicionamos apenas as portas e o host, onde executaremos a ação, seria a melhor opção adicioná-lo como parâmetros ao executar o programa, (se você estiver interessado em adicioná-lo ao seu programa, consulte este link) , para facilitar o programa e torná-lo mais curto aqui é útil.

etapa 3
Esta etapa é o núcleo do programa.

 print ("Scanning IP ports:", host) para a porta em portList: sourceport = RandShort () packet = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "Y") response = sr1 ( pacote, tempo limite = 2) if ("NoneType" in str (type (response))): pass elif (response.haslayer (TCP) e response.getlayer (TCP). flags == 0x12): p = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "R") rst = sr (p, timeout = 1) try: service = socket.getservbyport (port) exceto: service = "?" imprimir ("[ABRIR]", porta, "->", serviço)
Esta parte é onde varredura de porta começa, mostramos uma mensagem para sabermos que está funcionando e através do porque passamos por cada porta. Usamos a função RandShort () de modo que o pacote enviado origina-se de uma porta diferente a cada vez.

A construção do pacote é feita com a segunda instrução encontrada no for. Configuramos os dados que nos interessam, o IP de destino para a camada IP, as portas de origem e destino e os flags para TCP, neste caso é um scanner SYN, então existe o S, mudando este parâmetro você pode fazer outro tipo do scanner, como uma varredura FIN ou uma varredura de janela (mas observe que você terá que alterar as condições abaixo).

A função sr1 é responsável pelo envio do pacote. Temos que passar como argumento o pacote criado (desta vez ele é criado diretamente aqui), e neste caso eu configurei uma espera máxima de 2 segundos, você pode alterá-la, somente se você não indicar, seu programa pode se tornar infinito. O resultado do envio do pacote é salvo na variável de resposta.

Nas condições, estamos interessados ​​em saber se temos uma resposta e se ela tem os sinalizadores SYN e ACK ativados (é por isso que usamos 0x12), se não usamos antes do e response.haslayer (TCP), se tem não tiver a camada, uma exceção será lançada. Se esta condição for cumprida, enviaremos uma mensagem com o flag RST ativo para cortar a conexão. A parte de tente … pegar você pode ignorá-lo, tudo o que ele faz é remover o serviço que é usado naquela porta para mostrar mais informações na tela (a função socket.getservbyport (porta) se for uma porta conhecida ele retornará informações, se não for uma exceção e se isso acontecer optei por colocar ¿? como "informação", como uma indicação de desconhecido.)

Bem, terminamos, na imagem a seguir você pode ver o resultado da execução do scanner:

Abaixo coloco o código completo:

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) # Não mostrar aviso de scapy.all import * conf.verb = 0 # Não mostrar dados na tela listPorts = list (range ( ( dst = host) / TCP (sport = sourceport, dport = port, flags = "S") response = sr1 (packet, timeout = 2) if ("NoneType" in str (type (response))): pass elif (response .haslayer (TCP) e response.getlayer (TCP) .flags == 0x12): p = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "R") rst = sr (p, tempo limite = 1) tentativa: serviço = socket.getservbyport (porta) exceto: serviço = "?" imprimir ("[ABRIR]", porta, "->", serviço) 
[color = rgb (169,169,169)] Código completo [/ color]

ObservaçãoEste scanner pode ser lento para verificar muitas portas, nesses casos é uma boa ideia usar “mulltithreading” ou “multiprocessamento”. Você também pode escanear de outras maneiras, usando nmap dentro do Python ou usando sockets raw.

E se você quiser fazer o download do código, anexei um CEP:

Código SynScan.zip 644 bytes 254 downloads

Gostou e ajudou este tutorial?Você pode recompensar o autor pressionando este botão para dar a ele um ponto positivo
wave wave wave wave wave