SFTPはSSHに基づいていないのですか?


9

OverTheWire Banditウォーゲーム、レベル18をクリアしました。

それは驚きでした。このレベルの手順は次のとおりです。

次のレベルのパスワードは、ホームディレクトリのreadmeファイルに保存されています。残念ながら、SSHでログインするとログアウトするように.bashrcが変更されています。

シェルがソーシングをスキップする方法を考えていました.bashrc。しかし、解決策を見つける前に、サーバーとのSFTP接続を単純に開始したくなりました。うまくいくとは思っていませんでした。しかし、そうでした。そしてその理由を知りたいのですが。SFTPはSSHで実行すると思いました。

わかりやすくするために、サーバーにSSH接続すると、期待どおりに追い出されます。

ssh  sftp 

1
SFTPはSSHで実行されます。bashはSSHでも実行できます。ただし、SFTPはbashで実行されません。(ここでは大まかに「オーバーラン」を使用していることに注意してください)
user253751

回答:


13

一般的にbashについて

スタートアップファイルに関するBashの設計はかなり独特です。.bashrc2つの無関係な状況でのBashロード:

  • ログインシェルの場合(およびとして呼び出される場合を除く)を除いて、インタラクティブシェルの場合sh。これが.bash_profile通常読み込ま.bashrcれる理由です。
  • bashはある場合ではないインタラクティブもログインシェルやとして起動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
      

SSH全般

SSHプロトコルを介してコマンドを実行すると、コマンドは文字列としてネットワーク経由で渡されます。文字列はリモートシェルによって実行されます。を実行するssh example.com somecommandと、リモートユーザーのログインシェルがの/bin/bash場合、SSHサーバーが実行され/bin/bash -c somecommandます。ログインシェルをバイパスする方法はありません。これにより、たとえば、ファイルのコピーのみ許可し、一般的なコマンドの実行を許可しないなど、ログインシェルを制限できます。

1つの例外があります。SSHプロトコルでは、クライアントが特定のサブシステムを要求できます。クライアントがsftpサブシステムを要求した場合、デフォルトでは、OpenSSHサーバーは/usr/lib/openssh/sftp-serverユーザーのログインシェルを介してプログラム(場所は異なる場合があります)を呼び出します。ただし、次の行を通じて内部SFTPサーバーを実行するように構成することもできます。

Subsystem sftp internal-sftp

sshd_configファイル。内部SFTPサーバーの場合、この場合のみ、ユーザーのログインシェルはバイパスされます。

この挑戦のために

OverTheWire強盗18の場合には、.bashrc含まれてい

…
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
…
echo 'Byebye !'
exit 0

したがって、bashがインタラクティブでなくなる原因となるものを実行することで、このレベルを解決できます。

あなたが発見したように、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が非対話的にだけでなく、bash 実行することはないと思います。
user253751

@immibis私はあなたがそれについて正しいと信じています。SFTPを使用して、「実際の」シェルではなく、ログインシェルとしていくつかのアプリケーションで構成されたユーザーアカウントのファイルを交換しました。
kasperd

@immibis SFTPはbashを実行しません。ただし、SFTPサーバーが内部にない限り、をsshd実行するユーザーのログインシェルを実行しsftp-serverます。したがって、ログインシェルが文字列/usr/lib/openssh/sftp-serverを「コマンドを実行する」と 解釈しない場合、/usr/lib/openssh/sftp-serverSFTPを使用できません。
Gilles「SO-邪悪なことをやめ

5

.bashrcあなたがシェルを起動したときにのみ実行されます。

SSHサーバーはSubsystem internal-sftp、サーバーのsshd_configファイルにコマンドを指定することにより、SFTPプロトコルのシェルを開始しないように構成でき ます。

推測:これは、調整ではなく、OverTheWire Banditウォーゲームが実際に構成されている方法である可能性があります。.bashrcそれ以外の場合、同じ制限sshによりsftpサーバーコマンドもブロックされるためです。


2
SFTPを実行すると、シェル起動します。SSHデーモンは次の/path/to/shell -c /path/to/sftp-server場所で実行されます/path/to/shell、ユーザのログインシェルです。ユーザーのログインシェルがbashの場合、.bashrcbashのコンパイル方法によっては実行される場合があります。これは、bashが実行されたときに常に実行されrshd(そうです、非対話型シェルの場合でも、bashの起動は奇妙です)、コンパイル時のオプションによってこれがに拡張されsshdます。
Gilles「SO-邪悪なことをやめなさい」2016

私は行って確認しました。良い推測ですが、実際にはそれほど微妙ではありません。exit中には、.bashrcbashが対話的な場合にのみ実行されます。
Gilles「SO-邪悪なことをやめなさい」

@Gilles、Subsystem sftp internal-sftpそしてecho No.; exit 1私の中に.bashrc私はいない取得sshサーバーへのアクセスをが、sftpまだ動作します。(そしてもちろん、潜在的に.bashrc。を上書きしたり削除したりすることが可能です。それにもかかわらず、アクセス許可。)ssh接続の試みは、インタラクティブかどうかにかかわらず失敗します。一方、私が持っているSubsystem sftp /usr/lib/openssh/sftp-server場合、SFTPサービス.bashrcが破損した場合も失敗します。
roaima 2016年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.