GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Umgehen des in /etc/passwd angegebenen Befehls/Skripts

Angenommen, es gibt eine (wahrscheinlich unbeabsichtigte) Hintertür.

Der Standardwert /etc/passwd auf Sun-Workstations der frühen 1990er Jahre enthielt einen Eintrag in etwa wie diesen:

games::0:0:games:/nopath:/bin/false

Mit anderen Worten, ein Konto namens „Spiele“ ohne Passwort. Anscheinend hatte das Genie, das auf diese Idee kam, keine Vorstellungskraft und wies ihr eine uid und eine gid von Null (dh Wurzel und Rad) zu. Im Allgemeinen war das in Ordnung, da das Home-Verzeichnis bedeutungslos war und die Shell auf ein Programm eingestellt war, das immer mit einem Fehler beendet wurde. Darüber hinaus wurden die Standardeinstellungen für jeden Zugriff über das Netzwerk – telnet, rlogin, rcp, ftp – so eingestellt, dass der Zugriff durch jede UID von Null verhindert wird. Es gab einen separaten passwd-Eintrag für root, mit einem richtig eingestellten Set-Passwort, Home-Verzeichnis und Shell.

Wenn Sie also versuchten, sich als Spiele anzumelden, würde Folgendes passieren:

  • Die Anmeldung als Spiele an der Konsole würde zunächst erfolgreich sein, aber dann die /bin/false spawnen Shell, die sofort beendet würde.
  • Die Verwendung von telnet oder rlogin würde die Anmeldung direkt verweigern. Auch wenn es gelungen wäre, die /bin/false Shell würde sofort beendet werden.
  • FTP und scp verwenden keine Shells, aber sie wurden so konfiguriert, dass sie den Zugriff auf uid null verweigern, sodass Sie sich nicht auf diese Weise anmelden konnten.
  • Eine GUI-Anmeldung würde die Standard-GUI-Dienste starten, einschließlich eines Fenstermanagers, eines Uhr-Clients und eines Terminals. Letztere würde sofort beendet werden, da ihre Kind-Shell sofort beendet würde. Sie würden also bis auf eine Uhr einen leeren Bildschirm erhalten. (Mehr dazu weiter unten...)
  • Wenn du wirklich hätte Um sich als root anzumelden, müssten Sie das entweder von der Konsole aus tun oder zuerst rlogin/telnet als ein anderer Benutzer auf dieser Maschine und dann su root . In beiden Fällen wird die Wurzel passwd verwendet Eintrag statt der Spiele passwd -Eintrag und funktioniert so, wie root funktionieren sollte.

Das Spielkonto schien also immer fehlzuschlagen, es sei denn, Sie haben sich über die GUI angemeldet. In diesem Fall erschien nur die Uhr. Sie können jedoch mit der rechten Maustaste auf den Hintergrund klicken, um ein Root-Menü mit einer werkseitig bereitgestellten Liste von Programmen zu erhalten, die Benutzer normalerweise für sich selbst anpassen würden. (Das Anpassen des Menüs funktionierte nicht für das Spielkonto; ich weiß nicht mehr genau, warum.) Sie könnten versuchen, mehr Terminalfenster aufzurufen, was alle fehlschlagen würde. Es gab ein Puzzlespiel (das möglicherweise überhaupt der Anstoß für den Bericht war). Eine andere Möglichkeit war, sich abzumelden. Und dann war da noch das grafische Debugging-Tool dbxtool .

dbxtool war ein grafisches Frontend für dbx symbolischer Debugger, ähnlich dem heutigen gdb . Da die UID null ist, konnten Sie sich mit jedem Prozess auf dem System verbinden und ihn steuern, obwohl dies nicht sinnvoll war, da von Sun bereitgestellte Programme ohne Symbole kompiliert wurden. Sie könnten eine Shell starten, aber dies würde Ihren SHELL verwenden Umgebungsvariable, die /bin/false war . Sie könnten jedoch auch Umgebungsvariablen ändern! Das bedeutete, dass Sie folgendermaßen eine Root-Shell erhalten konnten:

  1. Loggen Sie sich über die GUI als Spiele ein, ohne Passwort.
  2. Klicken Sie mit der rechten Maustaste, um das Stammmenü aufzurufen.
  3. Starten Sie eine dbxtool .
  4. setenv SHELL /bin/sh
  5. (Optional) setenv HOME /
  6. Starten Sie eine Shell mit !
  7. Da das Terminal nicht eingestellt ist, führen Sie stty sane aus

Voila, Root-Shell ohne Passwort!

Gehen Sie also nicht davon aus, dass ein Benutzer eine ungültige Shell nicht verlassen kann.


Sie können die Skriptausführung nicht umgehen. Dies ist Ihre Login-Shell , und wird bei jeder Anmeldung gestartet. Und als Login-Shell , wird Sie jedes Mal abmelden, wenn es endet. Aber Sie können Macken, Fehler und Inkonsistenzen in der Login-Shell verwenden, um zu entkommen.

Eine Sache, die Sie tun könnten, ist, mit einer beliebigen Option im Menü in eine Shell zu entkommen. Wenn Sie im Menü vim starten können , less , more oder einige andere Befehle, können Sie sich theoretisch befreien. Wenn der Systemadministrator erfahren ist, verwenden diese Befehle ihre eingeschränkten Versionen und funktionieren nicht.


Ich erinnere mich an eine Wargame-Herausforderung, bei der es einen ähnlichen Fall gab - die Shell zeigte auf etwas, das einfach eine Ausgabe mit more ausgab Befehl und beendete dann die Sitzung. Da jedoch mehr verfügt über einen eingebauten Texteditor (in diesem speziellen Fall war es vi), es reichte aus, die Größe des Terminalfensters, von dem aus Sie sich verbunden haben, zu ändern, damit mehr aktiviert wird, und verwenden Sie ihn dann, um die Shell zu verlassen.

Die Antwort hängt also davon ab, was Ihr Skript tut. Überprüfen Sie den Mann Seiten für jeden der Befehle, die Sie ausführen, um eine Schwachstelle zu vermeiden.


Linux
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Der Unterschied zwischen ~/.profile, ~/.bashrc, ~/.bash_profile, ~/.gnomerc, /etc/bash_bashrc, /etc/screenrc …?

  3. Wie schreibe ich ein automatisch bezogenes Shell-Skript in /etc/profile?

  4. Die Bedeutung von $? In einem Shell-Skript?

  5. Beim Erstellen des ersten Bash-Skripts kann der Cd-Befehl nicht „hängen“ bleiben?

Verstehen der /etc/passwd-Datei

Der richtige Weg zum Bearbeiten von /etc/passwd- und /etc/group-Dateien unter Linux

Wie führe ich einen Befehl in einem Shell-Skript aus?

Die Dateien /proc/mounts, /etc/mtab und /proc/partitions verstehen

Führen Sie ein Shell-Skript über den Befehl docker-compose im Container aus

So richten Sie /etc/issues ein, um die IP-Adresse für eth0 anzuzeigen