Cómo crear una reverse y bind shell con Python – Parte 2 de 3
2022-6-7 15:0:4 Author: thehackerway.com(查看原文) 阅读量:14 收藏

Demostración en vídeo de este post

En la parte 1 de esta corta serie se ha explicado el uso del SDK de Python para crear una «reverse shell», algo que se consigue con muy pocas líneas de código, sin embargo la conexión es plana y cualquiera podrá ver el tráfico entre cliente y servidor (víctima y atacante). En esta ocasión, se utilizará la librería Paramiko para conseguir el mismo objetivo, pero cifrando el tráfico con SSH.

En este caso el código es un poco más complejo comparado con lo que se ha explicado en el post anterior, pero perfectamente funcional. En primer lugar, es necesario crear el código correspondiente al servidor SSH, el cual se puede apreciar en la siguiente imagen

El paquete de Paramiko cuenta con una clase llamada «ServerInterface«, que permite implementar un servidor SSH básico y aunque en el ejemplo anterior se utiliza un mecanismo de autenticación basado en un usuario y contraseña incrustados en el código, se podría utilizar otro mecanismo más robusto basado en clave pública si fuese necesario.

Crear una clase que extienda de «ServerInterface» no es suficiente, ahora es el momento de crear un servidor TCP utilizando el módulo socket disponible en Python, aceptar las conexiones por parte de los clientes y a continuación, crear un objeto «Transport» de Paramiko para la gestión y cifrado de dicha conexión TCP. El código sería el siguiente

En este script hay que tener en cuenta que se ha creado antes una clave para el servidor, lo cual se puede conseguir fácilmente con la herramienta ssh-keygen. En este caso, dicha clave se encuentra en el directorio /home/adastra/.ssh/id_rsa, por lo tanto se tendría que cambiar esta ruta si la clave se encuentra en otro sitio. Por otro lado, se puede apreciar que la clase Transport es la que realmente se encarga de iniciar el servidor SSH usando el método «start_server» y a continuación, establece conexiones SSH con los clientes. Este servidor solo aceptará una conexión entrante por simplicidad, pero si hace falta, se puede crear un thread por cada cliente que intente conectarse utilizando el módulo threading.

Este script se ejecutaría en la máquina del atacante y esperará a que un cliente (víctima) se conecte.

Ahora es el momento de implementar el cliente, es decir, el payload que se ejecutará en la máquina de la víctima. En este caso es más sencillo, ya que basta con indicar los datos de conexión del servidor y utilizar nuevamente paramiko para establecer la conexión.

Por simplicidad, se utiliza la función «input» para poder introducir los datos de conexión con el servidor SSH, aunque en una muestra lo habitual sería indicar estos valores directamente en el código. Como se puede ver, basta con crear una instancia de la clase SSHClient y a continuación, establecer la conexión con el método «connect». Finalmente, se procede a abrir un «Channel» para poder enviar y recibir paquetes utilizando la conexión SSH de manera indefinida o hasta que el comando por parte del servidor (es decir, el atacante) sea «exit».

En la imagen anterior se puede ver que en la terminal superior se encuentra el servidor (máquina del atacante) y recibe la conexión por parte del cliente, que se encuentra en la terminal inferior. Una vez establecida dicha conexión, desde el servidor se pueden introducir comandos o instrucciones que se van a ejecutar directamente en la máquina del cliente gracias al módulo subprocess de Python.

Si quieres tener acceso al código, puedes consultar el repositorio en GitHub en donde encontrarás el fichero ssh_server.py y ssh_payload.py

Un saludo y Happy Hack!
Adastra.


文章来源: https://thehackerway.com/2022/06/07/como-crear-una-reverse-y-bind-shell-con-python-parte-2-de-3/
如有侵权请联系:admin#unsafe.sh