Яким чином SFTP не базується на SSH?


9

Я щойно закінчив бойову гру OverWheWire Bandit, рівень 18 .

Це було несподіванкою. Ось інструкції для цього рівня.

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

Я думав про спосіб, щоб оболонка пропустила пошук .bashrc. Але перш ніж я знайшов рішення, я спокусився просто запустити SFTP-з'єднання з сервером. Я не очікував, що це спрацює. Але це було. І я хотів би знати, чому. Я думав, що SFTP працює над SSH.

Для наочності, коли я SSH на сервер, мене виганяють, як і очікувалося.

ssh  sftp 

1
SFTP працює над SSH. bash також може працювати над SSH. Але SFTP не перебігає баш. (зауважте, що я тут просто "перебігаю"
користувач253751

Відповіді:


13

На баш взагалі

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


2
Я не думаю, що SFTP працює на башті зовсім , не тільки неінтерактивно.
користувач253751

@immibis Я вважаю, що ти прав у цьому. Я використовував SFTP для обміну файлами в обліковому записі користувача, який був налаштований на якусь програму як оболонку входу, а не "реальну" оболонку.
kasperd

@immibis SFTP не працює bash. Але якщо сервер SFTP не є внутрішнім, він sshdзапускає оболонку входу користувача, яка працює sftp-server. Отже, якщо оболонка входу не інтерпретує рядок /usr/lib/openssh/sftp-serverяк "запустити команду /usr/lib/openssh/sftp-server", ви не можете використовувати SFTP.
Жил "ТАК - перестань бути злим"

5

Виконується .bashrcлише тоді, коли ви запускаєте оболонку.

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

Концепція: ймовірно, що саме так налаштована бойова іграшка OverTheWire Bandit, а не коригування, .bashrcоскільки в іншому випадку те саме обмеження sshтакож блокує команду sftpсервера.


2
Запуск SFTP робить запустити оболонку. Демон SSH працює /path/to/shell -c /path/to/sftp-serverтам, де /path/to/shellє оболонка для входу користувача. Якщо оболонка входу користувача є bash, то .bashrcможе виконуватися залежно від способу складання bash. Він завжди виконується, коли bash виконується rshd(так, навіть для неінтерактивної оболонки, запуск bash є дивним), і параметр часу компіляції поширює це на sshd.
Жил "ТАК - перестань бути злим"

Я пішов і перевірив. Хороша здогадка, але насправді це не так тонко. exitВ .bashrcвиконується тільки якщо Баш є інтерактивним.
Жил "ТАК - перестань бути злим"

@Gilles, з Subsystem sftp internal-sftpі echo No.; exit 1в моєму .bashrcя не отримує sshдоступу до сервера , але по- sftpяк і раніше працює. (І тоді, звичайно, можливо, можливо, перезаписати або видалити .bashrc. Дозволи, незважаючи на це.) sshСпроба підключення не працює, незалежно від інтерактивності чи ні. З іншого боку, якщо я маю, Subsystem sftp /usr/lib/openssh/sftp-serverто служба SFTP також виходить з ладу під час .bashrcкерування.
roaima

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.