
Ich habe gerade abgeschlossenOverTheWire Bandit-Kriegsspiel, Level 18.
Das war eine Überraschung. Hier sind die Anweisungen für dieses Level.
Das Passwort für die nächste Ebene wird in einer Datei gespeichertLiesmichim Homeverzeichnis. Leider hat jemand geändert.bashrcum Sie abzumelden, wenn Sie sich mit SSH anmelden.
Ich habe über eine Möglichkeit nachgedacht, wie die Shell das Sourcing überspringen kann .bashrc
. Aber bevor ich eine Lösung gefunden habe, war ich versucht, einfach eine SFTP-Verbindung mit dem Server herzustellen. Ich habe nicht erwartet, dass es funktioniert. Aber es hat funktioniert. Und ich würde gerne wissen, warum. Ich dachte, SFTP läuft über SSH.
Zur Klarstellung: Wenn ich mich per SSH mit dem Server befasse, werde ich wie erwartet rausgeworfen.
Antwort1
Zu Bash im Allgemeinen
Das Design von Bash in Bezug auf Startdateien ist ziemlich eigenartig. Bash wird .bashrc
in zwei voneinander unabhängigen Situationen geladen:
- Wenn es sich um eine interaktive Shell handelt, außer wenn es sich um eineAnmeldeshell(außer wenn es als aufgerufen wird
sh
). Aus diesem Grund.bash_profile
lädt typischerweise.bashrc
. Wenn Bashnichtweder interaktiv noch eine Login-Shell, noch aufgerufen als,
sh
sondern mit einem Befehl zur Ausführung versehen-c
undSHLVL
ist nicht gesetzt oder kleiner oder gleich 1, und eine der folgenden Bedingungen ist wahr:- Wenn die Standardeingabe ein Socket ist. In der Praxis geschieht dies meistens, wenn Bash aufgerufen wird durch
rshd
, also beim Laufenrsh remotehost.example.com somecommand
. Wenn diese Option zur Kompilierungszeit aktiviert wird (was bei einigen Distributionen, wie Debian und Derivaten, der Fall ist), wird eine der Umgebungsvariablen
SSH_CLIENT
oderSSH2_CLIENT
definiert. In der Praxis bedeutet dies, dass bash von aufgerufen wirdsshd
, alsossh remotehost.example.com somecommand
.
Wenn Sie nicht wissen, wie bash kompiliert wurde, können Sie herausfinden, ob diese Option gesetzt wurde, indem Sie prüfen, ob die Binärdatei die Zeichenfolge enthältSSH_CLIENT
:strings /bin/bash | grep SSH_CLIENT
- Wenn die Standardeingabe ein Socket ist. In der Praxis geschieht dies meistens, wenn Bash aufgerufen wird durch
Zu 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 ausführen und ssh example.com somecommand
die Anmelde-Shell des Remote-Benutzers lautet /bin/bash
, führt der SSH-Server aus /bin/bash -c somecommand
. Es gibt keine Möglichkeit, die Anmelde-Shell zu umgehen. Dies ermöglicht eingeschränkte Anmelde-Shells, beispielsweise umErlaube nur das Kopieren von Dateienund nicht die allgemeine Befehlsausführung.
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
(der Ort kann variieren) über die Login-Shell des Benutzers auf. Es kann aber auch so konfiguriert werden, dass ein interner SFTP-Server über die Leitung ausgeführt wird
Subsystem sftp internal-sftp
in der sshd_config
Datei. Beim internen SFTP-Server, und nur bei diesem, wird die Login-Shell des Benutzers umgangen.
Für diese Herausforderung
Im Falle von OverTheWire Bandit 18 .bashrc
enthält
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Sie können dieses Level also lösen, indem Sie alles tun, was dazu führt, dass Bash nicht interaktiv ist.
Wie Sie festgestellt haben, funktioniert SFTP.
Aber würde auch funktionieren. Ebenso wie . Und das Drücken von Strg+C zum richtigen Zeitpunkt während einer interaktiven Anmeldung würde auch funktionieren: Es würde Bash unterbrechen, sodass nicht vollständig ausgeführt würde. Bash benötigt makroskopische Zeit zum Starten, sodass dies zwar nicht zuverlässig funktioniert, in der Praxis jedoch möglich ist.ssh [email protected] cat readme
echo 'cat readme' | ssh [email protected]
.bashrc
Antwort2
Wird .bashrc
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 Datei des Servers angegeben wird sshd_config
.
Vermutung: Es ist wahrscheinlich, dass das OverTheWire Bandit-Kriegsspiel tatsächlich so konfiguriert ist und nicht nur eine Anpassung an ist, .bashrc
da andernfalls dieselbe Einschränkung auch den Serverbefehl ssh
blockieren würde .sftp
Antwort3
sftp verwendet dieselben Anmeldeinformationen, führt aber keine interaktive Shell auf dem Remotecomputer aus.
Ein Administrator kann einen SFTP-Benutzer daran hindern, SSH auszuführen, z. B. wie inSo beschränken Sie Benutzer nur auf SFTP anstelle von SSH