Kali LinuxをDocker Desktopにインストールする

Kali LinuxをDocker Desktopにインストールします。
https://www.kali.org/get-kali/#kali-containers

Dockerイメージの取得

Docker イメージのリポジトリは下記となりますが、
https://hub.docker.com/u/kalilinux/

Docker Desktop 最上部の検索バーからも探すことができます。

「Kali」と検索してイメージをダウンロード(Pull)。

イメージ一覧に「kalilinux/kali-rolling」ができました。

追記 (systemd を使ったバージョン)

Kali 公式のイメージ(kalilinux/kali-rolling)では起動プロセスに systemd ではなく SysVinit (SystemV) を使っています。そのため systemctlコマンドが使えません。これは WSLの仕様で、WSLでは最近まで initシステムの既定値が SystemV でした。現在はwsl --installコマンドの既定値を使用してインストールされる最新バージョンの Ubuntu のデフォルトはsystemdとなっていますが、Kali Linux 公式はまだ未対応のようです。
「Windows Subsystem for Linux」が「systemd」に対応へ - 窓の杜
Serviceコマンドの方でなんとかなる物も多いのですが、Metasploit Framework の初期化などが systemctlでないと失敗します。

下記を参考にしてsystemdを有効にすることができるか試したのですがうまくいきませんでした。
systemd を使用して WSL で Linux サービスを管理する | Microsoft Learn
systemd を使用して WSL で Linux サービスを管理する | Microsoft Learn

そこで最終的には systemd を採用した Kali Linux イメージを見つけたのでそれを使うことにしました。(オフィシャルの kalilinux/kali-rolling を元に作成されたようです)
https://github.com/jz543fm/kali-dockerized
Docker Desktopでコンテナイメージ名「lostcauze7/kali-dockerized」で検索すると出てきます。

こちらを使うと systemd での起動となります。

# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1  20476 12216 ?        Ss   11:55   0:00 /lib/systemd/systemd --show-status=false --unit=docker-entrypoint.target

以下の作業はイメージ名などを置き換えて読んでください。また所々で挙動が違います。rdp の起動などもserviceコマンドではなくsystemctl start xrdpとなります。

コンテナを生成して起動する

初めはGUIで起動を試したのですがうまくいかなかったため、一旦CUIで起動だけ行いました。
Using Kali Linux Docker Images | Kali Linux Documentation

PowerShellでの実行例
(後のGUI操作をVNCを使ったリモートログインで行う予定です。VNCをポート3390に公開することとし、sharedメモリのデフォルトサイズ64MBではGUIを使うのに心許ないので512MBに拡張しています。)

PS C:\> docker run -it --name Kali-Linux -p 3390:3390 --expose=3390 --shm-size=512m kalilinux/kali-rolling /bin/bash

またはGUIが不要な場合はマニュアル通り下記のコマンドでOKです。

PS C:\> docker run --name Kali-Linux --tty --interactive kalilinux/kali-rolling  
┌──(root㉿7f44c2e44f47)-[/]
└─# exit
exit

コンテナが生成できたらPowerShellは閉じて、再度DockerDesktopの端末で操作していくことにします。コンテナを起動。

端末を開く。シェルを変更。(デフォルトでbashのはずで、念のためコンテナ生成時にも /bin/bash と指定したのですがうまくいきませんでした)

アップデート

# apt update
# apt full-upgrade -y

続けて、一度に複数のパッケージをインストールできるメタパッケージというものがあるので適宜インストール。今回は「kali-linux-default」にしました。
Kali Linux Metapackages | Kali Linux Documentation

# apt install -y kali-linux-default

途中の選択

  • Install Kismet "setuid root"? [yes/no]

WiFiのアナライザーのKismetはいくつかの機能でroot権限を必要とします。しかし、root権限("sudo kismet")で実行 することは推奨されません。そこでKismet用のユーザを作りKismetグループに追加します。「Yes」を選択しました。

  • Users to add to the kismet group:

端末右上の「Open in external terminal⁠」をクリックして新規端末を開きます。

# adduser hoge(適宜設定。"kismet"にはしない方がよいです。ユーザー作成のグループ名とシステムが作るグループ名が被るため後でエラーが出て面倒です)

で新規ユーザを作って閉じ「Users to add to the kismet group: hoge」として登録しました。

  • Change MAC automatically? [yes/no]

イーサネットケーブルを接続したり無線LANを再有効化したりするたびに、自動的にMACアドレスを変更するかどうか。「yes」を選択しました。

  • Should non-superusers be able to capture packets? [yes/no]

スーパーユーザでなくても WireSharkを使えるようにするか。Wiresharkをroot権限で直接実行する方法よりも推奨されます。「yes」を選択しました。

  • Character set to support:

コンソールで使用されるフォントの選択。「23」Guess optimal character set(最適な文字セットを推測する)を選択しました。

  • Run sslh:

443などの同じポートでsshやssl、openvpnなどの接続を受け入れることができる多重化サービス。
『sslhはinetdのサービスとして実行することも、スタンドアロンサーバーとして実行することもできます。一日に数回しか接続しない場合はリソースを節約するために、おそらく inetd から sslh を実行する方がよいでしょう。一方、多くの接続がある場合は、sslhをスタンドアロンサーバーとして実行し、接続が来るたびに新しいプロセスが生成されるのを避けるべきである。』
「1」from inetd を選択しました。

地域と言語の設定

# dpkg-reconfigure tzdata
Geographic area:「5」. Asia を選択
Time zone:「78」.Tokyo を選択

# dpkg-reconfigure locales
Locales to be generated:「167」. ja_JP.UTF-8 UTF-8 を選択
Default locale for the system environment:「3」. ja_JP.UTF-8 を選択

確認

# cat /etc/os-release
PRETTY_NAME="Kali GNU/Linux Rolling"
NAME="Kali GNU/Linux"
VERSION_ID="2023.3"
VERSION="2023.3"
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"

# nmap --version
Nmap version 7.94 ( https://nmap.org )
Platform: x86_64-pc-linux-gnu
Compiled with: liblua-5.4.4 openssl-3.0.11 libssh2-1.11.0 libz-1.2.13 libpcre-8.39 libpcap-1.10.4 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select

GUIをXfceとし、リモートデスクトップ接続を行う

Setting up RDP with Xfce | Kali Linux Documentation

# apt update

# apt install kali-desktop-xfce xorg xrdp

# sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini

RDPログイン用に新しいユーザーを作成します
# adduser fuga(適宜設定)

RDPサービスを開始
# /etc/init.d/xrdp start
Starting Remote Desktop Protocol server: xrdp-sesman xrdp.

systemdの場合
# systemctl start xrdp
# systemctl enable xrdp
# systemctl status xrdp
● xrdp.service - xrdp daemon
     Loaded: loaded (/usr/lib/systemd/system/xrdp.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-04-07 20:36:59 JST; 25s ago

ホストコンピュータから 127.0.0.1:3390 へ接続する。

「プラグイン"電源管理プラグイン"は予期せずパネルから失われました。このプラグインを再起動しますか?」とのエラーが出た場合は「削除」でよいです。
15666 – Plugin "Power Manager Plugin" unexpectedly left the panel
『プラグインがコンテナ内で動作しないのは、dockerにupowerがないためであり、これはバグではなくdockerの制限である。』

追記

たまにxrdpがうまく起動しないことがある。原因捜索中。

# /etc/xrdp/sesman.ini の
killDisconnected=false
↓
killDisconnected=true
としておいた方がよいかも?
(every session will be killed within DisconnectedTimeLimit second after the user disconnects.)
(すべてのセッションは、ユーザーが切断してからDisconnectedTimeLimit秒以内に強制終了されます。)

以下は正常時のメモ

# netstat -epl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
tcp        0      0 127.0.0.11:33721        0.0.0.0:*               LISTEN      root       37752      -                   
tcp6       0      0 127.0.0.1:3350          [::]:*                  LISTEN      root       39744      101/xrdp-sesman     
tcp6       0      0 [::]:3390               [::]:*                  LISTEN      xrdp       45391      -                   
udp        0      0 127.0.0.11:53859        0.0.0.0:*                           root       37751      -                   
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path

メモ

日本語入力設定
Kali Linux - demandosigno → 「日本語入力用」

ユーザーでsudoを使えるようにする
sudo を使えるようにする - demandosigno

$ id kali

# visudo
~略~
# Allow members of group sudo to execute any command 
%sudo   ALL=(ALL:ALL) ALL
~略~

# usermod -a -G sudo kali

$ sudo -l

VS Code のインストール
Download Visual Studio Code - Mac, Linux, Windowsから".deb"フィアルをダウンロード。

$ sudo dpkg -i code_1.87.2-1709912201_amd64.deb # バージョン部分は適宜合わせる
$ dpkg --list code
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前           バージョン        アーキテクチ 説明
+++-==============-=================-============-=================================
ii  code           1.87.2-1709912201 amd64        Code editing. Redefined.

その他、Xdebugのインストールなど。
Debian 12 (bookworm) PHP8.2 Xdebug3.3 - demandosigno

次回:Dockerコンテナ間での通信を行えるようにする - demandosigno

/* -----codeの行番号----- */