web-dev-qa-db-fra.com

Modifier les autorisations d'un fichier avec l'aide de mon chat

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

Le système de fichiers racine est mort. Mais mon chat est toujours vivant (dans ma mémoire):

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

Il est un peu seul cependant, tous ses amis sont partis:

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

Le système fonctionne toujours et remplit son objectif. Je sais, je sais, la seule réponse sensée à cela est de faire descendre le système et de remplacer le lecteur racine. Malheureusement, ce n'est pas une option car cela coûterait beaucoup de temps et d'argent. De plus, cela tuerait mon chat et cela me rendrait triste.

J'ai pensé à lui amener ses amis habituels d'un donateur. Je n'ose pas essayer de les scp, au cas où ssh essaie de le charger et coupe la ligne (le binaire a disparu de toute façon). Cela ressemble à un travail pour le cousin de mon chat:

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

Malheureusement, il est parti depuis longtemps.

Maintenant, je peux essayer de tromper mon chat pour effectuer un rituel pour le ressusciter:

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

Et ce genre de travail. Il est presque vivant:

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

Il a juste besoin d'un petit spark de vie. Ce petit +x incantation magique que je ne peux pas réciter pour le moment.

Pouvez-vous m'aider à ramener les amis de mon chat?

54
goncalopp

Il existe plusieurs possibilités, toutes en fonction des paramètres exacts de votre situation actuelle. Je vais supposer Linux dans les exemples suivants, le cas échéant, mais des fonctionnalités similaires existent sur d'autres plateformes dans la plupart des cas.

  • Vous pourrez peut-être demander au chargeur dynamique d'exécuter un exécutable pour vous. En supposant que cat est lié dynamiquement, l'équivalent de votre plate-forme de /lib/ld-linux.so.2 sera probablement également en mémoire et donc utilisable pour exécuter un binaire:

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

    Vous pouvez en avoir plusieurs (32 et 64 bits sont probables) et plusieurs copies peuvent être disponibles, ou des liens symboliques doivent être résolus. L'un d'eux peut fonctionner.

  • Si vous avez un système de fichiers vfat ou NTFS monté, ou un autre qui traite tous les fichiers comme 777, vous pouvez y créer votre exécutable.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
    
  • Si vous avez un système de fichiers réseau monté, même s'il n'est pas accessible en écriture localement, vous pouvez créer des fichiers sur le système distant et les utiliser normalement.
  • S'il y a une partition montée dont vous ne vous souciez pas du contenu, sur un lecteur qui fonctionne toujours principalement, vous pouvez remplacer le contenu par une nouvelle image du même type de système de fichiers contenant les exécutables que vous souhaitez - cat devrait être bien pour cela dans le rôle que les gens utilisent généralement dd pour, et vous pouvez fournir l'image sur le réseau.

    $ cat > /dev/sdb1 < ...
    

    Celui-ci est plausible, mais a beaucoup d'endroits pour ne pas fonctionner en fonction de ce qui est exactement en mémoire de cette partition.

  • S'il existe tout fichier accessible qui dispose d'une autorisation d'exécution sur n'importe quel système de fichiers accessible en écriture, vous pouvez cat > dedans pour remplacer le contenu par un binaire de votre choix.

    $ cat > ~/test.py < ...
    
  • Puisque Bash est toujours en cours d'exécution, vous pouvez charger dynamiquement un plugin Bash dans le processus qui expose chmod. En particulier, vous pouvez installer et charger ctypes.sh , qui fournit une interface de fonction étrangère à Bash, puis dlcall chmod ./netcat 511.
  • Vous pouvez apporter un fichier de bibliothèque dynamique foo.so de votre construction, puis demandez à cat de la charger en votre nom au moyen de LD_PRELOAD, vous permettant d'exécuter du code arbitraire.

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

    Si vous interceptez, par exemple, open:

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

    alors vous pouvez faire tout ce que vous devez faire là-dedans.

Ma suggestion serait d'apporter un exécutable busybox lié statiquement comme premier élément (ou vraiment, seul élément) afin que vous ayez la gamme complète des commandes disponibles sans réutiliser le hack qui vous a amené à ce point à l'épuisement.

37
Michael Homer