WSLでKaliLinuxを構築してみる【2022年度最新版】

## はじめに

こんにちは、[@rs_tukki](https://twitter.com/rs_tukki)です。
これは[ラクス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus)の19日目の記事です。
早いもので気付けば今年のアドカレも最後の一週間です。

今年は何のネタでカレンダーを書くか迷っていたのですが、
勉強の一環でWSL上にKaliLinuxのディストリビューションを構築する機会がつい先日にあったので、今回はその手順について一通りまとめてみることにしました。

## 用語解説

まずは、今回の話の肝となる「WSL」と「KaliLinux」について軽く解説しておきます。

### WSL

WSLとは、`Windows Subsystem for Linux`の略で、有り体に言うとWindows上でLinuxを動かすためのシステムのことです。
現在は2019年6月に発表されたWSL2が主流となっており、仮想マシン上でLinuxカーネルを動かし、インストールしたLinuxのディストリビューションを動かす仕組みになっています。

### KaliLinux

KaliLinuxは、2013年に誕生したLinuxディストリビューションの一種で、ペネトレーションテスト[^1]に必要な600以上のツールがあらかじめインストールされているやや特殊な環境です。
つまりはペネトレーションテストのスターターキットのようなやつです。

[^1]:ツールを使って対象サーバへ侵入を試みることで、実際に攻撃を受ける可能性のある脆弱性を洗い出すテスト手法のこと

## WSLにKaliLinuxをインストールしてみる

今回はWSLを利用してWindows上でデスクトップ環境のKaliLinuxを動かすところをゴールに、環境を構築していこうと思います。

### PowerShellでwslコマンドを実行

今回はWindows11環境で試していますが、
Windows11環境下であれば、`wsl --install`コマンドを実行するだけで

* WSLの有効化
* 仮想マシンプラットフォームの有効化
* WSL用Linuxカーネルのインストール
* WSLのデフォルトバージョンを2に設定
* 指定したディストリビューションのインストール

を一度にやってくれます。すごいやつです。

まず、PowerShellを起動し`wsl`とだけ入力して実行してみます。

```powershell
PS C:\Users\rs_tukki> wsl

Copyright (c) Microsoft Corporation. All rights reserved.

使用方法: wsl.exe [Argument]

引数:
    --install <Options>
        Linux 用 Windows サブシステムの機能をインストールします。オプションが指定されていない場合は、
        既定のディストリビューションと共に、推奨される機能がインストールされます。
        既定のディストリビューションおよびその他の有効なディストリビューションの一覧を表示するには、
        'wsl --list --online' を使用してください。
        オプション:
            --distribution, -d [Argument]
                ダウンロードしてインストールするディストリビューションを名前で指定します。
                引数:
                    有効なディストリビューションの名前 (大文字と小文字は区別されません)。
                例:
                    wsl --install -d Ubuntu
                    wsl --install --distribution Debian
            --inbox
                Microsoft Store で利用可能なバージョンではなく、オプションの Windows 機能をインストールします。
            --enable-wsl1
                Microsoft Store バージョンで WSL1 サポートを有効にします。
            --no-distribution
                ディストリビューションをインストールしません ( --distribution と一緒には使用できません)。
            --no-launch, -n
                インストール後にディストリビューションを起動しません。
            --web-download
                Microsoft Store ではなく、インターネットから WSL の最新バージョンをダウンロードします。
    --list, -l [Options]
        ディストリビューションを一覧表示します。
        オプション:
            --online, -o
                'wsl --install' でのインストールに利用できるディストリビューションの一覧を表示します。
    --status
        Linux 用 Windows サブシステムの状態を表示します。
    --help
        使用に関する情報を表示します。
PS C:\Users\rs_tukki>
```

このように、コマンドの一覧が出力されました。
`wsl --list --online`コマンドでインストールできるディストリビューションの一覧を確認できらしいので、今度はそちらを実行してみます。

```powershell
PS C:\Users\rs_tukki> wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
既定の分布は ' * ' で表されます。
 'wsl --install -d <Distro>'を使用してインストールします。

  NAME               FRIENDLY NAME
* Ubuntu             Ubuntu
  Debian             Debian GNU/Linux
  kali-linux         Kali Linux Rolling
  SLES-12            SUSE Linux Enterprise Server v12
  SLES-15            SUSE Linux Enterprise Server v15
  Ubuntu-18.04       Ubuntu 18.04 LTS
  Ubuntu-20.04       Ubuntu 20.04 LTS
  OracleLinux_8_5    Oracle Linux 8.5
  OracleLinux_7_9    Oracle Linux 7.9
PS C:\Users\rs_tukki>
```

ディストリビューションを指定せず`wsl --install`を実行した場合、`Ubuntu`がインストールされるようです。  
(CentOSはWSLコマンドではインストールできませんでした。以前は有料のWSL向けディストリビューションがMicrosoft Storeにありましたが、今はそれすらもなくなっています)

### KaliLinuxのインストール

今回はKaliLinuxをインストールしたいので、
今度は`wsl --install -d kali-linux`と明示的にディストリビューションを指定してコマンドを実行します。

```powershell
PS C:\Users\rs_tukki> wsl --install -d kali-linux
要求された操作には管理者特権が必要です。
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
インストール中: Kali Linux Rolling
Kali Linux Rolling はインストールされました。
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
PS C:\Users\rs_tukki>
```

先ほど説明したとおり、ディストリビューションだけでなくそれを動かすために必要な諸々まで一緒にインストールしてくれます。更にここでPCを再起動すると、自動的にShellが立ち上がり……

```zsh
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: rs_tukki
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
┏━(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)
┌──(rs_tukki㉿DESKTOP-9L54E7N)-[~]
└─$
```

初期ユーザ作成ののちKaliLinuxにログインできました！
思ったより簡単！

KaliLinuxでは`/etc/os-release`にバージョン情報が格納されていますが、そちらを見てみると下記の通り最新版がインストール出来ているのが分かるかと思います。
なお、`ID_LIKE=debian`の記載が示すとおり、KaliLinuxは`debian`系のディストリビューションとなっています。

```zsh
┌──(rs_tukki㉿DESKTOP-9L54E7N)-[~]
└─$ cat /etc/os-release
PRETTY_NAME="Kali GNU/Linux Rolling"
NAME="Kali GNU/Linux"
VERSION="2022.4"
VERSION_ID="2022.4"
VERSION_CODENAME="kali-rolling"
ID=kali
ID_LIKE=debian
HOME_URL="https://www.kali.org/"
SUPPORT_URL="https://forums.kali.org/"
BUG_REPORT_URL="https://bugs.kali.org/"
ANSI_COLOR="1;31"

┌──(rs_tukki㉿DESKTOP-9L54E7N)-[~]
└─$
```

### Win-Kexのインストール

最初に説明したとおり、KaliLinuxには以下のようなペネトレーションテストを行うための各種ツールがあらかじめインストールされています。

* [Nmap](https://www.kali.org/tools/nmap/)
* [Netcat](https://www.kali.org/tools/netcat/)
* [John The Ripper](https://www.kali.org/tools/john/)
* [Burp Suite](https://www.kali.org/tools/burpsuite/)

しかし、これらのツールはGUI上で動かすものが結構多いです。つまりインストールした直後の状態だとこれらのツールを十分には扱えません。
そのため、KaliLinuxをデスクトップ環境で動かすためのパッケージであるWin-Kexが別途必要になります。

まずは、`sudo apt update`でパッケージ一覧を更新し...

```zsh
┌──(rs_tukki㉿DESKTOP-9L54E7N)-[~]
└─$ sudo apt update
[sudo] password for rs_tukki:
Get:1 http://ftp.riken.jp/Linux/kali kali-rolling InRelease [30.6 kB]
Get:2 http://ftp.riken.jp/Linux/kali kali-rolling/main amd64 Packages [18.9 MB]
Get:3 http://ftp.riken.jp/Linux/kali kali-rolling/non-free amd64 Packages [239 kB]
Get:4 http://ftp.riken.jp/Linux/kali kali-rolling/contrib amd64 Packages [114 kB]
Fetched 19.3 MB in 7s (2,917 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
30 packages can be upgraded. Run 'apt list --upgradable' to see them.

┌──(rs_tukki㉿DESKTOP-9L54E7N)-[~]
└─$ 
```

`kali-win-kex`パッケージをインストールします。
結構時間がかかるのでのんびり待ちましょう。

```zsh
┌──(rs_tukki㉿DESKTOP-9L54E7N)-[~]
└─$ sudo apt install -y kali-win-kex
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:

(中略)

aspell-autobuildhash: processing: en [en_US-wo_accents-only].
Processing triggers for initramfs-tools (0.142) ...
Processing triggers for dbus (1.14.4-1) ...
Processing triggers for libgdk-pixbuf-2.0-0:amd64 (2.42.10+dfsg-1) ...
Processing triggers for sgml-base (1.31) ...

┌──(rs_tukki㉿DESKTOP-9L54E7N)-[~]
└─$
```

実際にデスクトップ環境でKaliLinuxを起動する場合、上記のインストールが完了した後に`kex`または`kex --win`コマンドを実行すると別ウィンドウが立ち上がります。
デフォルトだと全画面になってしまうので、`-m`オプションを付与して縮小画面にするとよいでしょう。

```zsh
┌──(rs_tukki㉿DESKTOP-9L54E7N)-[/mnt/c/Users/rs_tukki]
└─$ kex --win -m


Win-KeX server sessions:

X DISPLAY #     RFB PORT #      RFB UNIX PATH   PROCESS ID #    SERVER
1               5901                            3639            Xtigervnc

You can use the Win-KeX client to connect to any of these displays.


┌──(rs_tukki㉿DESKTOP-9L54E7N)-[/mnt/c/Users/rs_tukki]
└─$
```

実際に立ち上がった状態がこちら。

![スクリーンショット 2022-12-13 003923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308803/ceb93411-6383-ec5e-5d3a-670d83ade7c1.png)

各種ツールも既にインストールされているのが分かるかと思います。

![スクリーンショット 2022-12-13 004058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308803/901adec4-99b0-4718-b30e-a09a9e519014.png)

## トラブルシューティング

KaliLinuxのセットアップ中、いくつか詰まった点があるので解消方法も記載しておきます。

### KaliLinuxのバージョンが古い

`wsl --install -d kali-linux`でKaliLinuxをインストールした際、
そのバージョンが極端に古い場合があります。

```zsh
VERSION="2019.2"
```

この状態だと複数のパッケージが古い状態であり、
KaliLinuxが保持するリポジトリキーも古いため、まず「apt update」が失敗します。

```bash
rs_tukki@DESKTOP-9L54E7N:~$ sudo apt update

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] password for rs_tukki:
Get:1 http://ftp.riken.jp/Linux/kali kali-rolling InRelease [30.6 kB]
Err:1 http://ftp.riken.jp/Linux/kali kali-rolling InRelease
The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository <devel@kali.org>
Fetched 30.6 kB in 1s (33.1 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://ftp.riken.jp/Linux/kali kali-rolling InRelease: The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository <devel@kali.org>
W: Failed to fetch http://http.kali.org/kali/dists/kali-rolling/InRelease  The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository <devel@kali.org>
W: Some index files failed to download. They have been ignored, or old ones used instead.
```

そのため、リポジトリキーを更新しようとすると……

```bash
rs_tukki@DESKTOP-9L54E7N:~$ sudo wget -q -O - https://archive.kali.org.archive-key.asc | apt-key add
E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation
```

今度は、必要なパッケージがインストールされていないと怒られます。
しかし、そのパッケージのインストールも、やはりリポジトリキーに阻まれ結局堂々巡りになってしまいます。

このエラーを解消するには、

1. KaliLinuxのリポジトリキーを(手動で)更新する
1. 必要なパッケージを(手動で)更新する
1. 「apt update」「apt upgrade」を実行

という手順を踏む必要があります。
偉大な先人が手順をまとめてくださっているため詳細はこちらをご確認ください。

https://gist.github.com/kylefmohr/4cd11321a55669ce09c64b0967219a94

### Win-Kexの起動に失敗する

`kex --win -m`コマンドでデスクトップを起動しようとした際に、以下のエラーが発生するケースがあります。

```zsh
┌──(rs_tukki㉿DESKTOP-9L54E7N)-[/mnt/c/Users/rs_tukki]
└─$ kex --win -m

Error connecting to the KeX server.
Please try "kex start" to start the service.
If the server fails to start, please try "kex kill" or restart your WSL2 session and try again.
```

エラーメッセージの記載通りに`kex start`や`kex kill`コマンドで再起動を試みても同じエラーが繰り返されるばかりなのですが、こちらについては以下の記事が参考になりました。

https://github.com/microsoft/WSL/discussions/6675

どうやら、デフォルトで用意されているGUI用のシステムが邪魔をしているらしいです。
これをまるごと削除すれば動くようになるとのこと。

`Read-only`ファイルなので削除してよいか不安になりますが、~~もし壊れても最悪一から再構築できるので~~気にせず削除していきましょう。
これで正常にkexコマンドが動作するようになります。

```zsh
┌──(rs_tukki㉿DESKTOP-9L54E7N)-[/mnt/c/Users/rs_tukki]
└─$ sudo su
[sudo] password for rs_tukki:

┌──(root㉿DESKTOP-9L54E7N)-[/mnt/c/Users/rs_tukki]
└─# rm -r /tmp/.X11-unix
rm: cannot remove '/tmp/.X11-unix/X0': Read-only file system

┌──(root㉿DESKTOP-9L54E7N)-[/mnt/c/Users/rs_tukki]
└─# umount /tmp/.X11-unix/

┌──(root㉿DESKTOP-9L54E7N)-[/mnt/c/Users/rs_tukki]
└─# rm -r /tmp/.X11-unix

```

## まとめ

今回は、WSLで一からKaliLinuxのディストリビューションを構築する方法を記事にしてみました。

今回、どうしてKaliLinuxを構築したかというと、ペネトレーションテストの学習のために「Hack The Box」を触ってみたかったからです。
こちらについての詳細はまた機会があれば紹介させていただきます。

https://www.hackthebox.com/

## 参考

https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux

https://ja.wikipedia.org/wiki/Kali_Linux

https://learn.microsoft.com/ja-jp/windows/wsl/install

https://linuxconfig.org/how-to-check-kali-linux-version

https://www.kali.org/docs/wsl/win-kex/

https://ja.wikipedia.org/wiki/X_Window_System