
Я только что закончил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
- Если стандартный ввод — это сокет. На практике это чаще всего происходит, когда bash вызывается
О 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