Почему SFTP не основан на SSH?

Почему SFTP не основан на SSH?

Я только что закончилOverTheWire Bandit военная игра, уровень 18.

Это был сюрприз. Вот инструкции для этого уровня.

Пароль для следующего уровня хранится в файлеПрочти меняв домашнем каталоге. К сожалению, кто-то изменил.bashrcдля выхода из системы при входе через SSH.

Я думал о том, как заставить оболочку пропустить источник .bashrc. Но прежде чем я нашел решение, я поддался соблазну просто запустить SFTP-соединение с сервером. Я не ожидал, что это сработает. Но это сработало. И я хотел бы знать, почему. Я думал, что SFTP работает через SSH.

Для ясности: когда я подключаюсь к серверу по SSH, меня, как и ожидалось, выкидывает.

решение1

О bash в целом

Дизайн Bash в отношении файлов запуска довольно своеобразен. Bash загружается .bashrcв двух не связанных между собой обстоятельствах:

  • Когда это интерактивная оболочка, за исключением случаев, когда этооболочка входа(и за исключением случаев, когда он вызывается как sh). Вот почему.bash_profileобычно загружает.bashrc.
  • Когда Башнетинтерактивный, не является оболочкой входа в систему и не вызывается как sh, но ему дана команда для выполнения с -cи SHLVLне установлен или меньше или равен 1, и верно одно из следующих:

    • Если стандартный ввод — это сокет. На практике это чаще всего происходит, когда bash вызываетсяrshd, т.е. при запуске rsh remotehost.example.com somecommand.
    • Если активировано во время компиляции (что имеет место в некоторых дистрибутивах, таких как Debian и производных), если определена одна из переменных окружения SSH_CLIENTили SSH2_CLIENT. На практике это означает, что bash вызывается sshd, т. е ssh remotehost.example.com somecommand. .
      Если вы не знаете, как был скомпилирован bash, вы можете узнать, была ли установлена ​​эта опция, проверив, содержит ли двоичный файл строку SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

О SSH в целом

Когда вы выполняете команду через протокол SSH, команда передается по сети в виде строки. Строка выполняется удаленной оболочкой. Когда вы запускаете ssh example.com somecommand, если оболочка входа удаленного пользователя — /bin/bash, сервер SSH запускает /bin/bash -c somecommand. Обойти оболочку входа невозможно. Это позволяет использовать ограниченные оболочки входа, например,разрешить только копирование файлова не общее выполнение команды.

Есть одно исключение: протокол SSH позволяет клиенту запрашивать определенную подсистему. Если клиент запрашивает подсистему sftp, то по умолчанию сервер OpenSSH вызывает программу /usr/lib/openssh/sftp-server(местоположение может отличаться) через оболочку входа пользователя. Но его также можно настроить для запуска внутреннего сервера SFTP через линию

Subsystem sftp internal-sftp

в sshd_configфайле. В случае внутреннего SFTP-сервера, и только в этом случае, оболочка входа пользователя обходит.

Для этого вызова

В случае OverTheWire Bandit 18 .bashrcсодержит


# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
echo 'Byebye !'
exit 0

Таким образом, вы можете решить эту проблему, сделав что-нибудь, что заставит bash не быть интерактивным.

Как вы обнаружили, SFTP работает.
Но также будет работать. Как и . И нажатие Ctrl+C в нужное время во время интерактивного входа также сработает: это прервет bash, поэтому не будет полностью выполнено. Bash требуется макроскопическое время для запуска, поэтому, хотя это не работает надежно, это можно сделать на практике. ssh [email protected] cat readme
echo 'cat readme' | ssh [email protected]
.bashrc

решение2

Выполняется .bashrcтолько при запуске оболочки.

Сервер SSH можно настроить так, чтобы он не запускал оболочку для протокола SFTP, указав команду Subsystem internal-sftpв файле сервера sshd_config.

Предположение: скорее всего, именно так на самом деле настроена военная игра OverTheWire Bandit, а не как-то ее корректируется, .bashrcпоскольку в противном случае то же ограничение sshтакже блокировало бы sftpкоманду сервера.

решение3

sftp использует те же учетные данные, но не запускает интерактивную оболочку на удаленной машине.

Администратор может запретить пользователю sftp запускать ssh, например, как описано вКак ограничить пользователей только SFTP вместо SSH

Связанный контент