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
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