
私はちょうど完了しましたOverTheWire Bandit ウォーゲーム、レベル 18。
それは驚きでした。これがこのレベルの説明です。
次のレベルのパスワードはファイルに保存されますリードミーホームディレクトリにあります。残念ながら、誰かが変更しました.bashrcSSH でログインするときにログアウトします。
シェルがソースをスキップする方法を考えていました.bashrc
。しかし、解決策を見つける前に、サーバーとの SFTP 接続を開始するだけの誘惑に駆られました。うまくいくとは思っていませんでした。しかし、うまくいきました。その理由を知りたいです。SFTP は SSH 経由で実行されるものだと思っていました。
明確に言うと、サーバーに SSH で接続すると、予想どおりに追い出されます。
答え1
bash全般について
起動ファイルに関する Bash の設計はかなり特殊です。Bash は.bashrc
2 つの無関係な状況でロードされます。
- 対話型シェルの場合、ログインシェル(ただし、 として呼び出された場合は除く
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
- 標準入力がソケットの場合。実際には、これは主にbashが次のように呼び出されたときに発生します。
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 サーバーの場合のみ、ユーザーのログイン シェルはバイパスされます。
この挑戦のために
.bashrc
OverTheWire Bandit 18の場合、
…
# 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
シェルを起動したときにのみ実行されます。
Subsystem internal-sftp
SSH サーバーは、サーバーのファイルにコマンドを指定することにより、SFTP プロトコルのシェルを起動しないように設定できます sshd_config
。
推測: への調整ではなく、OverTheWire Bandit ウォーゲームが実際に構成されている方法はこれである可能性が高いです。.bashrc
そうでないと、 への同じ制限により、サーバー コマンドssh
もブロックされてしまうためですsftp
。
答え3
sftp は同じ資格情報を使用しますが、リモート マシン上で対話型シェルを実行しません。
管理者は、例えば次のようにして、sftpユーザーがsshを実行できないようにすることができます。SSHではなくSFTPのみにユーザーを制限する方法