На баш взагалі
Дизайн Баша щодо файлів запуску досить своєрідний. Навантаження Bash .bashrc
за двох неспоріднених обставин:
- Коли це інтерактивна оболонка, за винятком випадків, коли це оболонка для входу (і за винятком випадків, коли її викликають як
sh
). Ось чому .bash_profile
зазвичай завантажують.bashrc
.
Коли bash не є інтерактивним, ні оболонкою входу, ні викликається як, sh
але дається команда виконати з -c
і SHLVL
не встановлено, або менше або дорівнює 1, і одна з наведених нижче дійсних:
- Якщо стандартним входом є розетка. На практиці це в основному трапляється, коли баш викликається
rshd
, тобто під час бігу rsh remotehost.example.com somecommand
.
Якщо активовано під час компіляції (що стосується деяких дистрибутивів, таких як Debian і похідні), якщо одна із змінних оточення SSH_CLIENT
або SSH2_CLIENT
визначена. На практиці це означає, що баш викликається 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
Таким чином, ви можете вирішити цей рівень, зробивши все, що призводить до того, що удар не буде інтерактивним.
Як ви виявили, SFTP працює.
Але ssh bandit18@bandit.labs.overthewire.org cat readme
також працювало б.
Як би echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
.
І натискання Ctrl + C в потрібний час під час інтерактивного входу також спрацювало: воно перерве bash, тому воно .bashrc
не буде повністю виконане. Bash потребує макроскопічного часу для запуску, тому, хоча це не працює надійно, це можна зробити на практиці.