diff --git a/python-ofensivo/12_escaner_puertos/port_scanner_01.py b/python-ofensivo/12_escaner_puertos/port_scanner_01.py new file mode 100644 index 0000000..9549744 --- /dev/null +++ b/python-ofensivo/12_escaner_puertos/port_scanner_01.py @@ -0,0 +1,39 @@ +#!/usr/bin/env/ python3 +""" +Escaner de puertos +""" + +import socket as s +import os + + +os.system("clear") +print(""" +################## +Escaner de puertos +################## +""") +os.system("sleep 0.6") + +host = input("\n[+] Introduce la IP a escanear: ") +port = int(input("[+] Introduce el puerto a escanear: ")) + +def port_scanner(): + + sock = s.socket(s.AF_INET, s.SOCK_STREAM) + sock.settimeout(0.9) + + if not sock.connect_ex((host, port)): + print(f"[+] El puerto {port} está abierto") + else: + print(f"[!] El puerto {port} está cerrado") + + sock.close() + + +def main(): + port_scanner() + + +if __name__ == "__main__": + main() diff --git a/python-ofensivo/12_escaner_puertos/port_scanner_02.py b/python-ofensivo/12_escaner_puertos/port_scanner_02.py new file mode 100644 index 0000000..e5f9b28 --- /dev/null +++ b/python-ofensivo/12_escaner_puertos/port_scanner_02.py @@ -0,0 +1,145 @@ +#!/usr/bin/env/ python3 +""" +Escaner de puertos +""" + +import argparse +import socket as s +import signal +import sys +from concurrent.futures import ThreadPoolExecutor +from termcolor import colored + +open_sockets = [] + + +def def_handler(sig, frame): + """ + Función para manejar la señal SIGINT (Ctrl + C). + """ + + print(colored("\n[!] Saliendo...", "blue")) + + for sock in open_sockets: + + sock.close() + + sys.exit(1) + + +signal.signal(signal.SIGINT, def_handler) # CTRL + C + + +def get_arguments(): + """ + Función para obtener los argumentos de la línea de comandos. + """ + + parser = argparse.ArgumentParser(description="Escaner de puertos TCP") + parser.add_argument( + "-t", "--target", dest="target", required=True, + help="IP objetivo a escanear (Ej: -t 192.168.1.1)" + ) + parser.add_argument( + "-p", "--port", dest="port", required=True, + help="""Rango de puertos a escanear + (Ej: -p 80 or -p 50-100 or -p 80,443,8080)""" + ) + options = parser.parse_args() + + return options.target, options.port + + +def port_scanner(port, host): + """ + Función para escanear un puerto en un host dado. + """ + + with s.socket(s.AF_INET, s.SOCK_STREAM) as sock: + + try: + + sock.settimeout(2) + + open_sockets.append(sock) + + sock.connect((host, port)) + + sock.sendall(b"HEAD / HTTP/1.0\r\n\r\n") + response = sock.recv(1024) + response = response.decode(errors="ignore").split("\n") + + if response: + print( + colored( + f"\n[+] El puerto {port} está abierto", "green" + ) + ) + # print( + # colored( + # f"\t[+] Respuesta del puerto {port}: {response}", + # "blue" + # ) + # ) + + for line in response: + print(colored(line, "grey")) + + else: + print( + colored( + f"\n[+] El puerto {port} está abierto", + "green" + ) + ) + + except (s.timeout, ConnectionRefusedError): + pass + + finally: + sock.close() + + +def scan_ports(ports, target): + """ + Función para escanear una lista de puertos en un host dado. + """ + + with ThreadPoolExecutor(max_workers=100) as executor: + + executor.map(lambda port: port_scanner(port, target), ports) + + +def parse_ports(ports_str): + """ + Función para analizar la cadena de puertos y devolver una secuencia de puertos. + """ + + if "-" in ports_str: + + start_port, end_port = map(int, ports_str.split("-")) + + return range(start_port - 1, end_port + 1) + + elif "," in ports_str: + + return map(int, ports_str.split(",")) + + else: + + return int(ports_str), + + +def main(): + """ + Función principal del programa. + """ + + target, ports_str = get_arguments() + ports = parse_ports(ports_str) + + scan_ports(ports, target) + + +if __name__ == "__main__": + main() diff --git a/python-ofensivo/README.md b/python-ofensivo/README.md index 004e243..c9f7e53 100644 --- a/python-ofensivo/README.md +++ b/python-ofensivo/README.md @@ -13,7 +13,7 @@ Quizá encuentres aquí cosas que no están en el vídeo, o viceversa, son apunt | Ejercicios y apuntes | | -------------------------------------------------------------------- | -| 0. [Cajón de sastre de ejercicios](./00_ejercicios/) | +| 0. [Cajón de sastre de ejercicios](./00_ejercicios/) | | 1. [Ejemplos de oneliner en python](./01_oneliner/README.md) | | 2. [Shebang y convenios](./02_shebang_convenios/README.md) | | 3. [Proyecto biblioteca](./03_proyecto_biblioteca/) | @@ -25,3 +25,4 @@ Quizá encuentres aquí cosas que no están en el vídeo, o viceversa, son apunt | 9. [Bloc de notas](./09_bloc_notas/) | | 10. [Calculadora](./10_calculadora/) | | 11. [Chat cifrado con E2E](./11_chat_cifrado_E2E/) | +| 12 [Escaner de puertos](./12_escaner_puertos/) |