====== Python avanzado para proyectos de seguridad ====== Notas del curso **Python avanzado para proyectos de seguridad** del Clúster Tic de Galicia. * Horas: 35 * Fecha Inicio: 11/11/2024 * Fecha Fin: 13/12/2024 ===== Objetivo general ===== Ampliar los conocimientos sobre Python, librerías y módulos que disponemos para realizar tareas relacionadas con peticiones, obtención de información, conexión con servidores o testeo de la seguridad de un sitio web. ===== Objetivos específicos ===== * Aprender a crear scripts en Python con el objetivo de automatizar tareas de pentesting. * Aprender las principales librerías disponibles en Python a la hora de desarrollar herramientas enfocadas a la seguridad. * Aprender una metodología que permita escribir código en Python para realizar un proceso de pentesting. * Aprender a desarrollar mediante programación en Python sus propias herramientas que se utilizan en un proceso de Ethical Hacking. * Aprender a automatizar tareas de análisis y extracción de información de servidores. * Fomentar el interés por la investigación y la seguridad informática ===== Temario ===== **1. Trabajando con sockets en Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:introduccion|Introducción a python para proyectos de seguridad]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:introduccion_sockets|Introducción a los sockets]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:recopilacion_informacion_sockets|Recopilación de información con sockets]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:escaner_puertos_socket|Implementar en Python un escáner de puertos con sockets]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:servidor_web_sockets|Implementar en Python un servidor HTTP]] **2. Aplicaciones cliente-servidor con sockets en Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:metodos_enviar_recibir_datos_cliente_servidor|Métodos para enviar y recibir datos entre un cliente y un servidor]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:creando_cliente_servidor_tcp_sockets|Creando un cliente y un servidor TCP con sockets]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:shell_inversa_sockets|Shell inversa con sockets]] **3. Módulos para realizar peticiones con Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:protocolo_http_creacion_clientes_http_python|Protocolo HTTP y creación de clientes HTTP en python]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:construyendo_cliente_http_urllib_request|Construyendo un cliente HTTP con urllib.request]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:crear_cliente_http_request|Crear un cliente HTTP con requests]] **4. Recolección de información de servidores con Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:utilizando_shodan_obtencion_informacion_servidor|Utilizando Shodan para la obtención de información de un servidor]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:utilizando_python_busquedas_shodan|Utilizando Python para realizar búsquedas en Shodan]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:utilizando_registro_whois_obtener_informacion_servidor|Utilizando el registro Whois para obtener información de un servidor]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:extraccion_informacion_servidores_dns|Extracción de información de servidores DNS]] **5. Extracción de metadatos con Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:obtener_informacion_geografica_localizacion_servidor|Obtener información geográfica acerca de la localización de un servidor]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:extraccion_metadatos_documentos_modulo_pypdf2|Extracción de metadatos en documentos con el módulo PyPDF2]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:extraccion_metadatos_imagenes|Extracción de metadatos en imágenes]] **6. Web Scraping con Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:extraccion_contenidos_web_python|Extracción de contenidos web con Python]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:extraer_contenido_etiquetas_beautifulsoup|Extraer contenido y etiquetas con BeautifulSoup]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:extraccion_imagenes_enlaces_modulo_bs4|Extracción de imágenes y enlaces con el módulo bs4]] **7. Webscraping avanzado con Scrapy** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:arquitectura_instalacion_scrapy|Arquitectura e instalación de Scrapy]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:scrapy_framework_desarrollo_spyders|Scrapy como framework de desarrollo de spyders]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:proyecto_scrapy_extraer_conferencias_europtyon|Proyecto Scrapy para extraer las conferencias europython]] **8. Escaneo de puertos y redes con Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:nmap_herramienta_escaner_puertos|Nmap como herramienta de escáner de puertos]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:escaneo_puertos_python_nmap|Escaneo de puertos con Python-nmap]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:ejecutar_scripts_nmap_detectar_servicios_vulnerabilidades|Ejecutar scripts de nmap para detectar servicios y vulnerabilidades]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:obtener_maquinas_activas_segmento_red|Obtener las máquinas activas de un segmento de red]] **9. Conexiones con servidores FTP, SFTP, SSH desde Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:conexiones_servidores_ftp_modulo_ftplib|Conexiones con servidores FTP utilizando el módulo ftplib]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:conexion_servidores_ssh_utilizando_paramiko|Conexión con servidores SSH utilizando paramiko]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:proceso_fuerza_bruta_contra_servidor_ssh|Proceso de fuerza bruta contra un servidor SSH]] **10. Análisis de vulnerabilidades en aplicaciones web con Python** - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:introduccion_metodologia_owasp|Introducción a la metodología OWASP]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:introduccion_herramienta_sqlmap_detectar_vulnerabilidades_sql_injection|Introducción a la herramienta sqlmap para detectar vulnerabilidades del tipo sql injection]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:introduccion_herramienta_bandit_detectar_vulnerabilidades_proyectos_python|Introducción a la herramienta bandit para detectar vulnerabilidades en proyectos de python]] - [[informatica:programacion:cursos:python_avanzado_proyectos_seguridad:detectar_vulnerabilidades_sitios_web_herramientas_automaticas|Detectar vulnerabilidades en sitios web con herramientas automáticas]] ===== Cuestionarios ===== ==== Prueba inicial de conocimientos ==== **¿Qué es un socket en el contexto de la programación de redes en Python?** * Un archivo de texto. * Un canal de comunicación punto a punto entre un cliente y un servidor. (**Correcto**) * Un servidor web. * Una base de datos. **¿Qué módulo de Python es utilizado para automatizar la creación de un servidor HTTP?** * socket. (**Correcto**) * os. * sys. * requests. **El método ''socket.accept()'' permite aceptar conexiones de un cliente en un servidor.** * Verdadero. (**Correcto**) * Falso. **El método ''socket.recv()'' se utiliza para recibir datos de un cliente en un servidor Python.** * Verdadero. (**Correcto**) * Falso. **¿Qué método se utiliza en Python para implementar un escáner de puertos?** * bind(). * listen(). * connect_ex(). (**Correcto**) * send(). **La familia de sockets AF_INET se utiliza para las direcciones IPv6.** * Verdadero. * Falso. **¿Qué hace el método ''sendall()'' en un socket de Python?** * Envía todos los datos al servidor. * Envía todos los datos en el buffer al cliente. (**Correcto**) * Recibe datos del cliente. * Cierra la conexión. **El código de estado HTTP 200 indica que la petición fue exitosa.** * Verdadero. (**Correcto**) * Falso. **¿Cuál es el principal objetivo del módulo requests en Python?** * Crear servidores web. * Realizar peticiones HTTP a sitios web. (**Correcto**) * Enviar correos electrónicos. * Manejar excepciones de conexión. **Scrapy permite exportar datos extraídos de un sitio web en formatos JSON, CSV y XML.** * Verdadero. (**Correcto**) * Falso. ==== Trabajando con sockets en Python ==== **Los sockets en Python permiten la comunicación entre procesos en la misma máquina o en máquinas diferentes.** * Verdadero. (**Correcto**) * Falso. **¿Qué método de socket convierte un nombre de host en una dirección IPv4?** * ''gethostbyaddr()''. * ''gethostbyname()''. (**Correcto**) * ''getfqdn()''. * ''getservbyport()''. **¿Qué protocolo es utilizado por los sockets de flujo en Python?** * UDP. * ICMP. * TCP. (**Correcto**) * HTTP. **¿Qué método en Python se utiliza para resolver un nombre de dominio a partir de una dirección IP?** * ''gethostbyname()''. * ''getfqdn()''. * ''gethostbyaddr()''. (**Correcto**) * ''connect_ex()''. **El método ''socket.getservbyport()'' permite obtener el nombre de un puerto a partir de su número.** * Verdadero. (**Correcto**) * Falso. **¿Qué hace la función ''socket.send()'' en un servidor HTTP implementado en Python?** * Recibe datos de un cliente. * Conecta el servidor con el cliente. * Envía datos al cliente. (**Correcto**) * Cierra la conexión con el cliente. **¿Qué tipo de socket se utiliza para trabajar con UDP en Python?** * SOCK_DGRAM. (**Correcto**) * SOCK_STREAM. * AF_INET. * AF_INET6. **¿Qué método se utiliza para escuchar conexiones entrantes en un servidor en Python?** * ''bind()''. * ''listen()''. (**Correcto**) * ''recv()''. * ''accept()''. **¿Qué función de socket permite la búsqueda inversa de una dirección IP?** * ''gethostbyname()''. * ''gethostbyaddr()''. (**Correcto**) * ''getfqdn()''. * ''connect_ex()''. **¿Qué protocolo utiliza el socket AF_INET en Python?** * UDP. * ICMP. * TCP. (**Correcto**) * FTP. ==== Examen 2 ==== **¿Qué método del módulo socket se utiliza para recibir datos desde un cliente?** * ''send()''. * ''connect()''. * ''recv()''. (**Correcto**) * ''accept()''. **El método bind() en el servidor permite asociar una dirección IP y un puerto con un socket.** * Verdadero. (**Correcto**) * Falso. **¿Qué método del módulo socket en Python permite conectar un cliente a un servidor?** * connect(). (**Correcto**) * bind(). * listen(). * close(). **Identifica las funciones clave del módulo requests en Python. (Respuesta múltiple).** * ''get()''. (**Correcto**) * ''post()''. (**Correcto**) * ''send()''. * ''bind()''. **¿Qué herramienta se describe como el «Google de los hackers» debido a su capacidad para rastrear servidores y dispositivos conectados a Internet?** * Nmap. * Wireshark. * Shodan. (**Correcto**) * Burp Suite. **¿Qué información puede proporcionar el servicio WHOIS?** * Información de registro de un dominio. (**Correcto**) * Dirección IP de un servidor. * Contenidos de un servidor web. * Lista de puertos abiertos. **La API de Shodan permite buscar información sobre servidores y dispositivos conectados a Internet utilizando filtros como el número de puerto.** * Verdadero. (**Correcto**) * Falso. **¿Qué es el código 404 en una respuesta HTTP?** * Recurso no encontrado. (**Correcto**) * Petición exitosa. * Error del servidor. * Petición redirigida. **¿Qué módulo en Python se utiliza para realizar consultas WHOIS de dominios?** * python-whois. (**Correcto**) * urllib3. * requests. * socket. **¿Qué función se utiliza para obtener los metadatos de un archivo PDF en Python?** * ''pdfinfo()''. * ''get_pdf_data()''. * ''PdfFileReader()''. (**Correcto**) * ''fetch_pdf()''. ==== Examen 3 ==== **El módulo ftplib en Python permite realizar conexiones cifradas con TLS a servidores FTP.** * Verdadero. (**Correcto**) * Falso. **¿Qué método de la clase FTP en ftplib se utiliza para cambiar de directorio en un servidor FTP?** * ''cwd()'' (**Correcto**) * ''dir()''. * ''nlst()''. * ''quit()''. **¿Cuáles son los métodos comunes utilizados para realizar peticiones HTTP con el módulo requests en Python? (Respuesta múltiple).** * ''get()''. (**Correcto**) * ''post()''. (**Correcto**) * ''send()''. * ''put()''. (**Correcto**) **Qué tipo de ataque se aprovecha de la falta de validación en la entrada de datos del usuario en una aplicación web?** * SQL Injection. (**Correcto**) * XSS. * Inyección de comandos. * Fuerza mixta. **¿Qué técnica de scraping se basa en obtener la información estructurada de un sitio web HTML y procesarla?** * Screen scraping * Data mining * Web scraping (**Correcto**) * API scraping **Nmap se utiliza exclusivamente para el escaneo de puertos en redes locales.** * Verdadero. * Falso. (**Correcto**) **¿Qué componente de Scrapy es responsable de realizar las peticiones HTTP y aplicar reglas de extracción de datos?** * Scheduler. * Downloader. * Spider. (**Correcto**) * Engine. **¿Cuál es el propósito del módulo Paramiko en Python?** * Transferir archivos por FTP. * Crear scripts de automatización. * Conectar a servidores SSH y ejecutar comandos de forma remota. (**Correcto**) * Extraer datos de sitios web. **¿Qué método de ftplib permite descargar archivos desde un servidor FTP en Python?** * ''upload()''. * ''retrbinary()''. (**Correcto**) * ''put()''. * ''fetch()''. **¿Qué función de lxml se utiliza para obtener los enlaces de una página web mediante XPath?** * ''parse()''. * ''fetch()''. * ''xpath()''. (**Correcto**) * ''html()''. ==== Examen final ==== **¿Qué función se utiliza para crear un socket en Python?** * ''socket.bind()''. * ''socket.socket()''. (**Correcto**) * ''socket.recv()''. * ''socket.send()''. **¿Qué puerto utiliza comúnmente el protocolo HTTP?** * 22. * 80. (**Correcto**) * 38. * 90. **El método requests.get() se utiliza para enviar una petición HTTP GET a un servidor web.** * Verdadero. (**Correcto**) * Falso. **De los siguientes, ¿cuáles son códigos de estado en HTTP? (Respuesta múltiple).** * 200: éxito. (**Correcto**) * 404: error del cliente. (**Correcto**) * 600: Invalid Request. * 500: error del servidor. (**Correcto**) **¿Qué método del módulo urllib.request se utiliza para abrir una URL en Python?** * ''get()''. * ''post()''. * ''urlopen()''. (**Correcto**) * ''fetch()''. **¿Qué módulo de Python permite la extracción de información geográfica a partir de una dirección IP?** * re. * Pygeoip. (**Correcto**) * datetime. * sys. **¿Qué es el método recv() en la conexión de sockets en Python?** * Un método que permite recibir datos desde el cliente. (**Correcto**) * Un método que envía datos al servidor. * Un método que establece la conexión. * Un método que cierra la conexión. **¿Qué función de lxml permite analizar un documento HTML usando expresiones XPath en Python?** * ''find()''. * ''XPath()''. (**Correcto**) * ''get()''. * ''parse()''. **De las siguientes, identifica las vulnerabilidades comunes en aplicaciones web. (Respuesta múltiple)** * SQL Injection.(**Correcto**) * Cross-Site Scripting (XSS).(**Correcto**) * Buffer overflow. * Inyección de comandos.(**Correcto**) **El módulo requests en Python permite realizar peticiones HTTP y manejar respuestas JSON.** * Verdadero. (**Correcto**) * Falso.