Changer les permisions d'un fichier avec l'aide de mon chat

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

Le système de fichiers racine est mort. Mais mon chat est toujours en vie (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 mettre le système hors tension 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 apporter ses amis habituels d'un donneur. Je n'ose pas essayer de les scp, au cas où ssh essaie de le charger et coupe la ligne (le binaire est quand même parti). 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 qu'il effectue 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'une petite étincelle de vie. Cette petite +xincantation magique que je ne peux pas réciter pour le moment.

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

goncalopp
la source
3
Pouvez-vous exécuter /lib/ld-linux.so.2 ./netcat(ou l'équivalent de votre système) et obtenir quelque chose?
Michael Homer
4
Aussi: de quel système d'exploitation s'agit-il? Avez-vous des systèmes de fichiers vfat ou NTFS montés? Systèmes de fichiers réseau? Des partitions dont vous pouvez effacer le contenu? Existe-t-il des fichiers accessibles avec une autorisation d'exécution?
Michael Homer
3
"En plus, ça tuerait mon chat et ça me rendrait triste." - J'ai toujours pensé que le dicton "Aucun enfant n'a été blessé pendant la production de ce film" était juste un dicton, mais bon…
rugk
7
Je devais totalement upvoter cela pour toutes ces analogies de chats…
rugk
2
pauvre chat, j'espère qu'il va bien :(
Chat

Réponses:

37

Il y a plusieurs possibilités, tout dépend des paramètres exacts de votre situation actuelle. Je vais supposer que Linux est utilisé dans les exemples suivants, mais des fonctionnalités similaires existent sur d’autres plates-formes dans la plupart des cas.

  • Vous pourrez peut-être faire en sorte que le chargeur dynamique exécute un exécutable à votre place. En supposant que ce catlien soit lié dynamiquement, l'équivalent de votre plate-forme /lib/ld-linux.so.2sera probablement aussi 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 (des versions 32 et 64 bits sont probables) et plusieurs copies sont disponibles, ou des liens symboliques doivent être résolus. L'un d'entre 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 créer votre fichier exécutable ici.

    $ 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 sur le contenu de, une partition montée vous ne vous inquiétez pas sur un lecteur qui est encore la plupart du temps au travail, vous pouvez remplacer le contenu d'une nouvelle image du même type de système de fichiers contenant executables que vous voulez - catdevrait bien pour cela dans le rôle que les gens utilisent habituellement ddpour, et vous pouvez fournir l’image sur le réseau.

    $ cat > /dev/sdb1 < ...

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

  • Si un fichier accessible disposant d'une autorisation d'exécution sur un système de fichiers accessible en écriture, vous pouvez le cat >remplacer 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 plug-in Bash dans le processus qui expose chmod. En particulier, vous pouvez installer et chargerctypes.sh , ce qui fournit une interface de fonction étrangère à Bash, puis dlcall chmod ./netcat 511.
  • Vous pouvez importer un fichier foo.sode bibliothèque dynamique de votre construction, puis le catcharger en votre nom LD_PRELOAD, ce qui vous permet 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 ce que vous devez faire là-bas.

Ma suggestion serait d’introduire un busyboxfichier exécutable lié statiquement comme premier élément (ou, en réalité, comme élément unique) afin que vous disposiez de toute la gamme de commandes disponibles sans avoir à réutiliser ce que le piratage pouvait vous amener à épuisement.

Michael Homer
la source
3
Re "lié de manière statique busybox": Notez qu'il a sashété spécialement conçu pour ce type de cas d'utilisation et qu'il peut être plus facilement disponible rapidement (vous pouvez par exemple l'installer à l'avance et laisser une copie exécutée quelque part de manière à ce qu'elle soit en mémoire lorsque le système pauses ... ou vous pouvez abandonner vos animaux de compagnie et acheter un groupe de bétail à la place, je suppose).
Kevin