Kali on the Windows Subsystem for Linux (WSL)
Contact: takayuki.kawamoto@markupdancing.net
ORCID,
Google Scholar,
PhilPapers.
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 Linux(Debian をベースにした Linux ディストリビューション)の「実行環境」を Windows 上で使うための情報をまとめてあります。ここで「実行環境」と言っているのは、Linux という OS そのものを仮想化して Windows 上で動かすという意味ではなく、Linux のバイナリ実行可能ファイルを Windows でネイティブ実行するための互換レイヤーである Windows Subsystem for Linux (WSL) を導入して、これまで MinGW や Cygwin といった互換レイヤーで提供されてきたのと同じく、Linux のツールやアプリケーションの一式を使うという意味です。この WSL は Microsoft が公式に提供する Linux 互換レイヤーであり、仮想化の virtual machine によって OS そのものを Windows 上で動かすのに比べて、もっと少ないリソースで ls
や top
のような 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 を利用するには、下記に列挙する幾つかの要件がありますので、ご注意ください。
- 64 ビット版(build 16215 以降の)Windows 10(2017年4月以降は Server 版でも可。いちおう Windows 10 Home edition でも使える)
- Python 3.x 以降(Switcher に必要。僕は version 3.6.4 で動作確認しています。環境変数にパスを追加するオプションを付けてください)
- Git 2.x 以降(Switcher に必要。僕は version 2.16.1 で動作確認しています。Credential manager は不要です)
- WSL が既にインストールされていること(手順は公式ページ等を参照)
WSL の概要やインストール手順について書かれたオンラインの記事としては、以下のページが参考になります。
- 亀川和史「Windows Subsystem for Linuxとは? そのインストールと使い方」, Build Insider, 2017-10-25(要件の変更に応じて記事が更新されており、最初に読む記事として信頼に値すると思います).
- 塩田紳二「Windows Subsystem for Linuxの中身を詳しく見る」, ASCII.jp, 2016-10-09(解説は複数の記事にも及んでいて詳しいのですが、インストール手順は解説されていません).
- Aruneko「Windows Subsystem for Linuxをインストールしてみよう!」, Qiita, 2017-11-02(既に入っている古い実行環境の Bash on Ubuntu on Windows がある状態からの手順が解説されています).
Kali on the Windows Subsystem for Linux のインストール手順について書かれた日本語の解説は一つだけありますが、ここでご紹介する内容と大差ないので割愛します。ちなみに、そのブログは SEO 業者のリンファームやサテライトサイトとは考え難いコンテンツですが、なんといってもブログ名が「echo "ccvvccz%ccv%r8ll" | tr '!-~' 'P-~!-O' | base64 -d」(Linux のコマンドとして実行すれば「うんこ」だと分かります)なので、ここ数年しばしば見かける「メモ代わりにオリジナルのブログを一つ立ち上げてしまう人」の一例なのかもしれません。
WSL のインストールは、二つのやり方に大別できます。両者の違いは、後者の場合は再起動を促されることくらいですが、念のためどちらのやり方でも再起動しておきましょう。
- PowerShell を管理者権限で起動して
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
のコマンドラインでインストールする。 - コントロールパネルの「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 をインストールして運用するようになったときに、別の記事として公開しようと思います。