03.01.2015 Views

Utilisation d'une chroot pour chrooter un shell - Lita

Utilisation d'une chroot pour chrooter un shell - Lita

Utilisation d'une chroot pour chrooter un shell - Lita

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

TD 5<br />

Sources: « Cours de sécurité : analyse et défense », Tristan de CACQUERAY, Solal<br />

JACOB, Julien STERCKEMAN<br />

Rappel (exercice 3) : <strong>Utilisation</strong> d’<strong>un</strong>e <strong>chroot</strong> <strong>pour</strong> <strong>chroot</strong>er <strong>un</strong> <strong>shell</strong><br />

a. Que fait la commande <strong>chroot</strong> <br />

Chroot est <strong>un</strong> appel système permettant de faire tourner <strong>un</strong> programme dans <strong>un</strong> environnement<br />

restreint. La commande <strong>chroot</strong> prend deux paramètres : le chemin du nouveau répertoire racine (/),<br />

et le chemin du programme à lancer (relatif au premier argument).<br />

Problèmes liés à <strong>un</strong> environnement restreint<br />

Le premier problème est lié aux librairies partagées qu’il va falloir identifier et recopier dans la jail.<br />

La commande ldd permet d’identifier les librairies partagées dont le programme a besoin. Le<br />

second problème est lié au fonctionnement du programme, qui va avoir besoin de certains devices,<br />

(/dev/{null,zero,random,urandom}), certains fichiers de conf tel que : /etc/<br />

{localtime,ld.so.conf,ld.so.cache,nsswitch.conf} , /etc/{resolv.conf,hosts}<br />

b. Créons <strong>un</strong> répertoire qui va héberger notre mini-linux:<br />

$ mkdir my<strong>chroot</strong><br />

c. Créer les répertoires de base:<br />

$ mkdir my<strong>chroot</strong>/bin<br />

$ mkdir my<strong>chroot</strong>/lib<br />

d. On va copier bash et ls dans notre répertoire bin<br />

$ cp /bin/bash /bin/ls my<strong>chroot</strong>/bin/<br />

e. Nous allons utiliser la commande ldd <strong>pour</strong> recopier dans la prison les bibliothèques<br />

nécessaires au fonctionnement de bash et ls :<br />

$ ldd /bin/bash<br />

linux-gate.so.1 => (0x00de2000)<br />

libncurses.so.5 => /lib/libncurses.so.5 (0x00a07000)<br />

libdl.so.2 => /lib/libdl.so.2 (0x0081a000)<br />

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)<br />

libtinfo.so.5 => /lib/libtinfo.so.5 (0x00af8000)<br />

/lib/ld-linux.so.2 (0x003e8000)<br />

$ cp /lib/libncurses.so.5 /lib/libtinfo.so.5 /lib/ld-linux.so.2 my<strong>chroot</strong>/lib<br />

$ mkdir my<strong>chroot</strong>/lib/i386-linux-gnu<br />

$ cp /lib/i386-linux-gnu/libc.so.6 /lib/libtinfo.so.5 my<strong>chroot</strong>/lib/i386-linuxgnu<br />

f. Faire de même <strong>pour</strong> ls<br />

g. Créer l’environnement restreint avec <strong>chroot</strong>:<br />

# <strong>chroot</strong> my<strong>chroot</strong> /bin/bash<br />

1


Exercice 4 : Casser la <strong>chroot</strong><br />

1 Peut-on <strong>chroot</strong>er <strong>un</strong> processus lancé dans <strong>un</strong> environnement restreint <br />

On rappelle que <strong>pour</strong> chaque commande à <strong>chroot</strong>er, il faut : (i) savoir où est le fichier de la<br />

commande ; (ii) copier les librairies nécessaires dans l'environnement restreint si elles n’y sont pas<br />

déjà ; (iii) copier le fichier de la commande dans le répertoire bin de cette «prison».<br />

1.1 Placez-vous dans le dossier parent du dossier my<strong>chroot</strong> que nous avons créé la<br />

semaine dernière puis :<br />

$ cp -R my<strong>chroot</strong> waterbuffalo<br />

$ mv waterbuffalo my<strong>chroot</strong><br />

1.2 Copiez la commande /usr/sbin/<strong>chroot</strong> dans my<strong>chroot</strong>/bin ainsi que les<br />

librairies nécessaires à son exécution dans my<strong>chroot</strong>/lib. Puis :<br />

# <strong>chroot</strong> my<strong>chroot</strong> /bin/bash<br />

# <strong>chroot</strong> waterbuffalo<br />

1.3 Quelle est la réponse à la question 1 initiale Sortez de(s) environnement(s)<br />

restreint(s) et revenez au dossier parent de my<strong>chroot</strong>.<br />

2 Un processus peut se <strong>chroot</strong>er lui-même en environnement restreint avec la primitive C<br />

<strong>chroot</strong>.<br />

2.1 Étudiez la page man 2 <strong>chroot</strong> et comparez-la à la page man <strong>chroot</strong>.<br />

2.2 Copiez le code C et exécutez les commandes suivantes :<br />

$ vi <strong>chroot</strong>_cwd.c<br />

#include <br />

#include <br />

int main(int argc, char *argv[]) {<br />

char s[1024];<br />

}<br />

<strong>chroot</strong>(argv[1]);<br />

getcwd(s, 1024);<br />

printf("Répertoire courant: %s\n", s);<br />

execl("/bin/bash", "bash", "-i", 0);<br />

$ gcc <strong>chroot</strong>_cwd.c -o <strong>chroot</strong>_cwd<br />

# ./<strong>chroot</strong>_cwd my<strong>chroot</strong><br />

2.3 Expliquez le résultat obtenu.<br />

2


3 On déduit <strong>un</strong> programme C simple permettant de sortir de la <strong>chroot</strong> :<br />

$ vi leave_<strong>chroot</strong>.c<br />

#include <br />

int main(int argc, char *argv[]) {<br />

int i;<br />

}<br />

<strong>chroot</strong>(argv[1]);<br />

for(i=0; i

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!