web-dev-qa-db-fra.com

Comment chmod sans / usr / bin / chmod?

Aujourd'hui, un entraîneur Unix m'a raconté une histoire où le mot de passe root avait été divulgué aux étudiants, et l'un des gars a retiré l'autorisation d'exécution de /usr/bin/chmod lui-même. Comment récupérer chmod dans ce cas et le rendre à nouveau exécutable? Disons que le récupérer à partir d'une source externe ou le recompiler n'est pas une option préférable, y a-t-il un hack intelligent qui peut récupérer ce chmod lui-même?

Notez que cela s'est produit il y a longtemps et que je ne cherche pas de solution à un problème actuel, je suis simplement curieux de savoir comment Unix nous offre un tel problème.

157

Vous pouvez exécuter le chargeur directement et lui passer la commande que vous souhaitez exécuter:

/lib/ld-linux.so /bin/chmod +x /bin/chmod

Votre chemin d'accès au chargeur peut varier. Sur un système 64 bits, vous devez choisir le bon en fonction de la façon dont chmod a été compilé; la version 64 bits s'appelle quelque chose comme /lib64/ld-linux-x86-64.so.2

196
Michael Mrozek

L'utilitaire chmod s'appuie sur l'appel système chmod() (voir man 2 chmod). Donc, vous pouvez le faire avec quelques lignes de C, ou à peu près tout autre langage qui a un wrapper (qui serait la plupart d'entre eux). Très peu de systèmes * nix vont manquer d'un compilateur C et d'un interpréteur Perl; la plupart des distributions Linux nécessitent que cette dernière fonctionne.

Perl -e 'chmod 0755, "foobar.file"'
104
goldilocks

Certains systèmes ont également busybox installé, auquel cas vous pouvez exécuter:

busybox chmod +x /bin/chmod

Puisque vous demandiez des hacks, j'ai juste pensé à un autre:

mv /bin/chmod /bin/chmod.orig
cp -a /bin/chown /bin/chmod

Vous avez maintenant un /bin/chmod c'est exécutable mais c'est en fait chown (c'est-à-dire un autre binaire). Maintenant, tout ce que nous avons à faire est de l'écraser avec le binaire d'origine.

dd if=/bin/chmod.orig of=/bin/chmod

Il conserve l'indicateur + x, vous venez donc de voler le + x d'un autre fichier pour celui-ci.

Bien sûr, si tous ces binaires alternatifs (y compris le chargeur, Perl, python, gcc et cetera) étaient chmod -x, le corriger à partir d'un système de secours peut être la seule option.

70
frostschutz

Facile. Ce que vous pouvez faire, c'est préparer un autre fichier exécutable, puis cp chmod par-dessus.

 $ cp /bin/ls chmod
 $ cp /bin/chmod .

Le premier cp crée un fichier appelé chmod avec des permissions exécutables, mais qui est vraiment l'exécutable ls. Le second cp remplit ce fichier avec le code binaire de chmod, tout en conservant les autorisations d'exécution du fichier cible (car nous n'avons spécifié aucune option pour reporter les autorisations du fichier source).


Une autre approche consiste à utiliser l'utilitaire install qui est un programme de copie glorifié qui peut définir des autorisations en une seule étape. (Voir le -m argument.)

$ install -m a+x /bin/chmod .
$ ./chmod # executes

Le programme install ne fait pas partie de la spécification Unix, mais il se trouve dans BSD et dans GNU Coreutils. Les deux prennent en charge le -m option avec une syntaxe de type chmod, à la fois symbolique et octale.

45
Kaz

Les premières choses du haut de ma tête,

  • Démarrez à partir de n'importe quelle autre source (livre réseau, cd, etc.) et utilisez le chmod sur cette source pour définir les autorisations.
  • Écrivez un petit programme C pour modifier les autorisations.
  • Écrire un script Perl (Ruby, php, python, etc.) pour changer les permissions

/usr/bin/chmod fait juste un appel système pour changer les permissions, vous pouvez faire appeler ce système vous-même de plusieurs façons.

16
EightBitTony

C'est plus piraté que toutes les autres réponses (à l'exception possible du ld-linux.so réponse, qui est un vraiment intelligent piratage), mais peut être plus adaptable à d'autres problèmes (surtout si vous tombez dans un tourbillon temporel et revenez dans un Land Before Perl ™).

  1. Pour plus de sécurité, copiez /bin/chmod vers un endroit sûr:

    cd
    cp /bin/chmod .
    
  2. Faire echo chmod | cpio -oc > chmod.cpio
    Cela crée une archive cpio (semblable à une archive tar) contenant chmod. Le -c option spécifie que les métadonnées du fichier sont écrites en hexadécimal (c'est-à-dire en ASCII).

  3. vi chmod.cpio
    Vous verrez quelque chose comme

    0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
                       ↑↑↑
    

    suivi d'un mélange de caractères de contrôle, standard ASCII caractères et étendu ASCII caractères. Notez que 0644 = 0x1A4 et 0755 = 0x1ED. Trouvez le 1A4 (à partir de la 20e position) et changez-le en 1ED. Sauvegarder et quitter.

    • Si vous avez un éditeur hexadécimal ou quelque chose de similaire, il peut être préférable de l'utiliser pour éviter le risque que vi contamine le code exécutable binaire du fichier. Mais j'ai essayé cela avec vi, et cela a semblé fonctionner correctement.
  4. cpio -i < chmod.cpio
    Vous avez maintenant une copie de chmod dans votre répertoire, protégé 755.

D'autres programmes d'archivage peuvent avoir des capacités similaires. En particulier, cpio est ancien et peut être obsolète; si vous ne l'avez pas, recherchez pax.

12
Scott

Ou encore plus simple - utilisez setfacl qui est souvent présent sur les systèmes modernes:

  1. Définissez l'autorisation exécutable pour l'utilisateur:

    # setfacl -m u::rx /bin/chmod
    
  2. Utilisez maintenant le binaire maintenant exécutable pour redéfinir ses propres autorisations sur celles d'origine (c'est-à-dire pour tous les utilisateurs)

    # chmod +x /bin/chmod
    
  3. Supprimez les entrées ACL étendues - facultatif, car il pourrait y avoir une bonne raison pour laquelle elles étaient là en premier lieu.

    # setfacl -b /bin/chmod
    

Notez que setfacl peut être utilisé sur un système de fichiers qui ne prend pas également en charge les ACL.

8
Pedro Guimaraes

rsync peut également être utilisé pour modifier les autorisations du fichier

# rsync /bin/chmod /tmp/chmod --chmod=ugo+x
# ls -al /tmp/chmod
  -rwxr-x--- 1 root root 52000 Sep  6 15:13 /tmp/chmod
#
5
Ofer

Canalisez le contenu de chmod dans un fichier déjà exécutable

cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh
3
p.j