He creado un scaner de puertos con python que me indica cuando un puerto está abierto.

Esta función que hace wiresharck para sniffing de tráfico de red, hecho exclusivamente para un rango de puertos, desde consola.

comienzo importando las librerias signal, sys, time y logging

!/usr/bin/env python3
import signal
import sys
import time
import logging

defino scanPort que será la función que crearé para el escaneo donde introduzco los parametros que quiero ver en mi escaneo que serán ip y puerto.

def scanPort(ip, port):
src_port = RandShort()

A continuación le diré que pruebe si la respuesta es ip destino / puerto fuente, puerto destino, le pongo un tiemout de 2 y vervose lo pongo a 0 para que no me muestre información de los errores

try:
response = sr1(IP(dst=ip)/TCP(sport=src_port, dport=port), timeout=2, verbose=0)

Ahora necesito una condición, si no me decuelve ninguna respuesta, que me devuelva Falso. Pero si el código de respuesta es ack que en hexadecmial corresponde a 0×12 (esta parte la he mirado en wiresharck, la respuesta que da a un ack, representada en binario) quiero que me envie la respuesta y que me devuelva true

if response is None:
return False
elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12:
send(IP(des=ip)/TCP(sport=src_port, dport=port, flags="R"), vervose=0)
return True

Defino el main, del programa que tendrá las variables (ip y puertos) y creo otra condición si la respuesta coincide con el flag 0×12 que le hemos indicado arriba, eso significa que el puerto esta abierto.

def main(ip, ports):
for port in ports:

def main(ip, ports):
for port in ports:

def main(ip, ports):
for port in ports:
    response = scanPort(ip, port)
    if response:
        log.info("Port {port} - OPEN")

cierro el main

if name == 'main':

Aqui ejecuto y veo que me me ha cogido el código pero aun está vacia la respuesta, asi que le añado otro condicional, diciendo que si la respuesta no contiene 3 argumentos, que me muestre el modo correcto de uso.

Defino target_ip y le indico que es el sys.argv con valor 1 y portRange que es sys.argv con valor 2. He de indicarle el start port que es entero, por que si no me da error al mezclar strig von integer. start_port = int(portRange[0]), end_port = int(portRange[1])

El rango de puertos no me incluye el último puerto que le he indicado, asi que le tengo que sumar 1 para que me los muestre todos.

if len(sys.argv) !=3:
print(f"[!] Uso: {('python3')} {(sys.argv[0])} {(' ')}",)
sys.exit(1)
target_ip = sys.argv[1]
portRange = sys.argv[2].split("-")
start_port = int(portRange[0])
end_port = int(portRange[1])


ports = range(start_port, end_port + 1)
main(target_ip, ports)

Me falta incluirle la libreria scapy, que la he instalado en el systma con sudo apt install scapy. El resultado seria el siguiente de mi scanner.py

!/usr/bin/env python3
from scapy.all import *
import signal
import sys
import time
import logging
def def_handler(sig, frame):
sys.exit(1)

Ctrl + C
signal.signal(signal.SIGINT, def_handler)
def scanPort(ip, port):
src_port = RandShort()
try:
response = sr1(IP(dst=ip)/TCP(sport=src_port, dport=port), timeout=2, verbose=0)

 if response is None:
       return False
   elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12:
       send(IP(des=ip)/TCP(sport=src_port, dport=port, flags="R"), vervose=0)
       return True

except Exception as e:
    log.failure(f"Error scanning {ip} on port {port}: e")
    sys.exit(1)
def main(ip, ports):
for port in ports:
response = scanPort(ip, port)
    if response:
        log.info("Port {port} - OPEN")
if name == 'main':
if len(sys.argv) !=3:
    print(f"[!] Uso: {('python3')} {(sys.argv[0])} {('<ip> <ports-range>')}",)
    sys.exit(1)

target_ip = sys.argv[1]
portRange = sys.argv[2].split("-")
start_port = int(portRange[0])
end_port = int(portRange[1])


ports = range(start_port, end_port + 1)
main(target_ip, ports)


ejecuto el scanner y por otro lado, en otra terminal me pongo a la escucha con tshark por la interfaz tun0

veo el fin del scaneo, que le dicho que me escanee los 100 primeros puertos

La prueba de que el puerto 22 está abierto es que he recibido un ACK ademas del SYN en el escaneo.

Categorías: Python

0 comentarios

Deja una respuesta

Marcador de posición del avatar