ngrokを使って、VirtualBox内の環境へインターネット経由でアクセスできるようにする
はじめに
自PC内のVirtualBoxに作った検証環境へ、ngrokを使ってインターネット越しにアクセスできるようにする手順を紹介します。
注意
記事中の説明はタイトルに記載している到達性の確保に重きを置いており、セキュリティ面の厳密な説明を省いています。以下のような工夫は各自でお願いします。
モチベーション
メンバーのトレーニングがてら、Kali LinuxとMetasploitable2で学習環境を構築しようと思い立ちました。
当初は受講者からのアクセスしやすさを優先してAWSで構築しようとしましたが、Metasploitable2はvmdkしか手に入らず、AWSのVM Importがちょっとめんどくさそうだったので、自分のPCのVirtualBoxを使って環境を構築することにしました。
受講者にどうやってVirtualBox内のVMにアクセスしてもらうかですが、リモートワーク全盛の昨今、受講者PCから自PCへの到達性を搦め手なしで確保するのは難しく、今回はngrokを使いました。
ngrok
インターネットにエンドポイントを生成して、そこに対する通信を事前に指定したローカルなエンドポイントへ転送してくれるサービスです。localhost:8080で実行しているWebアプリをインターネット経由で(一時的に)公開する、といったようなことができます。
構成
こんな感じです。今回は受講者が2人だったので、Attacker(Kali Linux)とTarget(Metasploitable2)のVMを2セット作りました。
受講者PC(Trainee PC)がEC2インスタンスを中継しているのは、以下の理由からです。
- ngrok(ドメイン?)へのアクセスを、アンチウイルスソフトやファイアウォールなどがフィッシングサイトへのアクセスとして検知・遮断することがあるから
- ターミナルソフトがないなどの理由でSSHできなくても、Session Managerで操作できるから
- Session Managerの説明(概要および構築手順)は省きます
VMの準備
トレーナーのPC(Trainer PC)内のVirtualBoxにAttackerとTargetのVMを立てます。全VMは同じホストオンリーアダプターを持っており、Attackerにはそれに加えてインターネットアクセスのためのNATアダプターを持たせます。
ngrok有料プラン契約(必要に応じて)
ngrokにはFreeプランがあります。ngrokの同時実行数が1つならFreeプランでいいのですが、今回は2つのサーバーで同時にngrokでトンネリングしたかったので、Proプランを契約しました。
とここで、VirtualBox内に踏み台サーバーを立てればFreeプランで済んだことに今更気がつきました。急いでいたもので……。
Attackerにngrokのバイナリを配置
ngrok公式の手順に従って、Attackerにngrokのバイナリを配置します。
ngrok認証トークンの取得と登録
有料プランの機能を使うには、ngrokアカウントの認証トークン(Authtoken)を取得し、各実行環境に登録する必要があります。取得はダッシュボード左ペインの「Getting Started」→「Your Authtoken」から取得できます。登録は各実行環境(今回はAttacker)で以下のコマンドを実行します。
$ ngrok authtoken <authtoken>
トンネリング開始
Attackerで以下のコマンドを実行し、トンネリングを開始します。これで、ngrokのエンドポイントにSSHすれば、各Attackerへ転送されるようになります。
$ ngrok tcp 22
Trainee PCからAttackerへの接続
踏み台EC2インスタンスを経由(SSHでもSession Managerでも、何でもいいです)して、ngrokのエンドポイントへSSHします。
$ ssh kali@xxx.tcp.ngrok.io -p <ポート番号>
おわりに
各PCの回線状況に依存しますが、コネクション遅延や切断もあまり起きず、比較的快適に実施できました。MetasploitableのAMIがあったらいいのに。