Aller au contenu

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 et bruno
  • dans chanteurs : bruno et charles

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.", renomme trace2.txt en trace1.txt, puis il s'arrête.

  • il trie trace1.txt et trace2.txt avec sort, 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 en trace1.txt puis efface les fichiers temporaires.

Vérifiez que le script détecte bien exploit1.sh et exploit2.