WSL2 Kali で作る TryHackMe のための軽量な作業環境
きっかけ
時々、TryHackMeで遊んでいます。サイバーセキュリティの学習プラットフォームです。
『7日間でハッキングをはじめる本 TryHackMeを使って身体で覚える攻撃手法と脆弱性』という書籍が出版され、ITエンジニア本大賞の技術書部門大賞・特別賞を受賞して話題になりました。
外出先で使用する低スペックなノートPCでも、それなりに快適に作業できるようにしたい、という思いから調べてみたところ、意外と知らなかった以下の点に気が付き、検証してみました。
- WSL2 で Kali を利用できること
- WSL2 で Linux にインストールしたデスクトップ版のアプリケーションを起動できること(WSLgという技術のおかげらしい)
書籍でも紹介されているセオリー通り、Oracle VM VirtualBox を使用してもいいのですが、ほとんどの作業は CUI で完結するので、ちょっと大げさだなと感じていました。
また、TryHackMeのルームで攻撃対象マシンを起動した後、ブラウザで攻撃用マシンを起動することも可能ですが、これも起動までに時間がかかります。なにより、TryHackMeのブラウザベースの攻撃用マシンは、Freeプランでは1日1時間の利用制限があります。
WSL2 なら起動が早く、比較的動作も軽量です。VPN接続をした攻撃用マシンを自分で用意するため、Freeプランでも利用時間の上限がありません。ホストマシンのWindowsとのファイル共有もシームレスにできそうです。
結論、WSLのKaliで十分だと感じています。ただし、いくつか躓く可能性のあるポイントがあるので、備忘録として残しておきます。
検証に使用したPCのスペックを記載しておきます。
- Microsoft Surface Pro X
- CPU 64bit ARM (Microsoft SQ1 @ 3.0 GHz (3.00 GHz))
- RAM 8GB
- Windows 11 Home
やったこと・やらなかったこと
前提:
TryHackMeのルームの表示やブラウジングを含め多くの作業は、Windows側で行います。
VPN接続が必要な操作(攻撃先のマシンへのアクセス、ブラウザで攻撃対象のサイトを開く)などは、Kali側で行います。
- やったこと
- WSL2 で Kali をインストールする
- WSL2 で Linux のデスクトップアプリケーションを起動する
- WSL2 Kali で TryHackMe のルーム攻略に要なツールをインストールする
- WSL2 Kali から TryHackMe のネットワークにVPN接続する
- やらなかったこと
- Kali を日本語環境に対応させる
- CLIを中心に使うため、デスクトップなどのディレクトリ名が日本語化されるとCLIでの操作が面倒になる...
- TryHackMeも英語のサイトなので、文字化けで困ることもない
- JISキーボードの日本語入力に対応させる
- USキーボードを使用するので、ここは省略
- Kali を日本語環境に対応させる
環境構築
ここから実際に環境を構築する手順を書きます。
WSL2 で Kali をインストールする
powershell を開き、まずは WSL を最新化します。
wsl.exe --update
インストール可能なディストリビューションの一覧を確認します。
wsl.exe --list --online
NAME FRIENDLY NAME
(...略)
kali-linux Kali Linux Rolling
(...略)
kali-linux と表示されています。これをインストールします。
wsl.exe --install kali-linux
ユーザーネームとパスワードを設定するように求められるので、入力します。その後、WSL2 で Kali が起動します。
手動で起動するときは、コマンドプロンプトでwslと入力します。
TryHackMe を進めるために必要なツールをインストールする
上述の手順で Kali をインストールしたとき、起動時にターミナルに以下のようなメッセージが表示されます。
┏━(Message from Kali developers)
┃
┃ This is a minimal installation of Kali Linux, you likely
┃ want to install supplementary tools. Learn how:
┃ ⇒ https://www.kali.org/docs/troubleshooting/common-minimum-setup/
┃
┗━(Run: “touch ~/.hushlogin” to hide this message)
さっそく TryHackMe のネットワークに VPN接続をしようとしましたが、必要なツールがインストールされていないことに気がつきました。
sudo: openvpn: command not found
VPN接続で使用するopenvpnのツールと、その他、これから必要になりそうなインストールします。
他にもkali-linux-large, kali-linux-everythingなどのメタパッケージがあるみたいですが、標準的なツールのインストールのみに留めておきます。
sudo apt install -y kali-linux-default kali-tools-top10
インストール中にいくつか確認ダイアログが出てきました。参考までに載せておきます。
-
macchanger: No を選択しました。
Configuring macchanger
Please specify whether macchanger should be set up to run automatically every time a network device is brought up or down. This gives a new MAC address whenever you attach an ethernet cable or reenable wifi.
Change MAC automatically?
<Yes> <No>
-
kismet: No を選択しました。
Configuring kismet-capture-common
Kismet needs root privileges for some of its functions. However, running it as root ("sudo kismet") is not recommended, since running all of the code with elevated privileges increases the risk of bugs doing system-wide damage. Instead Kismet can be installed with the "setuid" bit set, which will allow it to grant these privileges automatically to the processes that need them, excluding the user interface and packet decoding parts.
Enabling this feature allows users in the "kismet" group to run Kismet (and capture packets, change wireless card state, etc), so only thoroughly trusted users should be granted membership of the group.
Install Kismet "setuid root"?
<Yes> <No>
-
wireshark: No を選択しました。
Configuring wireshark-common
Dumpcap can be installed in a way that allows members of the "wireshark" system group to capture packets. This is recommended over the alternative of running Wireshark/Tshark directly as root, because less of the code will run with elevated privileges.
For more detailed information please see /usr/share/doc/wireshark-common/README.Debian.gz once the package is installed.
Enabling this feature may be a security risk, so it is disabled by default. If in doubt, it is suggested to leave it disabled.
Should non-superusers be able to capture packets?
<Yes> <No>
-
sslh: standalone を選択しました。
sslh configuration
sslh can be run either as a service from inetd, or as a standalone server. Each choice has its own benefits. With only a few connection per day, it is probably better to run sslh from inetd in order to save resources.
On the other hand, with many connections, sslh should run as a standalone server to avoid spawning a new process for each incoming connection.
Run sslh:
from inetd
standalone
<Ok>
WSL2 で Linux デスクトップアプリケーション (Firefox) を起動する
TryHackMe では、ルーム攻略のために攻撃対象のWebサーバーにブラウザでアクセスして、開発者ツールを開いて内容を確認するなどの操作を行うことがあります。
次のステップでVPN接続を行いますが、接続できているか確認するために、WSL2側で攻撃対象のサイトをブラウザで開くために必要なので先に準備しておきます。
Firefox をインストールします。
sudo apt update
sudo apt install firefox-esr -y
インストールされていることを確認します。
apt list --installed | grep -i firefox
Firefox を起動します。
firefox &
# & をつけるとバックグランドで処理されてすぐにコマンド入力待機状態に戻る
WSL2で起動したアプリケーションには、タスクバーに表示されるアイコンにタックスくんが付くのでわかります。

TryHackMeのネットワークにVPN接続する
VPN接続の準備をする
VPNの設定ファイルをダウンロードします。
Windows側でブラウザを起動し、TryHackMeのサイトにログインして、以下のページにアクセスします。
好きな VPN Server を選択して、Download configration fileを実行します。
AU-Regular-1を選択しました。
ターミナルで Kali を起動します。
VPNの設定ファイルを格納するために任意のディレクトリを作成します。
mkdir ~/vpn
Windows側でダウンロードした設定ファイルを Kali で作成したディレクトリに移動します。
mv /mnt/c/Users/{windowsユーザー名}/Downloads/{TryHackMeユーザー名}.ovpn ~/vpn
TryHackMeのネットワークにVPN接続する
ターミナルで Kali を起動したら、以下のコマンドを実行します。
sudo openvpn ~/vpn/{TryHackMeユーザー名}.ovpn
VPNの設定ファイルをダウンロードしたページで、接続状態を確認できるようです。OpenVPN Access Details を確認してみてください。
curl 10.10.10.10/whoami
# 自分のIPアドレスが出力されたら接続OK
接続確認に使えるチュートリアルルームもあります。
ターゲットマシンを起動します。
Kali でインストールしておいた Firefox を起動し、ターゲットマシンのIPをアドレスバーに入力します。
サイトが表示されることを確認します。
VPN接続時にWSL2でssh接続ができないとき
VPN と Ethernet で MTU が異なる場合、接続がハングアウトすることがあるようです。
以下のパターンを経験しました。
- sshコマンドを実行時に Connection closed by ... と表示されて接続できない
- Metasploit で exploit を実行したときに Sending all but last fragment of exploit packet が表示された後、進まなくなる
ネットワークにおいて一度に送信可能な最大データ容量の単位とのことです。
ネットワークインターフェースを確認します。
ip a
# eth0 と tun0 (VPN) の MTU の値を確認する
書籍『7日間でハッキングをはじめる本 TryHackMeを使って身体で覚える攻撃手法と脆弱性』でもcolumnで取り上げられていました。
私の環境では、そこで書いてあるように「MTUが1500だと大きすぎる」というわけではなく、おそらくイーサネットアダプタとVPNのネットワークアダプタのMTUに違いがあることが原因のようです。
MTU 1500 に揃えることで解決しました。以降、安定して接続できています。
# tun0 の MTU が 1500 だったので eth0 も同じ値に変更する
sudo ip link set dev eth0 mtu 1500
再起動すると設定が元に戻ります。永続化したい場合は、~/.bashrcに上記のコマンドを追記しておきます。
所感
ここまでの設定が完了して、 TryHackMe のルームを進めていくにあたり、困ることはなくなりました。
気になった点もあるので、書いておきます。
WSL2 で起動した Firefox の GUI がカーソルが巨大で使いづらさを感じました。あまりこのブラウザで操作する頻度が高くないので、今のところ見ないふりをしています。
xfreerdp3を使って攻撃対象のリモートデスクトップ接続をしてみました。こちらも GUI で起動できています。描画は結構重たいです。ただ、これはお試しで接続してみただけであり、ほとんどの操作はターミナルで完結するので致命的とは言えませんでした。

このあたりは、ホストマシン側でもVPN接続をすれば制限は減るかもしれませんが、今回は検証していません。
今度、WSL2 ではなく docker を使用する場合の利便性についても比べてみたいと思います。
追記
Burp Suite Community Editionをインストール後に、「Open browser」ボタンを押下すると、以下のダイアログが表示されてしまいました。
Burp browser is not available.
こちらは、以下の記事に答えがありました。ARMアーキテクチャのCPUを使用している環境で起こるようです。(Embedded browserの項目を参照)
ネイティブのプラットフォームインストーラーを使用するように案内されています。
# apt install では、上記のエラーが発生しました。
# sudo apt install burpsuite -y
# この方法でインストールしてしまった場合、一度アンインストールします。
# sudo apt purge -y burpsuite
# sudo apt autoremove --purge -y
記事に書いてあった通り、公式サイトから、最新版を確認して環境に合うものをインストールします。
Burp Suite Community Edition, Linux (ARM) を選択しました。
インストール後は、シンボリックリンクが張られているので、ターミナルで以下のように入力してアプリケーションを起動します。
BurpSuiteCommunity &
再度「Open browser」を試してみたところ、問題が解決し、PortSwigger-Chromiumが無事に起動しました!
こちらの内容は別環境でも検証したのち、別の記事に移動しようと思いますが、まずはこちらに追記しておきます。
Discussion