Demostración en vídeo de este post
Existen cientos de herramientas que te permiten crear una reverse o bind shell, desde la forma más simple y tradicional que consiste en utilizar Netcat, hasta el uso de herramientas como Chisel, Empire Framework, Merlin, Covenant o Metasploit. Existen muchas formas de hacerlo, sin embargo en este post se explicará cómo utilizar el SDK de Python para crear rutinas que permitan establecer una reverse shell sin tener que usar librerías externas, algo que viene estupendamente cuando se pretende crear rutinas que sean lo suficientemente sigilosas como para evadir mecanismos de seguridad en la víctima. Por norma general, las muestras creadas «a mano», suelen dar mejores resultados en la etapa de evasión, por éste motivo y muchos otros, es fundamental saber programar. Nunca me cansaré de repetirlo 🙂
¿Cómo implementar una reverse shell usando Python?
Como es evidente, hace falta contar con una instalación de Python, lo cual en un sistema basado en Linux no es problema ya que se encuentra instalado por defecto en prácticamente todas las distribuciones, pero si se trata de un Windows es necesario hacerlo manualmente.
Para implementar una reverse shell en Python es necesario módulo socket el cual incluye todas las funcionalidades necesarias para crear clientes y servidores TCP. Gracias a la la función connect de la clase Socket, es posible establecer una conexión a una IP/dominio y puerto concreto, resulta extremadamente sencillo hacerlo en Python.
En este caso, al ser una reverse shell, es necesario que en la máquina del atacante se encuentre el puerto abierto que será el encargado de recibir la conexión reversa. Se puede utilizar nuevamente Python para ello, basta con crear un servidor TCP plano, pero dado que es la máquina del atacante, se tendrá un total control sobre ella y se puede utilizar una herramienta como socat o netcat para recibir la conexión.
El siguiente paso es el más interesante, ya que es necesario duplicar los fd (file descriptors) correspondientes a los flujos de entrada, salida y error del socket para luego vincularlos a un nuevo subproceso, que será el que genera la shell.
La instrucción os.dup2, es simplemente un envoltorio de la system call «dup» que permite duplicar un file descriptor, que es justo lo que hace falta en este punto para que toda la interacción del programa «/bin/bash» sea enviada al atacante por medio del socket.
Como se puede ver, la creación de una reverse shell en Python no es nada compleja y se puede conseguir en cuestión de minutos, sin embargo en este punto merece la pena mencionar que la conexión es plana, lo que significa que un IDS o cualquiera en la red, podrá ver la interacción entre el atacante y la víctima. El siguiente paso por lo tanto, consiste en crear una reverse shell que tenga algún mecanismo de cifrado que impida que las actividades puedan ser detectadas fácilmente. Esto, se verá en el siguiente post.
Un saludo y Happy Hack!
Adastra.