From 057053bd62dea7a464f0028c0bbddead6222ca64 Mon Sep 17 00:00:00 2001 From: Manuel Vergara Date: Tue, 6 Jun 2023 20:04:43 +0200 Subject: [PATCH] Add exercise 4 by script-hacking course Signed-off-by: Manuel Vergara --- scripts-hacking-etico/README.md | 49 ++++++++++++++---- scripts-hacking-etico/img/01.png | Bin 0 -> 20383 bytes scripts-hacking-etico/img/02.png | Bin 0 -> 34357 bytes scripts-hacking-etico/src/04-twisted.py | 65 ++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 11 deletions(-) create mode 100644 scripts-hacking-etico/img/01.png create mode 100644 scripts-hacking-etico/img/02.png create mode 100644 scripts-hacking-etico/src/04-twisted.py diff --git a/scripts-hacking-etico/README.md b/scripts-hacking-etico/README.md index d3e6b4d..d4080d1 100644 --- a/scripts-hacking-etico/README.md +++ b/scripts-hacking-etico/README.md @@ -4,6 +4,12 @@ Estos ejercicios se han creado directamente usando Inteligencias Artificales. ![](https://media.giphy.com/media/NlIa1aW3oikdNkfE07/giphy.gif) +Índice: +- [Bibliotecas](#bibliotecas) +- [Ejercicios propuestos por copilot](#ejercicios-propuestos-por-copilot) +- [Ejercicio propuesto por chatGPT](#ejercicio-propuesto-por-chatgpt) + + ## Bibliotecas Bibliotecas útiles para la manipulación de paquetes de red, la programación de red asincrónica, la generación de datos falsos, la criptografía, la creación de exploits y pruebas de penetración, etc @@ -33,8 +39,10 @@ Ten en cuenta que este ejercicio es solo una simulación y no debe utilizarse pa - **Ejercicio 9**: instalar la biblioteca de Python `paramiko` y crear un cliente SSH que permita a un usuario ejecutar comandos en un servidor remoto - **Ejercicio 10**: instalar la biblioteca de Python `pylibnet` y crear un paquete de red personalizado que contenga un mensaje de texto -**Solución según chatGPT:** -- Solución ejercicio 1: +--- + +### Soluciones según chatGPT: +#### Solución ejercicio 1: En este ejercicio, utilizamos la biblioteca python-nmap para realizar un escaneo de puertos a una dirección IP específica. Creamos un objeto de PortScanner, luego llamamos al método scan para escanear los puertos en la dirección IP especificada. Finalmente, iteramos sobre los resultados del escaneo para imprimir el estado de cada puerto. @@ -58,7 +66,7 @@ for port in result['scan']['192.168.1.1']['tcp']: print(f"Puerto {port} está {state}") ``` -- Solución ejercicio 2: +#### Solución ejercicio 2: En este ejercicio, utilizamos la biblioteca impacket para realizar un escaneo de puertos utilizando el protocolo SMB (Server Message Block). Creamos un objeto de SMB cliente y nos conectamos al servidor SMB en la dirección IP especificada. Luego, llamamos al método scan_ports para escanear los puertos. Finalmente, iteramos sobre los puertos encontrados e imprimimos los puertos abiertos. @@ -84,7 +92,7 @@ for port in ports: print(f"Puerto {port} está abierto") ``` -- Solución ejercicio 3: +#### Solución ejercicio 3: En este ejercicio, utilizamos la biblioteca requests para realizar una solicitud HTTP GET a una URL específica. Utilizamos la función get de requests pasando la URL como argumento. La respuesta se almacena en la variable response, y podemos acceder al código de estado utilizando response.status_code y al contenido de la respuesta utilizando response.text. Finalmente, imprimimos el código de estado y el contenido de la respuesta. @@ -99,12 +107,17 @@ print(f"Código de estado: {response.status_code}") print(f"Contenido de la respuesta: {response.text}") ``` -- Solución ejercicio 4: +#### Solución ejercicio 4: En este ejercicio, utilizamos la biblioteca twisted para crear un servidor de chat básico. Creamos una clase ChatServer que hereda de protocol.Protocol, y en ella mantenemos una lista de todas las conexiones de cliente. Cuando un cliente se conecta, lo agregamos a la lista de conexiones y cuando un cliente se desconecta, lo eliminamos de la lista. Cuando se recibe un mensaje de un cliente, lo imprimimos y luego lo enviamos a todos los otros clientes conectados. La clase ChatServerFactory hereda de protocol.Factory y se utiliza para construir instancias de ChatServer cuando se establece una nueva conexión. Luego, utilizamos reactor.listenTCP para iniciar el servidor en el puerto 8000. +Antes de nada se debe instalar la dependencia: +```shell +pip install twisted +``` + ```python from twisted.internet import protocol, reactor @@ -139,7 +152,21 @@ if __name__ == '__main__': reactor.run() ``` -- Solución ejercicio 5: +Una vez que el servidor de chat se haya iniciado correctamente, deberías ver el mensaje "Servidor de chat iniciado en el puerto 8000...". + +Una vez se ejecute, el servidor de chat quedará esperando conexiones de clientes en el puerto 8000. + +![](img/01.png) + +Puedes conectar clientes al servidor utilizando aplicaciones o bibliotecas que admitan el protocolo de chat utilizado por este servidor. Por ejemplo, puedes usar Telnet en la línea de comandos para conectarte al servidor de chat: + +```shell +telnet localhost 8000 +``` + +![](img/02.png) + +#### Solución ejercicio 5: En este ejercicio, utilizamos la biblioteca faker para generar nombres aleatorios. Creamos un objeto de Faker y luego utilizamos el método name para generar nombres aleatorios. Utilizamos un bucle for para generar y mostrar 10 nombres aleatorios. @@ -158,7 +185,7 @@ for _ in range(10): print(name) ``` -- Solución ejercicio 6: +#### Solución ejercicio 6: En este ejercicio, utilizamos la biblioteca scapy para crear un paquete de red personalizado. Creamos un paquete IP utilizando la función IP de scapy.all y especificamos la dirección IP de destino como "192.168.1.1". Añadimos una capa ICMP al paquete utilizando ICMP(). Luego, asignamos el mensaje de texto "Hola, este es un mensaje" al cuerpo del paquete. @@ -174,7 +201,7 @@ packet = IP(dst="192.168.1.1")/ICMP()/"Hola, este es un mensaje" send(packet) ``` -- Solución ejercicio 7: +#### Solución ejercicio 7: En este ejercicio, utilizamos la biblioteca cryptography para encriptar un mensaje utilizando el algoritmo de cifrado Fernet. Generamos una clave de cifrado utilizando Fernet.generate_key(). Luego, creamos un objeto Fernet con la clave generada. @@ -199,7 +226,7 @@ encrypted_message = cipher.encrypt(message) print(f"Mensaje encriptado: {encrypted_message}") ``` -- Solución ejercicio 8: +#### Solución ejercicio 8: En este ejercicio, utilizamos la biblioteca pwntools para crear un exploit que se conecta a un servidor remoto y ejecuta comandos. Utilizamos la función remote para establecer la conexión con la dirección IP del servidor y el puerto especificado. @@ -225,7 +252,7 @@ print(output) conn.close() ``` -- Solución ejercicio 9: +#### Solución ejercicio 9: En este ejercicio, utilizamos la biblioteca paramiko para crear un cliente SSH que se conecta a un servidor remoto y ejecuta comandos. Creamos una instancia de SSHClient. @@ -257,7 +284,7 @@ client.close() ``` -- Solución ejercicio 10: +#### Solución ejercicio 10: En este ejercicio, utilizamos la biblioteca pylibnet para crear un paquete de red personalizado. Primero, creamos un paquete Ethernet utilizando libnet_create_packet y especificamos el tipo de enlace como LINKTYPE_ETHERNET. diff --git a/scripts-hacking-etico/img/01.png b/scripts-hacking-etico/img/01.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7a7adc0293ca5d58e3c45bd4fd519d4b635608 GIT binary patch literal 20383 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 P;FqkV(z_~glaT)fg12pp literal 0 HcmV?d00001 diff --git a/scripts-hacking-etico/src/04-twisted.py b/scripts-hacking-etico/src/04-twisted.py new file mode 100644 index 0000000..8ae2db4 --- /dev/null +++ b/scripts-hacking-etico/src/04-twisted.py @@ -0,0 +1,65 @@ +""" +Instalar la biblioteca de Python `twisted` +y crear un servidor de chat que permita +a los usuarios enviar mensajes a todos +los demás usuarios conectados. +""" +from twisted.internet import protocol, reactor + + +class ChatServer(protocol.Protocol): + """ + Servidor de chat que permite a los usuarios + """ + connections = [] + + def connectionMade(self): + """ + Se llama cuando un cliente se conecta al servidor. + """ + + print("Cliente conectado:", self.transport.getPeer()) + self.connections.append(self) + + def connectionLost(self, reason): + """ + Se llama cuando un cliente se desconecta del servidor. + """ + + print("Cliente desconectado:", self.transport.getPeer()) + self.connections.remove(self) + + def dataReceived(self, data): + """ + Se llama cuando un cliente envía un mensaje al servidor. + """ + + message = data.decode() + print("Mensaje recibido:", message) + + # Enviar el mensaje a todos los clientes conectados + for client in self.connections: + client.transport.write(data) + + +class ChatServerFactory(protocol.Factory): + """ + Fábrica de servidores de chat. + """ + + def buildProtocol(self, addr): + """ + Construir un servidor de chat. + """ + + return ChatServer() + + +# Iniciar el servidor de chat +if __name__ == '__main__': + + reactor.listenTCP(8000, ChatServerFactory()) + + print("Servidor de chat iniciado en el puerto 8000...") + + reactor.run()