Ich habe gerade das OverTheWire Bandit-Kriegsspiel Level 18 abgeschlossen .
Das war eine Überraschung. Hier sind die Anweisungen für dieses Level.
Das Passwort für die nächste Ebene wird in einer Datei- Readme- Datei im Homedirectory gespeichert. Leider hat jemand .bashrc geändert , um Sie abzumelden , wenn Sie sich mit SSH anmelden.
Ich dachte über eine Möglichkeit nach, die Shell überspringen zu lassen .bashrc
. Bevor ich jedoch eine Lösung fand, war ich versucht, einfach eine SFTP-Verbindung mit dem Server herzustellen. Ich habe nicht erwartet, dass es funktioniert. Aber es tat es. Und ich würde gerne wissen warum. Ich dachte, SFTP läuft über SSH.
Aus Gründen der Klarheit werde ich beim SSH-Zugriff auf den Server wie erwartet rausgeschmissen.
Antworten:
Auf Bash im Allgemeinen
Das Design von Bash in Bezug auf Startdateien ist ziemlich eigenartig. Bash-Ladungen
.bashrc
unter zwei unabhängigen Umständen:sh
). Aus diesem Grund wird.bash_profile
normalerweise geladen.bashrc
.Wenn bash weder interaktiv noch eine Login-Shell ist oder als
sh
Befehl aufgerufen wird , mit dem ausgeführt werden soll,-c
undSHLVL
nicht gesetzt oder kleiner oder gleich 1 ist und eine der folgenden Bedingungen erfüllt ist:rshd
, dh wenn ausgeführt wirdrsh remotehost.example.com somecommand
.Wenn zur Kompilierungszeit aktiviert (was bei einigen Distributionen wie Debian und Derivaten der Fall ist), wenn eine der Umgebungsvariablen
SSH_CLIENT
oderSSH2_CLIENT
definiert ist. In der Praxis bedeutet dies, dass bash von aufgerufen wirdsshd
, dhssh remotehost.example.com somecommand
.Wenn Sie nicht wissen, wie bash kompiliert wurde, können Sie herausfinden, ob diese Option festgelegt wurde, indem Sie überprüfen, ob die Binärdatei die Zeichenfolge enthält
SSH_CLIENT
:Auf SSH im Allgemeinen
Wenn Sie einen Befehl über das SSH-Protokoll ausführen, wird der Befehl als Zeichenfolge über die Leitung übertragen. Die Zeichenfolge wird von der Remote-Shell ausgeführt. Wenn Sie
ssh example.com somecommand
die Anmeldeshell des Remotebenutzers ausführen , wird/bin/bash
der SSH-Server ausgeführt/bin/bash -c somecommand
. Es gibt keine Möglichkeit, die Anmeldeshell zu umgehen. Dies ermöglicht eingeschränkte Anmeldeshells, um beispielsweise nur das Kopieren von Dateien und nicht die allgemeine Befehlsausführung zuzulassen .Es gibt eine Ausnahme: Das SSH-Protokoll ermöglicht es dem Client, ein bestimmtes Subsystem anzufordern. Wenn der Client das
sftp
Subsystem anfordert , ruft der OpenSSH-Server das Programm standardmäßig/usr/lib/openssh/sftp-server
über die Anmeldeshell des Benutzers auf (der Speicherort kann variieren). Es kann jedoch auch so konfiguriert werden, dass ein interner SFTP-Server über die Leitung ausgeführt wirdin der
sshd_config
Datei. Im Fall des internen SFTP-Servers und nur in diesem Fall wird die Anmeldeshell des Benutzers umgangen.Für diese Herausforderung
Im Fall von OverTheWire Bandit 18
.bashrc
enthältSie können dieses Level also lösen, indem Sie alles tun, was dazu führt, dass Bash nicht interaktiv ist.
quelle
sshd
die Anmeldeshell des Benutzers ausgeführt, die ausgeführt wirdsftp-server
. Wenn die Anmeldeshell die Zeichenfolge nicht/usr/lib/openssh/sftp-server
als "Befehl ausführen/usr/lib/openssh/sftp-server
" interpretiert , können Sie SFTP nicht verwenden.Das
.bashrc
wird nur ausgeführt, wenn Sie eine Shell starten.Der SSH-Server kann so konfiguriert werden, dass keine Shell für das SFTP-Protokoll gestartet wird, indem der Befehl
Subsystem internal-sftp
in der Serverdatei angegebensshd_config
wird.Vermutung: Es ist wahrscheinlich, dass das OverTheWire Bandit-Wargame auf diese Weise tatsächlich konfiguriert wird und nicht angepasst wird,
.bashrc
da ansonsten dieselbe Einschränkung fürssh
auch densftp
Serverbefehl blockieren würde .quelle
/path/to/shell -c /path/to/sftp-server
wo/path/to/shell
sich die Anmeldeshell des Benutzers befindet. Wenn die Anmeldeshell des Benutzers bash ist,.bashrc
kann sie ausgeführt werden, je nachdem, wie bash kompiliert wurde. Es wird immer ausgeführt, wenn bash von ausgeführt wirdrshd
(ja, selbst für eine nicht interaktive Shell ist der Start von bash seltsam), und eine Option zur Kompilierungszeit erweitert dies aufsshd
.exit
In.bashrc
wird nur ausgeführt, wenn bash interaktiv ist.Subsystem sftp internal-sftp
undecho No.; exit 1
in meinem.bashrc
bekomme ich keinenssh
Zugriff auf den Server abersftp
funktioniert trotzdem. (Und dann ist es natürlich möglicherweise möglich, die.bashrc
Berechtigungen zu überschreiben oder zu entfernen .) Derssh
Verbindungsversuch schlägt fehl, ob interaktiv oder nicht. Auf der anderen Seite, wenn ichSubsystem sftp /usr/lib/openssh/sftp-server
dann habe, schlägt der SFTP-Dienst auch fehl, wenn er.bashrc
verstümmelt ist.sftp verwendet dieselben Anmeldeinformationen, führt jedoch keine interaktive Shell auf dem Remotecomputer aus.
Ein Administrator kann verhindern, dass ein SFTP-Benutzer ssh ausführt, z. B. wie unter Beschränken von Benutzern auf SFTP anstelle von SSH beschrieben
quelle