SFTP 在哪方面不是基於 SSH 的?

SFTP 在哪方面不是基於 SSH 的?

我剛剛完成OverTheWire Bandit 戰爭遊戲,第 18 級

這是一個驚喜。以下是該等級的說明。

下一層的密碼儲存在檔案中自述文件在主目錄中。可惜有人修改了.bashrc當您使用 SSH 登入時登出您。

我正在考慮一種讓 shell 跳過採購的方法.bashrc。但在找到解決方案之前,我很想先啟動與伺服器的 SFTP 連線。我沒想到它會起作用。但它確實做到了。我想知道為什麼。我以為 SFTP 是透過 SSH 運作的。

為了清楚起見,當我透過 SSH 連接到伺服器時,正如預期的那樣,我被踢出了伺服器。

答案1

關於 bash 的一般情況

Bash 關於啟動文件的設計相當奇特。 Bash.bashrc在兩種不相關的情況下載入:

  • 當它是互動式 shell 時,除非它是登入外殼(除非它被調用為sh)。這就是為什麼.bash_profile通常負載.bashrc
  • 當 bash 是不是Interactive 也不是登入 shell 也不是呼叫 assh但給定了要執行的命令-c且未SHLVL設定或小於或等於 1,且下列情況之一為 true:

    • 如果標準輸入是套接字。實際上,這主要發生在 bash 被調用時rshd,即跑步時rsh remotehost.example.com somecommand
    • 如果在編譯時啟動(某些發行版就是這種情況,例如 Debian 及其衍生版本),並且定義了環境變數SSH_CLIENT或之一。SSH2_CLIENT實際上,這意味著 bash 是由sshdie調用的ssh remotehost.example.com somecommand
      如果您不知道 bash 是如何編譯的,可以透過檢查二進位檔案是否包含以下字串來確定是否設定了此選項SSH_CLIENT

      strings /bin/bash | grep SSH_CLIENT
      

關於 SSH 的一般情況

當您透過 SSH 協定執行命令時,該命令將作為字串透過線路傳遞。該字串由遠端 shell 執行。當您執行時ssh example.com somecommand,如果遠端使用者的登入 shell 是/bin/bash,則 SSH 伺服器將會執行/bin/bash -c somecommand。沒有辦法繞過登入 shell。這允許受限的登入 shell,例如僅允許檔案複製而不是一般的命令執行。

有一個例外:SSH 協定允許客戶端請求特定的子系統。如果用戶端請求該sftp子系統,則預設情況下 OpenSSH 伺服器會/usr/lib/openssh/sftp-server透過使用者的登入 shell 呼叫該程式(位置可能有所不同)。但也可以設定為透過線路運行內部 SFTP 伺服器

Subsystem sftp internal-sftp

sshd_config文件中。對於內部 SFTP 伺服器,並且只有在這種情況下,使用者的登入 shell 才會被繞過。

為了這個挑戰

對於 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只有當您啟動 shell 時才會執行。

Subsystem internal-sftp透過在伺服器檔案中提供命令,可以將 SSH 伺服器設定為不啟動 SFTP 協定的 shell sshd_config

推測:很可能這就是 OverTheWire Bandit 戰爭遊戲的實際配置方式,而不是調整,.bashrc因為否則相同的限制ssh也會阻止sftp伺服器命令。

答案3

sftp 使用相同的憑證,但不在遠端電腦上執行互動式 shell。

管理員可以阻止 sftp 使用者執行 ssh,例如,如中所述如何限制使用者只能使用 SFTP 而不是 SSH

相關內容