Administration Unix - TP séance 13
À la fin de la séance, déposez votre fichier de réponses sur la page Ametice en suivant bien les instructions, même si vous n'avez pas fini la planche ; lorsque vous aurez terminé, vous pourrez re-déposer la version finale.
Important : pour travailler ce TP, faites tous les essais dans la VM créée au TP 11, afin de ne pas risquer "d'abîmer" votre système hôte.
Exercice 1 : groupes et ACLs
a) Créer les users suivants avec la commande adduser
:
# prénom nom (login)
Alice Toirdrole (alice)
Bruno Dagen (bruno)
Charles Attan (charles)
Daisy Diossy (daisy)
Eric Hochet (eric)
b) Créer 2 groupes (guitaristes et chanteurs) avec la commande addgroup
, puis
placer :
- dans guitaristes :
alice
etbruno
- dans chanteurs :
bruno
etcharles
Vérifiez avec la commande id
le résultat pour chaque user.
c) Créez dans votre home directory les répertoires albums
, tablatures
et
paroles
, puis donnez-leur les droits et appartenance au groupe tels que
albums
: tout le monde doit pouvoir y accéder, mais le groupe et les autres ne doivent pas pouvoir y rajouter de fichiers ;tablatures
: les membres de guitaristes y ont accès et peuvent rajouter des fichiers, les autres n'y ont pas accès ;paroles
: les membres de chanteurs y ont accès, les autres n'y ont pas accès.
Enfin placez dans chaque répertoire un fichier texte avec les droits 644
.
d) Dans un autre terminal, prenez tout à tour l'identité de l'un des 5 utilisateurs.
Ce faisant, vérifiez pour chaque utilisateur s'il peut aller dans chacun des
3 répertoires, utiliser ls
, lire un fichier, le renommer, le modifier, créer
un nouveau fichier.
(Pour gagner du temps, indiquez quels sont les cas identiques où il n'y a pas besoin de re-tester).
e) Avec des ACLs, donnez la possibilité à daisy
d'accéder à tablatures
,
et à eric
d'accéder à paroles
et de pouvoir y créer des fichiers.
Testez comme dans la question précédente pour daisy
et eric
que le but
est atteint.
Exercice 2 : setuid et setgid
a) À l'aide de find
, trouvez tous les fichiers et répertoires à partir de
la racine qui ont le setuid
et/ou le setgid
.
Relancez en enregistrant les résultats dans un fichier trace1.txt
.
b) Recopiez le script suivant sous le nom exploit1.sh
:
#! /bin/bash
echo "Je suis $(id)"
exec bash -l
Rendez-le exécutable, donnez-lui comme propriétaire root
, puis le setuid
.
Vérifiez que ces opérations ont réussi avec ls -l
.
Enfin, exécutez le script en temps qu'utilisateur normal et vérifiez que
malgré le setuid
, exploit1.sh
n'a pas ouvert un root shell.
c) Recopiez le programme C suivant sous le nom exploit2.c
:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
printf ("Je suis %d %d\n", (int)getuid(), (int)geteuid());
setuid(0); // sans cela, sh perdra les droits
printf ("Je suis %d %d\n", (int)getuid(), (int)geteuid());
execle("/bin/sh", "sh", "-i", NULL, NULL);
perror("execl sh");
exit(1);
}
Installez le compilateur C :
$ sudo apt install gcc make
puis compilez le programme :
$ gcc -Wall -std=c99 exploit2.c -o exploit2
ensuite donnez-lui comme propriétaire root
, puis le setuid
.
Vérifiez que ces opérations ont réussi avec ls -l
.
Enfin, exécutez le programme en temps qu'utilisateur normal et vérifiez que
cette fois-ci, vous avez bien obtenu un root shell !
Sur un vrai système, on se gardera bien de laisser ce genre de
portes dérobées...
d) Écrivez un script scan-nouv-setuid.sh
qui effectue les opérations suivantes :
-
il affiche "Recherche des setuid/setgid en cours...", puis il refait la même commande que en a) en enregistrant les résultats dans le fichier
trace2.txt
; -
si
trace1.txt
n'existe pas, il affiche "opération terminée ; relancez une prochaine fois pour comparer.", renommetrace2.txt
entrace1.txt
, puis il s'arrête. -
il trie
trace1.txt
ettrace2.txt
avecsort
, chacun dans un fichier temporaire ; -
il compare les 2 fichiers temporaires avec la commande
diff
; -
si
diff
a réussi, le script affiche "Pas de nouveaux setuid/setgid détectés", sinon "De nouveaux setuid/setgid ont été détectés". -
Enfin, le script renomme
trace2.txt
entrace1.txt
puis efface les fichiers temporaires.
Vérifiez que le script détecte bien exploit1.sh
et exploit2
.