Crea una scansione SYN con Python e Scapy

Sommario

In questo tutorial ti insegnerò eseguire una scansione delle porte TCP SYN, per questo userò Pitone con la libreria Scapy.

Per installare Python puoi vedere il seguente tutorial. E per installare la libreria Scapy per Python, fai clic sul seguente pulsante:

SCARICA LA BIBLIOTECA DI SCAPY

Sapere cos'è una scansione SYNSYN scan è una tecnica di scansione nota anche come scansione aperta, utilizzata dagli hacker per determinare lo stato delle porte senza stabilire una connessione completa. È anche possibile utilizzare questa tecnica per eseguire attacchi DDOS (attacchi denial of service).

NotaHa lo scopo di insegnare come funziona questo tipo di programma e che puoi testare le tue porte, ma non usarlo in modo dannoso.

Cominciamo con il port scanner.

Passo 1
La prima cosa che facciamo è importare le librerie di cui abbiamo bisogno.

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) from scapy.all import *
Importiamo scapy nel nostro programma e ho anche importato la registrazione per evitare che ci mostri un fastidioso avviso se non abbiamo un indirizzo IPv6.

Passo 2
Un passaggio che serve per avviare le nostre variabili.

 conf.verb = 0 portlist = elenco (intervallo (20,130)) host = "192.168.0.1"
La prima istruzione di questo passaggio effettua una piccola configurazione in modo che non ci mostri le informazioni di Scapy sullo schermo. Di seguito aggiungiamo solo le porte e l'host, dove eseguiremo l'azione, sarebbe un'opzione migliore aggiungerlo come parametri durante l'esecuzione del programma, (se sei interessato ad aggiungerlo per il tuo programma, consulta questo link) , per facilitare il programma e accorciarlo qui è utile.

Passaggio 3
Questo passaggio è il cuore del programma.

 print ("Scansione porte IP:", host) per la porta in portList: sourceport = RandShort () pacchetto = IP (dst = host) / TCP (sport = sourceport, dport = porta, flag = "Y") response = sr1 ( pacchetto, 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, timeout = 1) try: service = socket.getservbyport (port) tranne: service = "?" print ("[OPEN]", porta, "->", servizio)
Questa parte è dove inizia la scansione della porta, mostriamo un messaggio in modo da sapere che funziona e attraverso il perché passiamo attraverso ogni porta. Usiamo la funzione RandShort () in modo che il pacchetto inviato provenga ogni volta da una porta diversa.

La costruzione del pacchetto viene eseguita con la seconda istruzione trovata nel for. Configuriamo i dati che ci interessano, l'IP di destinazione per il livello IP, le porte di origine e destinazione e i flag per TCP, in questo caso è uno scanner SYN, quindi c'è la S, cambiando questo parametro puoi fare un altro tipo di scanner, come una scansione FIN o una scansione della finestra (ma tieni presente che dovrai modificare le condizioni di seguito).

La funzione sr1 è incaricato di spedire il pacco. Dobbiamo passarlo come argomento il pacchetto creato (questa volta viene creato direttamente qui), e in questo caso ho impostato un'attesa massima di 2 secondi, puoi cambiarlo, solo se non lo indichi, il tuo programma può diventare infinito. Il risultato dell'invio del pacchetto viene salvato nella variabile di risposta.

Nelle condizioni ci interessa sapere se abbiamo una risposta e se ha i flag SYN e ACK attivati ​​(ecco perché usiamo 0x12), se non usiamo prima di e response.haslayer (TCP), se ce l'ha non avere il livello verrà generata un'eccezione. Se questa condizione è soddisfatta, invieremo un messaggio con il flag RST attivo per interrompere la connessione. La parte di prova a prendere puoi ignorarlo, non fa altro che rimuovere il servizio che viene utilizzato in quella porta per mostrare più informazioni sullo schermo (la funzione socket.getservbyport (porta) se è una porta nota restituirà informazioni, in caso contrario genererà un'eccezione e se ciò accade ho scelto di mettere ¿? come "informazione", come indicazione di non noto.)

Bene, abbiamo finito, nell'immagine seguente puoi vedere l'output dell'esecuzione dello scanner:

Di seguito metto il codice completo:

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) # Non mostra l'avviso da scapy.all import * conf.verb = 0 # Non mostra i dati sullo schermo listPorts = list (range ( 20,130) ) #L'elenco delle porte da scansionare host = "192.168.0.1" # Qui viene stampato l'IP che si desidera scansionare ("Scanning IP ports:", host) per la porta in PortList: sourcePort = RandShort () pacchetto = IP ( 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, timeout = 1) try: service = socket.getservbyport (porta) eccetto: service = "?" print ("[OPEN]", porta, "->", servizio) 
[color = rgb (169,169,169)] Codice completo [/ color]

NotaQuesto scanner può essere lento nel controllare molte porte, in questi casi è una buona idea usare il "multithreading" o il "multiprocessing". Puoi anche scansionare in altri modi, usando nmap all'interno di Python o usando i raw socket.

E se vuoi scaricare il codice, allego un zip:

Codice SynScan.zip 644 byte 254 download

Ti è piaciuto e hai aiutato questo Tutorial?Puoi premiare l'autore premendo questo pulsante per dargli un punto positivo
wave wave wave wave wave