На баш взагалі
Дизайн Баша щодо файлів запуску досить своєрідний. Навантаження 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 потребує макроскопічного часу для запуску, тому, хоча це не працює надійно, це можна зробити на практиці.