#概要
CTFに興味を持ってTryHackMeとHackTheBoxのアカウントを作ったあと、OpenVPNに関するチュートリアルがあり、VMを推奨していたがせっかくなのでDockerでやってみようと思った。
つまずいた点が多々あったので備忘録としても記しておきます。
#対象
マシンスペックに不安がある人やVMの設定が面倒だなって人向け
#本題
Dockerはコンテナの作成廃棄を頻繁に行うべきという姿勢らしいのでDockerfileとdocker-compose.ymlを作成して管理を用意にします。
###最低限の構成
CTF御用達Kali-linuxを使います。
今回使うイメージはbooyaabes/kali-linux-full
FROM booyaabes/kali-linux-full
version: '3'
services:
kali-linux:
container_name: kali
build:
context: .
dockerfile: Dockerfile
volumes:
- ./test:/test
stdin_open: true
tty: true
この2つのファイルを同じディレクトリに配置しそこにtestディレクトリを作成しコンテナ内とファイル共有スペースを作成します。
TryHackMeのOpenVPN/Task1のページからMy Configuration Fileを取得し先ほど作成したtest内に入れておきます。
##躓いた点
一旦このままコンテナを立ち上げてコンテナ内に入りOpenVPNを使ってみます。
$ docker-compose up --build -d
$ docker exec -it コンテナID bash
$ cd test
$ sudo openvpn testにいれたファイル名
#エラーメッセージ
ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)
No such file or directoryとのことなのでみてみると確かにdev以降が存在していませんでした。
###解決策1
エラーメッセージを調べたところ以下のようなわかりやすい説明の記事を発見。
上記の指示に従って先程存在しないといわれた子たちを作ります。
$ mkdir /dev/net (まだ /dev/net が存在しない場合)
$ mknod /dev/net/tun c 10 200
しかしこんどはpermissionに関するエラーが発生。
ERROR: Cannot ioctl TUNSETIFF tun: Operation not permitted (errno=1)
###解決策2
最も簡単な方法としてdocker-compose.yml内でprivilegedをいじって特権を与えると成功するがセキュリティ面に問題が大きいらしい。
Dockerコンテナを特権モードで実行することが危険な理由
どうにか特権をいじらずにできないか模索していると海外ニキたちが以下のような質問をしていた。
Calling OpenConnect VPN client in docker container shows TUNSETIFF failed: Operation not permitted
要約すると特権の方でもできるけど--cap-add SYS_NET_ADMINでもいけるとのこと。
全権限を付与しているのでなく権限を限定している感じっぽい(詳しい人教えてください)
よってymlを以下のように変更。
version: '3'
services:
kali-linux:
container_name: kali
build:
context: .
dockerfile: Dockerfile
volumes:
- ./test:/test
stdin_open: true
tty: true
cap_add:
- NET_ADMIN
#SYS_NET_ADMINだとそんなんないよってエラーが出た
何度もmkdirするのもめんどくさいのでDockerfileも変更。
FROM booyaabes/kali-linux-full
RUN mkdir -p /dev/net && \
mknod /dev/net/tun c 10 200
余談ですがDockerfileのコマンドはそれぞれ1回しか呼び出さないようにするのが基本のようです。コンテナの作成廃棄の頻度の件も下記に紹介する本に記載されていました。ネットだけである程度の知識も集まるもののこういうよく使う技術に関する本は一冊持っておくと良さそう。
(自宅ではじめるDocker入門)[https://books.rakuten.co.jp/rb/15828738/]
#実行結果
コンテナ内でopenvpnをsudoで実行すると無事接続されました。
#余談(Parrot OS)
HachTheBoxの方ではKaliと共にParrotなるものが推奨されていました。
初めて聞いたので調べてみるとKaliのようにペネトレーションテストに特化したイタリア出身のLinuxディストリビューションらしいです。
日本記事が非常に少ないというデメリットはありながらもKaliより軽量でありKali VS Parrotなんて記事や動画も多く出回っており、その中のコメントや記事内ではParrotはKaliを超えているという意見がそこそこ多かったように思えました。
個人の好みはもちろんあるでしょうし一概にどっちが優れているかという話でなく、そこまでの力がありながら日本でシェアが低いのは割と謎なので先日購入したジャンクのThinkPadにParrotを実際にいれてみたので知識が深まればそれも記事にしたいと考えています。
(本記事の内容もParrotでDockerを立ち上げて動かしてます)
これに関しても詳しい人いたらツイッターとかにフォロー飛ばしていろいろ教えてください。