DockerコンテナでVNC接続可能なKali Linuxを作る
Apple M1チップの登場はGPU界隈では結構好意的というか、nvidiaだけでない選択肢の可能性を見せてくれていて、最近だとローカルLLMとかすんなり動かせていて面白いのだけど、VirtualBox使っていた勢については結構深刻な仮想マシン環境不足を招いてしまっていて、未だ正式対応できてない。ってかダウンロードページにも無くなってない?前はDeveloper preview for macOS / Arm64 (M1/M2) hostsとかって置いてなかったっけ。
ない・・・よね?(23/11/10現在)。まあ仕方ないどっちみち使えないんじゃね。UTMとか他に動かす方法とかもありますが、とりあえず私はコンテナ使いだという自負の元、VMにできてコンテナにできないことは無い!たぶん!きっと!っという消極的確信を持って、Dockerでデスクトップ環境まで含んで動かせるようにしてみたいと思います。
・環境
本体:16インチMacBook Pro 2023
チップ:Apple M2 Max
メモリ:64GB
OS:MacOS Ventura 13.4
※コンテナのアーキテクチャの違いはとりあえず無視してますがこれで動けばx86でも多分動くでしょう
・docker準備
とりあえずdockerは使えるようにしとかなきゃということでDocker Desktopをインストール。でもなんかDocker Desktopって、楽でいいんだけど重いしなんか本体まで熱くなったりであんま好きじゃ無いので、できればLinuxみたいにEngineだけ入れてコマンドで操作しときたい。LXDでもいいんだけど。できるのかな。今度調べてみよう。
・コンテナ版Kali linux準備
コンテナイメージは以下から。
Docker HUB上を探すと、Apple Sillicon用って銘打ってるのも見つかるのでそれ使ってもいいんですが、まあせっかくなので公式からビルドしていろいろ理解していこうということで、kalilinux/kali-rollingを使います。最小限のものしか入ってないやつ。
% docker run -it -d --name kali-base kalilinux/kali-rolling
Unable to find image 'kalilinux/kali-rolling:latest' locally
latest: Pulling from kalilinux/kali-rolling
94dee4b16755: Pull complete
Digest: sha256:57f424ce4142c59f9410021dda53d8f47e22cf17b9e67f45ff31c2afbadf2f5e
Status: Downloaded newer image for kalilinux/kali-rolling:latest
d122db9f7502a67d9c9aa5182fb39448509b6a920de4bf3c2765f26c97c26c6b
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d122db9f7502 kalilinux/kali-rolling "bash" 17 seconds ago Up 16 seconds kali-base
イメージ無いのでダウンロードされてきて起動されました。とりあえずこれをベースにしてGUI操作可能な環境を作りたいので、"kali-base"って名前にしましたが、そこは任意で。
次はコンテナ内で、いろいろ必要なものを入れていきます。
% docker exec -it kali-base bash
┌──(root㉿d122db9f7502)-[/]
└─# apt update -y && apt upgrade -y
既にあのkali linux特有のシェル表示が出ててちょっと面白いですが、とりあえずアップデートとコアまわりのインストール。あとdefaultってのはデスクトップに含まれてる?って書いてる気がするけど一応入れとこう。あとarmってのもあるのでこれも・・・。
┌──(root㉿d122db9f7502)-[/]
└─# apt install -y kali-linux-core kali-linux-default kali-linux-arm
あ、なんかkali-tweaksってコマンド打って使うとこんな感じで選択してツールとかもインストールできるみたいだ!dockerfileじゃ難しいだろうけど1から手作業で作る際はいいかも。
とりあえず全部ぶっこんでやれ!ってチェックしてみたら
0 upgraded, 1903 newly installed, 1 to remove and 0 not upgraded.
Need to get 7234 MB of archives.
After this operation, 17.7 GB of additional disk space will be used.
Do you want to continue? [Y/n]
おお・・・・な、なかなかの容量。まあ今回は全部やってみようがコンセプトなので、いれちゃえ。
┏━(Message from Kali developers)
┃ For more information about Kali's metapackages, please refer to:
┃ https://www.kali.org/docs/general-use/metapackages/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
> Press Enter to continue...
途中いろいろ入力必要なものは状況に合わせて適当に。
しばらくするとこんな感じで終わりました。
┏━(Message from Kali developers)
┃ For more information about Kali's metapackages, please refer to:
┃ https://www.kali.org/docs/general-use/metapackages/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
> Press Enter to continue...
・デスクトップ環境の準備
ここはコンテナ環境でやる場合は結構重要じゃ無いでしょうか。GUIいらないよってんならともかく、まああったほうがいいし今回はVMの代わりに使えるようにっていうコンセプトでもあるので、インストール。
┌──(root㉿d122db9f7502)-[/]
└─# apt install -y kali-desktop-xfce x11vnc xvfb novnc dbus-x11
・ユーザー作成
┌──(root㉿d122db9f7502)-[/]
└─# adduser kali
info: Adding user `kali' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `kali' (1000) ...
info: Adding new user `kali' (1000) with group `kali (1000)' ...
info: Creating home directory `/home/kali' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for kali
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
info: Adding new user `kali' to supplemental / extra groups `users' ...
info: Adding user `kali' to group `users' ...
・イメージコミット
┌──(root㉿d122db9f7502)-[/]
└─# exit
exit
% docker commit kali-base kali-desktop-xfce
Error response from daemon: write /usr/lib/git-core/git-sh-i18n--envsubst: no space left on device
あれ?エラー?no space??
あ、そっかmac自体のストレージが潤沢でも、docker desktop自体の設定があったはず。ということで変更
あーぶない。base作成時に--rmしてなくてよかった。設定変更で一度docker desktop再起動がかかるので、容量確保は先にやっておくべきだった。反省。docker startで再開させます。
% docker start kali-base
kali-base
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d122db9f7502 kalilinux/kali-rolling "bash" 3 hours ago Up 1 second kali-base
で、もう一度コミット。イメージサイズは・・・
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kali-desktop-xfce latest 1bbded07c96d 4 minutes ago 27.8GB
kalilinux/kali-rolling latest 20b3a290e554 6 days ago 140MB
おひょーー!約28GB!すっご。こんなんコンテナである意味は・・・?と言いたくなってきますが、まあ全部ぶっ込んだ結果なので通常は必要なものだけ選んでやっとけばいいのでしょう。
・コンテナ起動
とりあえずコンテナ起動させてみます。nameやportは任意で。
docker run -d -it --name kalivnc -p 5999:5901 -p 8888:8081 kali-desktop-xfce
docker exec -it kalivnc bash
┌──(root㉿2c186adf0a05)-[/]
└─#
ちゃんとkaliのプロンプトが表示されました。さて本来であれば、下記の感じでデスクトップ関連のものを起動させてVNC接続、といきたかったのですが・・・
※コンテナ内
export DISPLAY=:1
Xvfb :1 -screen 0 1280x720x24 &
startxfce4 & x11vnc -display :1 -xkb -forever -shared -repeat -listen 0.0.0.0 -nopw -reopen &
/usr/share/novnc/utils/launch.sh --listen 8081 --vnc localhost:5900
なんか、うまくいきませんでした。パスワード認証のとこでずっと待機中みたいになっちゃったのでvncpasswdとかでパスワードやってみたり、kaliユーザーで改めてやってみたりしたけどもだめで、うーん。仕方ないのでとりあえずですがtigervncを使ったらどうだろうという思いつきで以下トライ。
・TigerVNCのインストールと起動
ここからはとりあえずの暫定措置としてやってみてるだけなので、改めてまたうまくいかなかった原因とか調べよう。とりあえず時間かけてインストールしたので、できるよねってことだけは確認したかったのです。
※コンテナ内(プロンプト付きで表示)
┌──(root㉿2c186adf0a05)-[/]
└─# apt install tigervnc-standalone-server -y
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
finger gettext-base libintl-perl libintl-xs-perl libmodule-find-perl libmodule-scandeps-perl libproc-processtable-perl libsort-naturally-perl python3-aioredis python3-apscheduler python3-hiredis python3-pyexploitdb python3-pyshodan
python3-quamash python3-tzlocal rwho rwhod sparta-scripts
Use 'apt autoremove' to remove them.
The following additional packages will be installed:
libfile-readbackwards-perl tigervnc-common tigervnc-tools
The following NEW packages will be installed:
libfile-readbackwards-perl tigervnc-common tigervnc-standalone-server tigervnc-tools
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 1054 kB of archives.
After this operation, 3310 kB of additional disk space will be used.
Get:1 http://ftp.jaist.ac.jp/pub/Linux/kali kali-rolling/main arm64 libfile-readbackwards-perl all 1.06-2 [11.6 kB]
Get:2 http://http.kali.org/kali kali-rolling/main arm64 tigervnc-common arm64 1.12.0+dfsg-8 [94.2 kB]
Get:4 http://http.kali.org/kali kali-rolling/main arm64 tigervnc-tools arm64 1.12.0+dfsg-8 [21.2 kB]
Get:3 http://http.kali.org/kali kali-rolling/main arm64 tigervnc-standalone-server arm64 1.12.0+dfsg-8 [927 kB]
Fetched 1054 kB in 1s (784 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libfile-readbackwards-perl.
(Reading database ... 603896 files and directories currently installed.)
Preparing to unpack .../libfile-readbackwards-perl_1.06-2_all.deb ...
Unpacking libfile-readbackwards-perl (1.06-2) ...
Selecting previously unselected package tigervnc-common.
Preparing to unpack .../tigervnc-common_1.12.0+dfsg-8_arm64.deb ...
Unpacking tigervnc-common (1.12.0+dfsg-8) ...
Selecting previously unselected package tigervnc-standalone-server.
Preparing to unpack .../tigervnc-standalone-server_1.12.0+dfsg-8_arm64.deb ...
Unpacking tigervnc-standalone-server (1.12.0+dfsg-8) ...
Selecting previously unselected package tigervnc-tools.
Preparing to unpack .../tigervnc-tools_1.12.0+dfsg-8_arm64.deb ...
Unpacking tigervnc-tools (1.12.0+dfsg-8) ...
Setting up tigervnc-tools (1.12.0+dfsg-8) ...
update-alternatives: using /usr/bin/tigervncpasswd to provide /usr/bin/vncpasswd (vncpasswd) in auto mode
Setting up libfile-readbackwards-perl (1.06-2) ...
Setting up tigervnc-common (1.12.0+dfsg-8) ...
update-alternatives: using /usr/bin/tigervncconfig to provide /usr/bin/vncconfig (vncconfig) in auto mode
Setting up tigervnc-standalone-server (1.12.0+dfsg-8) ...
update-alternatives: using /usr/bin/tigervncserver to provide /usr/bin/vncserver (vncserver) in auto mode
update-alternatives: using /usr/bin/Xtigervnc to provide /usr/bin/Xvnc (Xvnc) in auto mode
update-alternatives: using /usr/sbin/tigervncsession to provide /usr/sbin/vncsession (vncsession) in auto mode
Processing triggers for man-db (2.11.2-3) ...
Processing triggers for kali-menu (2023.4.5) ...
┌──(root㉿2c186adf0a05)-[/]
└─# vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
┌──(root㉿2c186adf0a05)-[/]
└─# vncserver -localhost no
/usr/bin/xauth: file /root/.Xauthority does not exist
New Xtigervnc server '2c186adf0a05:1 (root)' on port 5901 for display :1.
Use xtigervncviewer -SecurityTypes VncAuth,TLSVnc -passwd /tmp/tigervnc.zZIv9X/passwd 2c186adf0a05:1 to connect to the VNC server.
┌──(root㉿2c186adf0a05)-[/]
└─# vncserver -list
TigerVNC server sessions:
X DISPLAY # RFB PORT # RFB UNIX PATH PROCESS ID # SERVER
1 5901 156 Xtigervnc
起動したみたいなので、接続してみます。macからはFinderの移動→サーバへ接続からvnc://localhost:5999に接続しました。この辺は環境に併せて適切に。
・VNC接続
パスワード聞かれて入力、すんなり接続できました。
TigerVNCだとすんなりいったので、ちょっともやもやしてますが目的としては達成できそうなので、まずはこれで20個ぐらい同時に動かして動作確認とかして問題ないかみてみようかと思います。VNC周りとかnoVNCとかのところはもうちょっと精査して改めてちゃんとやってみよう。
ちなみに画像のnmapは一緒に立ち上げたmetasploitable2のコンテナに対してのnmap実行ですが、kaliのコンテナと同時に3つほどのコンテナを動かすのを1グループとして、同時に40グループぐらい動かしたいと思ってますので、mac studio(M1 Ultra)を使った方が良いかもと思ってます。メモリ食いそうですし。やってみてまたnote書いてみよう。