$ cd /home/snoody/Scripts

Snoody's Scripts

Puerto Scanner con Nmap

Este script en Python utiliza la biblioteca Nmap para escanear puertos en una dirección IP objetivo. Además, envía los resultados por correo electrónico.

import nmap
from CorreoElectronico import CorreoElectronico
import re

class P6:
    def __init__(self, ipObjetivo):
        self.ipObjetivo = ipObjetivo
        self.nm = nmap.PortScanner()
        self.puertosAbiertos = "-p "
        self.destinatarioCorreo = ""

    def validarIP(self):
        pattern = re.compile(r"^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$")
        if not pattern.match(self.ipObjetivo):
            raise ValueError(f"La IP {self.ipObjetivo} no es válida.")

    def escanearPuertos(self):
        try:
            self.validarIP()
            resultados = self.nm.scan(hosts=self.ipObjetivo, arguments="-sT -n -Pn -T4")
            return resultados
        except ValueError as e:
            print(e)
            return None
        except Exception as e:
            print(f"Error al escanear puertos: {e}")
            return None

    def generarInforme(self, resultados):
        if resultados:
            informe = f"\nHost : {self.ipObjetivo}\n"
            informe += f"State : {self.nm[self.ipObjetivo].state()}\n"
            for proto in self.nm[self.ipObjetivo].all_protocols():
                informe += f"Protocol : {proto}\n\n"
                lport = self.nm[self.ipObjetivo][proto].keys()
                sorted(lport)
                for port in lport:
                    informe += f"port : {port}\tstate : {self.nm[self.ipObjetivo][proto][port]['state']}\n"
                    if self.puertosAbiertos == "-p ":
                        self.puertosAbiertos += str(port)
                    else:
                        self.puertosAbiertos += "," + str(port)
            informe += f"\nPuertos abiertos: {self.puertosAbiertos}{self.ipObjetivo}"
            return informe
        else:
            return "No se pudo realizar el escaneo."

    def obtenerDestinatarioCorreo(self):
        while True:
            correo = input("Ingrese la dirección de correo para enviar el informe: ")
            if "@" not in correo or "." not in correo.split("@")[1]:
                print("Dirección de correo inválida. Intente nuevamente.")
            else:
                self.destinatarioCorreo = correo
                break

def enviarInformePorCorreo(ipObjetivo):
    scanner = P6(ipObjetivo)
    resultados = scanner.escanearPuertos()
    informe = scanner.generarInforme(resultados)
    
    scanner.obtenerDestinatarioCorreo()
    
    asunto = f"Informe de escaneo de puertos para {ipObjetivo}"
    mensaje = informe

    correo = CorreoElectronico()
    correo.enviarCorreo(scanner.destinatarioCorreo, asunto, mensaje)

# Ejemplo de uso
ipObjetivo = input("[+] IP Objetivo ==> ")
enviarInformePorCorreo(ipObjetivo)

Reconocimiento Facial

Este script utiliza OpenCV para realizar reconocimiento facial en tiempo real, activando alertas.

import cv2
import face_recognition
import os
from datetime import datetime
from CorreoElectronico import CorreoElectronico
import numpy

class P1:
    def __init__(self):
        try:
            self.detectorRostro = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
            self.rutaImages = "images"
            self.correoDestinatario = " " #U can delete the part of sending the email.
            self.encodingsRostros = []
            self.nombresRostros = []
            self.intentos = 0
            self.detallesIntentos = []
            print("Iniciando sistema...")
            self.cargarRostros()
            print("Rostros cargados")
        except:
            print(f"Error al inicializar el sistema")

    def cargarRostros(self):
        try:
            rostros = [
                {"nombre": "#Person name", "imagen": "images/name_2.jpeg"},
                {"nombre": "#Person name", "imagen": "images/name2_1.jpeg"},    #U can delete or add more recognition faces
                {"nombre": "#Person name", "imagen": "images/name3_1.jpeg"},
                {"nombre": "#Person name", "imagen": "images/name4_2.jpeg"}
            ]
            for rostro in rostros:
                if os.path.exists(rostro["imagen"]):
                    imagen = face_recognition.load_image_file(rostro["imagen"])
                    encoding = face_recognition.face_encodings(imagen)
                    if encoding:
                        self.encodingsRostros.append(encoding[0])
                        self.nombresRostros.append(rostro["nombre"])
                        print(f"Rostro de {rostro['nombre']} cargado")
                    else:
                        print(f"No se detectó ningún rostro en la imagen {rostro['nombre']}")
                else:
                    print(f"No se encontró el archivo {rostro['imagen']}")
        except:
            print(f"Error al cargar los rostros")

    def reconocerImagen(self, imagen):
        try:
            rgbFrame = cv2.cvtColor(imagen, cv2.COLOR_BGR2RGB)
            ubicacionRostros = face_recognition.face_locations(rgbFrame)
            encodingsRostros = face_recognition.face_encodings(rgbFrame, ubicacionRostros)

            nombRostros = []
            for encodingRostro in encodingsRostros:
                if len(self.encodingsRostros) == 0:
                    print("No se han cargado encodings de caras conocidas.")
                    continue

                coincidencias = face_recognition.compare_faces(self.encodingsRostros, encodingRostro)
                nombre = "Desconocido"
                distanciaRostro = face_recognition.face_distance(self.encodingsRostros, encodingRostro)
                mejorCoincidencia = numpy.argmin(distanciaRostro)
                if coincidencias[mejorCoincidencia]:
                    nombre = self.nombresRostros[mejorCoincidencia]
                nombRostros.append(nombre)
                if nombre == "Desconocido":
                    self.intentos += 1
                    self.detallesIntentos.append(f"Intento fallido a las {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
                    if self.intentos >= 3:
                        self.enviarCorreo()
            return nombRostros
        except:
            print(f"Error al reconocer la imagen")
            return []

    def reconocerRostro(self):
        try:
            captura = cv2.VideoCapture(0)
            if not captura.isOpened():
                print("No se puede acceder a la cámara")
                return
            while True:
                ret, frame = captura.read()
                if not ret:
                    print("No se pudo capturar la imagen correctamente")
                    break

                nomRostros = self.reconocerImagen(frame)

                for (top, right, bottom, left), nombre in zip(face_recognition.face_locations(frame), nomRostros):
                    cv2.rectangle(frame, (left, top), (right, bottom), (255, 0, 0), 2)
                    cv2.putText(frame, nombre, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36, 255, 12), 2)
                cv2.imshow('Sistema de reconocimiento facial', frame)
                if cv2.waitKey(1) & 0xFF == ord('x'):
                    break
            captura.release()
            cv2.destroyAllWindows()
        except:
            print(f"Error al realizar el reconocimiento facial")

    def enviarCorreo(self):
        try:
            correo = CorreoElectronico()
            asunto = "Notificación de intentos fallidos de reconocimiento facial"
            mensaje = "Se han detectado 3 intentos fallidos de reconocimiento facial.\n\n"
            mensaje += "Detalles de los intentos fallidos:\n"
            for detalle in self.detallesIntentos:
                mensaje += f"{detalle}\n"
            correo.enviarCorreo(self.correoDestinatario, asunto, mensaje)
            self.intentosFallidos = 0
            self.detallesIntentos.clear()
        except:
            print(f"Error al enviar el correo electrónico")

objReconocer = P1()
objReconocer.reconocerRostro()

Automatización Router

Este script utiliza Selenium para automatizar la configuración de un router.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

class P2:
    def __init__(self, urlLogin):
        self.driver = webdriver.Firefox()
        self.driver.maximize_window()
        self.urlLogin = urlLogin

    def ingresarDatosYEsperar(self, campo, datos, tiempoEspera=4):
        campo.clear()
        time.sleep(tiempoEspera)
        campo.send_keys(datos)

    def imprimir(self, msj):
        print(msj)

    def iniciarSesion(self, nombreUsuario, contrasena):
        while True:
            if nombreUsuario != "" or contrasena != "": #Credenciales de inicio de sesion de tu pagina default del router
                nombreUsuario = input("Las credenciales son incorrectas. Ingrese el nombre de usuario del router: ")
                contrasena = input("Ingrese la contraseña del router: ")
            else:
                break

        self.driver.get(self.urlLogin)
        try:
            campoNombreUsuario = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.ID, 'UserName'))
            )
            campoContrasena = self.driver.find_element(By.ID, 'Password')
            self.ingresarDatosYEsperar(campoNombreUsuario, nombreUsuario)
            self.ingresarDatosYEsperar(campoContrasena, contrasena)
            botonIniciarSesion = self.driver.find_element(By.CSS_SELECTOR, "input[value='Apply']")
            time.sleep(4)
            botonIniciarSesion.click()
            self.imprimir("Inicio de sesión exitoso")
        except Exception as e:
            self.imprimir(f"Ocurrió un error durante el inicio de sesión: {e}")
            return False
        return True

    def validarContrasenaWifi(self, contrasena):
        if not (8 <= len(contrasena) <= 63):
            raise ValueError("La contraseña debe tener entre 8 y 63 caracteres.")
        if not all(c.isascii() for c in contrasena):
            raise ValueError("La contraseña debe contener solo caracteres ASCII.")

    def configurarWifi(self, nuevoSsid, nuevaContrasenaWifi):
        while True:
            try:
                self.validarContrasenaWifi(nuevaContrasenaWifi)
                break
            except ValueError as e:
                self.imprimir(e)
                nuevaContrasenaWifi = input("Ingrese una nueva contraseña válida para la red Wi-Fi: ")

        try:
            WebDriverWait(self.driver, 20).until(
                EC.presence_of_element_located((By.ID, 'WirelessNetworkName'))
            )
            campoSsid = self.driver.find_element(By.ID, 'WirelessNetworkName')
            self.ingresarDatosYEsperar(campoSsid, nuevoSsid)
            campoContrasenaWifi = self.driver.find_element(By.ID, 'WifiPassword')
            self.ingresarDatosYEsperar(campoContrasenaWifi, nuevaContrasenaWifi)
            botonAplicar = self.driver.find_element(By.CSS_SELECTOR, "input[value='Aplicar']")
            time.sleep(4)
            botonAplicar.click()
            self.imprimir("Configuración Wi-Fi aplicada con éxito")
            time.sleep(10)
        except Exception as e:
            self.imprimir(f"Ocurrió un error durante la configuración de Wi-Fi: {e}")

    def configurarCanalWifi(self):
        try:
            self.driver.execute_script("window.location.href='router.html?wifi_basic'")
            WebDriverWait(self.driver, 20).until(
                EC.presence_of_element_located((By.ID, 'Channel'))
            )

            while True:
                try:
                    canal = int(input("Ingrese el canal de transmisión (1-13): "))
                    if 1 <= canal <= 13:
                        break
                    else:
                        raise ValueError("El canal debe estar entre 1 y 13.")
                except ValueError as e:
                    self.imprimir(e)

            campoCanal = self.driver.find_element(By.ID, 'Channel')
            opcionesCanal = campoCanal.find_elements(By.TAG_NAME, 'option')
            for opcion in opcionesCanal:
                if opcion.get_attribute('value') == str(canal):
                    opcion.click()
                    break

            botonAplicar = self.driver.find_element(By.CSS_SELECTOR, "input[value='Aplicar']")
            time.sleep(4)
            botonAplicar.click()
            self.imprimir("Configuración del canal Wi-Fi aplicada con éxito")
        except Exception as e:
            self.imprimir(f"Ocurrió un error durante la configuración del canal Wi-Fi: {e}")

    def configurarLan(self, nuevaIp, nuevaMascaraSubred):
        try:
            self.driver.execute_script("window.location.href='router.html?lan_settings'")
            WebDriverWait(self.driver, 20).until(
                EC.presence_of_element_located((By.ID, 'IPAddress'))
            )
            campoIpLan = self.driver.find_element(By.ID, 'IPAddress')
            self.ingresarDatosYEsperar(campoIpLan, nuevaIp)
            campoMascaraSubredLan = self.driver.find_element(By.ID, 'SubnetMask')
            self.ingresarDatosYEsperar(campoMascaraSubredLan, nuevaMascaraSubred)
            botonAplicar = self.driver.find_element(By.CSS_SELECTOR, "input[value='Aplicar']")
            time.sleep(4)
            botonAplicar.click()
            self.imprimir("Configuración de LAN aplicada con éxito")
            time.sleep(10)
        except Exception as e:
            self.imprimir(f"Ocurrió un error durante la configuración de LAN: {e}")

    def configurarWanEstatica(self, nuevaGateway):
        try:
            self.driver.execute_script("window.location.href='router.html?wan_static'")
            WebDriverWait(self.driver, 20).until(
                EC.presence_of_element_located((By.ID, 'EnableStatic'))
            )
            checkboxHabilitarEstatica = self.driver.find_element(By.ID, 'EnableStatic')
            if not checkboxHabilitarEstatica.is_selected():
                checkboxHabilitarEstatica.click()
            time.sleep(4)
            campoGateway = self.driver.find_element(By.ID, 'GatewayAddress')
            self.ingresarDatosYEsperar(campoGateway, nuevaGateway)
            botonAplicar = self.driver.find_element(By.CSS_SELECTOR, "input[value='Aplicar']")
            time.sleep(4)
            botonAplicar.click()
            self.imprimir("Configuración WAN estática aplicada con éxito")
        except Exception as e:
            self.imprimir(f"Ocurrió un error durante la configuración WAN estática: {e}")

urlLogin = "http://192.168.0.1/router.html"
p2 = P2(urlLogin)

try:
    while True:
        try:
            nombreUsuario = input("Ingrese el nombre de usuario del router: ")
            contrasena = input("Ingrese la contraseña del router: ")

            if p2.iniciarSesion(nombreUsuario, contrasena):
                break
        except ValueError as e:
            p2.imprimir(e)

    nuevoSsid = input("Ingrese el nuevo nombre de la red (SSID): ")
    nuevaContrasenaWifi = input("Ingrese la nueva contraseña de la red Wi-Fi: ")
    p2.configurarWifi(nuevoSsid, nuevaContrasenaWifi)

    p2.configurarCanalWifi()

    nuevaIp = input("Ingrese la nueva dirección IP del router: ")
    nuevaMascaraSubred = input("Ingrese la nueva máscara de subred del router: ")
    p2.configurarLan(nuevaIp, nuevaMascaraSubred)

    nuevaGateway = input("Ingrese la nueva dirección de gateway: ")
    p2.configurarWanEstatica(nuevaGateway)
except ValueError as e:
    p2.imprimir(e)

Envio de eMails

Este script utiliza SMTP para enviar correos utilizando Office 365.


import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import os

class CorreoElectronico:
    def __init__(self):
        self.servidorSMTP = "smtp.office365.com"
        self.puerto = 587
        self.usuario = "" #email, example: hello123@hotmail.com
        self.contraseña = ""  # email passwd

    def enviarCorreo(self, destinatario, asunto, mensaje, archivoAdjunto=None):
        msg = MIMEMultipart()
        msg['From'] = self.usuario
        msg['To'] = destinatario
        msg['Subject'] = asunto

        msg.attach(MIMEText(mensaje, 'plain'))

        if archivoAdjunto:
            if not os.path.exists(archivoAdjunto):
                print(f"Error: No se encontró el archivo {archivoAdjunto} para adjuntar.")
                return
            with open(archivoAdjunto, 'rb') as f:
                parte = MIMEApplication(f.read(), Name=os.path.basename(archivoAdjunto))
                parte['Content-Disposition'] = f'attachment; filename="{os.path.basename(archivoAdjunto)}"'
                msg.attach(parte)

        try:
            servidor = smtplib.SMTP(self.servidorSMTP, self.puerto)
            servidor.starttls()
            servidor.login(self.usuario, self.contraseña)
            servidor.sendmail(self.usuario, destinatario, msg.as_string())
            servidor.quit()
            print("Correo enviado correctamente")
        except smtplib.SMTPAuthenticationError:
            print("Error: Falló la autenticación, verifica tu usuario y contraseña.")
        except Exception as e:
            print(f"Error al enviar el correo: {str(e)}")

Copiado al portapapeles