Cambia le autorizzazioni di un file con l'aiuto del mio gatto


55
root@system:~# less myfile
-bash: /bin/less: Input/output error

Il filesystem di root è morto. Ma il mio gatto è ancora vivo (nella mia memoria):

root@system:~# cat > /tmp/somefile
C^d
root@system:~#

È un po 'solo, però, tutti i suoi amici se ne sono andati:

root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error

Il sistema è ancora in esecuzione e soddisfa il suo scopo. So, lo so, l'unica risposta sensata a questo è di spegnere il sistema e sostituire l'unità root. Purtroppo questa non è un'opzione in quanto costerebbe molto tempo e denaro. Inoltre, ucciderebbe il mio gatto e questo mi renderebbe triste.

Ho pensato di portargli i suoi soliti amici da un donatore. Non oso tentare di inserirli nel caso in cui ssh cerchi di caricarlo e taglia la linea (il binario è sparito comunque). Sembra un lavoro per il cugino di mio gatto:

root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found

Sfortunatamente se n'è andato da tempo.

Ora, posso provare a ingannare il mio gatto per eseguire un rituale per resuscitarlo:

cat > netcat < /dev/tcp/localhost/9999

E quel tipo di lavoro ha funzionato. È quasi vivo:

root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied

Ha solo bisogno di una piccola scintilla di vita. Quel piccolo +xincantesimo magico che al momento non posso recitare.

Potete aiutarmi a riportare indietro gli amici del mio gatto?


3
Puoi eseguire /lib/ld-linux.so.2 ./netcat(o l'equivalente del tuo sistema) e far funzionare qualcosa?
Michael Homer,

4
Inoltre: che sistema operativo è questo? Hai qualche filesystem vfat o NTFS montato? File system di rete? Partizioni di cui puoi cancellare il contenuto? Ci sono tutti i file accessibili con i permessi di esecuzione?
Michael Homer,

3
"Inoltre, ucciderebbe il mio gatto e questo mi renderebbe triste." - Ho sempre pensato che il detto "Nessun bambino è stato danneggiato durante la produzione di questo" era solo un modo di dire, ma beh ...
Rugk

7
Ho dovuto assolutamente votare questo per tutte queste analogie tra gatti ... 😂
rugk,

2
povero gatto, spero che stia bene :(
gatto

Risposte:


37

Esistono diverse possibilità, tutte a seconda dei parametri esatti della tua situazione in questo momento. Presumo Linux nei seguenti esempi ove applicabile, ma funzionalità simili esistono su altre piattaforme nella maggior parte dei casi.

  • Potresti essere in grado di far eseguire un eseguibile al caricatore dinamico. Supponendo che catsia collegato dinamicamente, l'equivalente della tua piattaforma /lib/ld-linux.so.2sarà probabilmente anche in memoria e quindi utilizzabile per eseguire un binario:

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand

    Potresti avere più di questi (probabilmente a 32 e 64 bit) e potrebbero essere disponibili più copie o collegamenti simbolici che devono essere risolti. Uno di quelli potrebbe funzionare.

  • Se hai un filesystem vfat o NTFS montato o un altro che tratta tutti i file come 777, puoi creare il tuo eseguibile lì.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
  • Se hai un filesystem di rete montato, anche se non è scrivibile localmente, puoi creare file sul sistema remoto e usarli normalmente.
  • Se c'è una partizione montata di cui non ti interessa il contenuto, su un'unità che funziona ancora per lo più, puoi sostituire il contenuto con una nuova immagine dello stesso tipo di filesystem contenente gli eseguibili che vuoi - catdovrebbe andare bene per questo nel ruolo che le persone usano abitualmente dde puoi fornire l'immagine sulla rete.

    $ cat > /dev/sdb1 < ...

    Questo è plausibile, ma ha molti posti in cui non lavorare a seconda di ciò che è esattamente in memoria da quella partizione.

  • Se è presente un file accessibile con autorizzazione di esecuzione su qualsiasi file system scrivibile, puoi cat >sostituirlo con un file binario di tua scelta.

    $ cat > ~/test.py < ...
  • Poiché Bash è ancora in esecuzione, è possibile caricare dinamicamente un plug-in Bash nel processo che espone chmod. In particolare, è possibile installare e caricarectypes.sh , che fornisce un'interfaccia di funzione esterna a Bash e quindi dlcall chmod ./netcat 511.
  • Potresti portare un file foo.sodi libreria dinamica della tua costruzione e quindi catcaricarlo per tuo conto LD_PRELOAD, consentendoti di eseguire codice arbitrario.

    $ LD_PRELOAD=./hack.so cat /dev/null

    Se intercetti, ad esempio open,:

    int open(const char *path, int flags, ...) {
        chmod(path, 0755);
        return -1;
    }

    allora puoi fare tutto ciò che devi fare lì dentro.

Il mio suggerimento sarebbe di portare un busyboxeseguibile collegato staticamente come primo elemento (o davvero, solo un oggetto) in modo da avere l'intera gamma di comandi disponibili senza riutilizzare qualunque hack ti abbia portato a quel punto fino all'esaurimento.


3
Ri "collegato staticamente busybox": si noti che è sashstato specificamente progettato per questo tipo di caso d'uso e potrebbe essere più facilmente disponibile in un pizzico (ad esempio, è possibile installarlo in anticipo e lasciare una copia in esecuzione da qualche parte in modo che sia in memoria quando il sistema si rompe ... o puoi abbandonare i tuoi animali domestici e comprare un gruppo di bovini, suppongo).
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.