Kali on the Windows Subsystem for Linux (WSL)

Takayuki Kawamoto

Contact: there is no way to me now.

First appeared: 2018-02-02 13:23:00,
Modified: 2018-02-03 22:00:03, 2018-02-05 18:36:23, 2018-02-06 16:29:15, 2018-02-07 16:02:39,
Last modified: 2018-03-06 21:36:43.

お断り

本稿は Kali on the Windows Subsytem for Linux の導入から、情報セキュリティの実務で使われている各種のツールについて解説するために起稿しましたが、実際に使ってみるとパッケージのインストールに失敗するため、情報セキュリティの実務家のマシンでは殆ど使えないツール(あるいはネットワークを始めとする色々な条件を緩和しない限り動かない実行環境)だと分かりました。これを使うために専用の(情報セキュリティの観点では「クソ」のような)Windows マシンを用意する意欲と時間ができたら解説を書き足すかもしれませんが、ひとまず問題なく進められたところ(実行環境としての Kali のインストール)までを説明します。

はじめに

Kali on the Windows Subsystem for Linux (WSL) in action

このページは、ペネトレーション・テスト等を実施する情報セキュリティ技術者が使うツールやアプリケーションをサポートする Kali LinuxDebian をベースにした Linux ディストリビューション)の「実行環境」を Windows 上で使うための情報をまとめてあります。ここで「実行環境」と言っているのは、Linux という OS そのものを仮想化して Windows 上で動かすという意味ではなく、Linux のバイナリ実行可能ファイルを Windows でネイティブ実行するための互換レイヤーである Windows Subsystem for Linux (WSL) を導入して、これまで MinGWCygwin といった互換レイヤーで提供されてきたのと同じく、Linux のツールやアプリケーションの一式を使うという意味です。この WSL は Microsoft が公式に提供する Linux 互換レイヤーであり、仮想化の virtual machine によって OS そのものを Windows 上で動かすのに比べて、もっと少ないリソースで lstop のような Linux コマンドを使えるようになります。しかも、コマンドライン・シェルを専用のプログラムに切り替える必要もなく、Windows のコマンドプロンプトとして立ち上げたウィンドウ(プロセス)から、直に Linux のサブシステムへ移行できます(Kali の場合は Windows のコマンドプロンプトや PowerShell で bash と打つだけでサブシステムに移行します)。

Kali on the Windows Subsystem for Linux では、WSL で動作するディストリビューションとして扱えるように Docker というコンテナ型の仮想化技術で使われる「イメージファイル」を利用しています(Docker というプラットフォーム、つまり Docker エンジンをインストールして使っているわけではありません。Docker で使われるイメージファイルを WSL に利用しているだけです)。したがって Docker そのものの詳しい解説は不要だと思いますが、念のため Docker について簡単に説明しておくと、Kali Linux image のようなイメージは幾つかの読み込み専用のレイヤーに分かれています。Docker エンジンは、それらのレイヤーを組み合わせて実行環境のベースとしており、その実行環境に追加されるアプリケーションやコマンドのレイヤーを加えた「コンテナ」を管理する仕組みが Docker です。(したがって、docker を実行して何か Linux のコマンドを入力した場合、どういうイメージを選ぶかによってコマンドの実行環境は異なり、結果としてコンテナ全体の挙動も変わります。)Docker は VirtualBox や Hyper-V のようなハイパーバイザ型の OS 仮想化とは違って、カーネルをホストと共有している(つまり Kali は Windows のカーネルで動く)ため、起動が速くてリソースの消費も少ないというメリットがあります。但しデメリットとして Kali Linux として作られたカーネルを使えないため、Kali Linux の OS としての特徴が全く活かせません。また、公式の Docker image は Kali Linux のセキュリティ・ツールが入っていないため、本稿でも後述しますが、自分で apt-get コマンドなどで追加しましょう。

このページが扱うのは、Windows Subsystem for Linux(詳しい説明は専用の公式ブログにもあります)と Kali on the Windows Subsystem for Linux です。なお、WSL を導入する際にインストールされる実行環境は、公式には Ubuntu, OpenSUSE, SUSE Linux Enterprise Server のどれかですが(2018年1月末の時点)、Linux ディストリビューションにもとづく実行環境を選択できるようになっているということは、Debian にもとづく実行環境も選択し得るということでもありますし、現に Windows Subsystem for Linux Distribution Switcher というものがあるので、これを利用しない手はないというわけです。ただし、この Windows Subsystem for Linux Distribution Switcher を使うには Python が必要となりますし(もちろん Windows で実行する Python でありサブシステムが提供する Linux 環境でインストールした Python ではありません)、Kali on the Windows Subsystem for Linux を利用するには、下記に列挙する幾つかの要件がありますので、ご注意ください。

WSL の概要やインストール手順について書かれたオンラインの記事としては、以下のページが参考になります。

Kali on the Windows Subsystem for Linux のインストール手順について書かれた日本語の解説は一つだけありますが、ここでご紹介する内容と大差ないので割愛します。ちなみに、そのブログは SEO 業者のリンファームやサテライトサイトとは考え難いコンテンツですが、なんといってもブログ名が「echo "ccvvccz%ccv%r8ll" | tr '!-~' 'P-~!-O' | base64 -d」(Linux のコマンドとして実行すれば「うんこ」だと分かります)なので、ここ数年しばしば見かける「メモ代わりにオリジナルのブログを一つ立ち上げてしまう人」の一例なのかもしれません。

WSL のインストールは、二つのやり方に大別できます。両者の違いは、後者の場合は再起動を促されることくらいですが、念のためどちらのやり方でも再起動しておきましょう。

  1. PowerShell を管理者権限で起動してEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linuxのコマンドラインでインストールする。
  2. コントロールパネルの「Windowsのプログラムと機能」で左のペインにある「Windowsの機能の有効化または無効化」というメニュー項目でウィンドウを起動し(「ファイル名を指定して実行」(Ctrl + R)で “optionalfeatures” とタイプして実行しても同じ。ちなみに、Kali も WSL も Docker エンジン自体は使っていないので、「コンテナ」という機能が有効になっていないことが分かると思います。こういうページで紹介されている方法と混同しないようにしましょう)、「Windows Subsystem for Linux」をチェックして指示に従う。

次に Windows ストアで Ubuntu などを選んでインストールできます*。今回は Kali に入れ替えるので、PowerShell で lxrun /install(レガシー環境でのコマンド)と入力すれば勝手に Ubuntu が選択されてインストールされますので、コマンドラインでもよいでしょう。ただし、Windows ストアでもコマンドラインでもセキュリティソフトのファイル保護やファイアーウォールを停止させておき、Windows Update を「自動」に設定しておきましょう。これらの条件が満たされない場合は、“0x80070422” というエラーでインストールが続行できなくなる場合があります。

*先日、Windows ストアで Kali Linux が選択できるようになったそうです。ただし、いまのところ Windows Defender がパッケージ・ツールをハッキング・ツールとして検出してしまうので、Defender のリアルタイム保護を無効にしなくてはならないようです。

冒頭に戻る

Kali on the Windows Subsystem for Linux の導入

Kali on the Windows Subsystem for Linux(長いので “Kali” と書きますが、ディストリビューションの Kali Linux は省略せずに書きます)を導入する手順は、先に要件として WSL のインストールを挙げたように、WSL がインストールされた状況を前提にして、Ubuntu などの実行環境を Switcher で Kali に入れ替えるというものになります。もちろん、WSL をインストールするときに選択できる実行環境の一つに Kali が加わるようなことになれば、Kali を使うという事情だけで言えば Switcher は不要なので、この一章は別の説明になるか不要となるでしょう。

Switcher と Kali の導入は、Windows コマンドプロンプトから次のように実行します([...] は文字列や行の省略を指しています。仮に何十行でも [...] 一つで省略している場合があるので、ご注意ください)。具体的な手順の様子は、Kali Linux のサイトで動画が公開されているので、これを見て手順の概要を掴むのもよいでしょう。

C:\Users\user> git clone https://github.com/RoliSoft/WSL-Distribution-Switcher.git Cloning into 'WSL-Distribution-Switcher'... remote: Counting objects: 312, done. Receiving objects: 100% [...], done. Resolving deltas: 100% [...], done. C:\Users\user> cd WSL-Distribution-Switcher C:\Users\user\WSL-Distribution-Switcher> python get-prebuilt.py kalilinux/kali-linux-dokcer [*] Requesting authorization token... [*] Fetching manifest info for kalilinux/kali-linux-docker:latest... [*] Downloading layer sha256: [...] ... [...] [*] Rootfs archive for kalilinux/kali-linux-docker:latest saved to rootfs_kalilinux_kali-linux-docker_latest.tar.gz C:\Users\user\WSL-Distribution-Switcher> python install.py rootfs_kalilinux_kali-linux-docker_latest.tar.gz [*] Probing the Linux subsystem... [*] Default user is philsci at /home/philsci. [*] Reading /etc/{passwd,shadow,group,gshadow} entries for root and philsci... [*] Beginning extraction... [...] [*] Backing up current rootfs to rootfs_ubuntu_xenial... [*] Switching to new rootfs... [*] Writing entries of root and philsci to /etc/{passwd,shadow,group,gshadow}... C:\Users\user\WSL-Distribution-Switcher> lxrun /setdefaultuser root Warning: lxrun.exe is only used to configure the legacy Windows Subsystem for Linux distribution. Distribution can be installed by visiting the Windows Store: https://aka.ms/wslstore Found UNIX user: root Default UNIX user set to: root

これで完了です。bash とタイプすれば、そのまま Kali の実行環境へ移れるので、ついでに以下のとおり動作設定(ロケールを “C” にして任せる)をしておきましょう。

C:\Users\user\WSL-Distribution-Switcher> bash root@PHILSCI-PC:/mnt/c/Users/user/WSL-Distribution-Switcher# export LANG=C && cd root@PHILSCI-PC:~# cat /etc/issue Kali GNU/Linux Rolling \n \l

また、インストールした直後は apt-get コマンドでパッケージのアップデートや実行環境のアップグレードも忘れないように実施してください。(apt-get dist-upgrade で、競合関係にも配慮しつつ重要なパッケージのアップデートを優先するようにしてください。apt-get upgrade だと、依存関係のあるパッケージが更新されていない場合は、アップグレートの対象となるパッケージがどれほど重要な更新でも更新されずに無視されてしまいます。)

冒頭に戻る

何か問題が起きた時のリセット方法

実際に Kali を使ってみて何度か遭遇した問題は、パッケージをインストールするときにプロセスがハングしてしまうということでした。Ctrl + G で抜けられるのはいいとしても、いったん Kali (WSL) の環境から exit で出てしまうと、二度と bash コマンドで Kali に入れなくなってしまうこともあります。こういう場合に最も確実で簡単なのは、やはり実行環境をリセットしてしまうことでしょう。以下のような手順でリセットできますが、WSL をインストールしたときと同じく、セキュリティソフトは無効にしておくとよいでしょう。

Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\WINDOWS\system32> bash エラー: 0x80070040 続行するには何かキーを押してください... PS C:\WINDOWS\system32> lxrun.exe /uninstall /full 警告: lxrun.exe は、Linux ディストリビューションのためにレガシ Windows サブシステムを構成するだけに使用されます。 ディストリビューションは次の Windows ストアを訪問してインストールすることができます: https://aka.ms/wslstore これにより Windows 上の Ubuntu がアンインストールされます。 Ubuntu 環境およびすべての変更内容、新しいアプリケーション、およびユーザー データが削除されます。 続行するには、"y" を入力してください: y アンインストールしています... PS C:\WINDOWS\system32> lxrun.exe /install 警告: lxrun.exe は、Linux ディストリビューションのためにレガシ Windows サブシステムを構成するだけに使用されます。 ディストリビューションは次の Windows ストアを訪問してインストールすることができます: https://aka.ms/wslstore これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、次のサイトに示さ れる条件に基づいてライセンスされています。 https://aka.ms/uowterms 続行するには、"y" を入力してください: y Windows ストアからダウンロードしています... 100% ファイル システムを展開しています。この処理には数分かかります... Ubuntu のロケールを Windows のロケール (ja-JP) と一致するように設定しますか? 既定のロケールは en_US です。 続行するには、"y" を入力してください: y 既定の UNIX ユーザー アカウントを作成してください。ユーザー名は、Windows のユーザー名と一致する必要はありません。 詳細: https://aka.ms/wslusers を参照してください 新しい UNIX ユーザー名を入力してください: root UNIX ユーザーが見つかりました: root インストールに成功しました! ドキュメントはこちらで参照できるます: https://aka.ms/wsldocs PS C:\WINDOWS\system32>

ここまで来たら、後は前節と同じように Kali をインストールできるます(これ、いつになったら直るんだろう?)。

冒頭に戻る

パッケージの管理

先に注釈したとおり、Kali のイメージをインストールしただけだとペネトレーション・テストなどに使うツールが入っていませんから、自分で追加しましょう。Debian ベースの Linux では、ソフトウェアをインストールする方法として、ソースからコンパイルする方法はもちろんのこと、他に “deb” というソフトウェア・パッケージを利用できます。deb パッケージは Debian binary package というファイル形式を採用していて、中身は管理情報とソフトウェア本体という二つの圧縮データで構成されています。Kali の実行環境であらかじめインストールされているパッケージの情報は dpkg --list というコマンドで下記のように確認できます。

root@securityadmin:/# dpkg --list Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-========================-===============[...] ii adduser 3.116 all add and remove users and groups ii apt 1.6~alpha6 amd64 commandline package manager ii apt-utils 1.6~alpha6 amd64 package management related utility programs [...] ii util-linux 2.30.2-0.1 amd64 miscellaneous system utilities ii vim-common 2:8.0.1401-2 all Vi IMproved - Common files ii vim-tiny 2:8.0.1401-2 amd64 Vi IMproved - enhanced vi editor - compact version ii wget 1.19.2-1 amd64 retrieves files from the web ii whiptail 0.52.20-1+b1 amd64 Displays user-friendly dialog boxes from shell script ii xxd 2:8.0.1401-2 amd64 tool to make (or reverse) a hex dump ii zlib1g:amd64 1:1.2.8.dfsg-5 amd64 compression library - runtime root@securityadmin:/#

すぐ分かるように、john や hashcat のようなパスワード解析ツールどころか git や python すら入っていません。したがって、Kali で何をしたいのか決めてから必要なパッケージを計画的に追加していくか、あるいは Kali Linux のサイトないしサーバで提供されているパッケージをひととおり入れてしまうかを決めて、パッケージを追加しましょう。この節は手順を解説することだけが目標なので、差し当たってパッケージを一つだけインストールしてみます。(とは言え、パッケージ一つをインストールする場合でも、依存関係によっては他のパッケージを大量にインストールしたりアップグレードしなくてはならない場合もあります。)

ここで問題になるのは、Kali Linux のツール専用サイトでパッケージが提供されているツールのうち、Kali には一部のパッケージしかインストールできないということです。Kali は WSL で動いているため、ハードウェア制御という OS の機能に影響を与えるようなソフトウェア(あるいは、そのようなソフトウェアへ依存しているソフトウェア)は、そもそも WSL が対応可能なシステムコールの範囲においてサポートされておらず、したがって Kali においても動作しないという制約があります。上記で Kali の実行環境であらかじめインストールされているパッケージやコマンドの一覧を見ましたが、その中に shutdown コマンドは含まれていませんし、Kali では apt-get コマンドで shutdown, reboot あるいは upstart パッケージを追加しようとしても拒否されます。(そもそも、WSL で動いているのは OS ではないので、Kali を終了させるなら、単にコマンドプロンプトや PowerShell のウィンドウを閉じるか、Kali から exit で Windows のプロンプトへ抜けてから、更に exit で終了すればいいだけです。)

次に、僕が遭遇している(それゆえ、ここから先のパッケージ導入について書けない)問題は、apt-get update がそもそもできないということです。

Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\WINDOWS\system32> bash root@securityadmin:/# apt-get install git Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package git root@securityadmin:/# apt-get update Get:1 http://ftp.ne.jp/Linux/packages/kali/kali kali-rolling InRelease [30.5 kB] Err:1 http://ftp.ne.jp/Linux/packages/kali/kali kali-rolling InRelease The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository Reading package lists... Done W: http: aptMethod::Configuration: could not load seccomp policy: Invalid argument W: http: aptMethod::Configuration: could not load seccomp policy: Invalid argument W: GPG error: http://ftp.ne.jp/Linux/packages/kali/kali kali-rolling InRelease: The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository E: The repository 'http://http.kali.org/kali kali-rolling InRelease' is not signed. N: Updating from such a repository can't be done securely, and is therefore disabled by default. N: See apt-secure(8) manpage for repository creation and user configuration details. W: Target Packages (main/binary-amd64/Packages) is configured multiple times in /etc/apt/sources.list:1 and /etc/apt/sources.list.d/kali.list:1 W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:1 and /etc/apt/sources.list.d/kali.list:1 W: Target Translations (main/i18n/Translation-en) is configured multiple times in /etc/apt/sources.list:1 and /etc/apt/sources.list.d/kali.list:1

このような場合、Ubuntu では apt-key コマンドを使って公開鍵を修復するようですが、Kali ではそれもできません。なぜなら、

root@securityadmin:/# apt-key list E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation root@securityadmin:/#

のように、そもそも gnupg が入っておらず、apt-get コマンドでインストールしようとしても、

E: Package 'gnupg' has no installation candidate

という堂々巡りになってしまいます(なぜか gpgv だけは入っていますが)。

そして更に後日談があって、いったん WSL をアンインストールして、今度は「コンテナ―」の機能を有効にしてから Docker エンジンそのものをインストールしてみたのです。しかし、これは更に事態をややこしくするだけであり、Docker がタイムアウトしたり Hyper-V との関連で起動しないという、全くもって本質からどんどん離れるだけの問題に悩まされることになったので、Windows の仮想化エンジンで Kali どころか Linux や他の OS を動作させるということ自体、たぶん僕がチューニングしているような情報セキュリティの実務家が使うあまりにもセキュアなマシンでは、およそ実用レベルに達していないという結論に至りました。ということで、Kali Linux やペネトレーション・テストといった話題は、社内で使えるマシンに「本物の」Kali Linux をインストールして運用するようになったときに、別の記事として公開しようと思います。

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Google+ Twitter Facebook