Demostración en vídeo de este post
Cómo crear una reverse y bind shell con Python – Parte 1 de 3
Cómo crear una reverse y bind shell con Python – Parte 2 de 3
En esta última entrega veremos cómo crear una bind shell con Python. En realidad es algo que no tiene mucha complejidad ya que se aplican los mismos principios y librerías que se han visto en las dos partes anteriores, solamente que en este caso el sentido de la conexión cambia y es ahora el la víctima quien levanta el servidor y espera una conexión entrante por parte del atacante.
Para crear una bind shell, será necesario utilizar el módulo «socket» y sobre una instancia de la clase «Socket», invocar a los métodos «bind», «listen» y «accept» en este orden.
Lo que se aprecia en la imagen anterior sería perfectamente válido para levantar un servidor TCP plano y aceptar una conexión, aunque evidentemente aún falta implementar más instrucciones.
El siguiente paso consistiría en gestionar la conexión, concretamente los flujos de entrada, salida y error. Dado que lo que se pretende es «recibir bytes» por parte del socket cliente y a continuación, pasar esas cadenas al sistema operativo para que las ejecute en forma de comandos, el flujo de entrada es precisamente lo que interesa gestionar en primer lugar.
En este caso se utiliza la función «select» que representa un envoltorio de la system call «select» en sistemas Unix y se utiliza el file descriptor del socket cliente para recibir los datos que envía el atacante desde su máquina. Finalmente, tal como se ha visto en los dos artículos anteriores, se utiliza la clase Popen con el objetivo de crear un proceso y ejecutar el comando que se está enviando en el socket. En este caso, el programa es capaz de aceptar múltiples clientes y por lo tanto, las referencias de cada uno de ellos se van almacenando en una lista en la que se van añadiendo o eliminando las conexiones entrantes.
En la consola superior se observa la ejecución del script que permite establecer la bindshell y en la consola inferior, desde la máquina del atacante se establece la conexión que permite la ejecución de instrucciones.
Ahora bien, en este caso nuevamente el tráfico no se encuentra cifrado, por lo tanto sería posible capturar dichos paquetes en la red y ver su contenido. La solución a este problema podría ser utilizar Paramiko tal como se ha mencionado en el post anterior a este para establecer conexiones cifradas con SSH, algo que puedes hacer cambiando un poco las instrucciones de los scripts que se han enseñado en la parte dos de esta serie.
Un saludo y Happy Hack!
Adastra.