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.
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
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"'
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.
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.
Les premières choses du haut de ma tête,
/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.
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 ™).
Pour plus de sécurité, copiez /bin/chmod
vers un endroit sûr:
cd
cp /bin/chmod .
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).
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.
vi
contamine le code exécutable binaire du fichier. Mais j'ai essayé cela avec vi
, et cela a semblé fonctionner correctement.cpio -i < chmod.cpio
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
.
Ou encore plus simple - utilisez setfacl
qui est souvent présent sur les systèmes modernes:
Définissez l'autorisation exécutable pour l'utilisateur:
# setfacl -m u::rx /bin/chmod
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
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.
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
#
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