Inwiefern basiert SFTP nicht auf SSH?

Inwiefern basiert SFTP nicht auf SSH?

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 .bashrcin 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_profilelädt typischerweise.bashrc.
  • Wenn Bashnichtweder interaktiv noch eine Login-Shell, noch aufgerufen als, shsondern mit einem Befehl zur Ausführung versehen -cund SHLVList 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 durchrshd, also beim Laufen rsh 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_CLIENToder SSH2_CLIENTdefiniert. In der Praxis bedeutet dies, dass bash von aufgerufen wird sshd, also ssh 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ält SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

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 somecommanddie 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 sftpSubsystem 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_configDatei. 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 .bashrcenthä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 .bashrcnur 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-sftpin 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, .bashrcda andernfalls dieselbe Einschränkung auch den Serverbefehl sshblockieren 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

verwandte Informationen