[TryHackMe]Docker+KaliでOpenVPN(+αでParrot OSに関して)

#概要
CTFに興味を持ってTryHackMeとHackTheBoxのアカウントを作ったあと、OpenVPNに関するチュートリアルがあり、VMを推奨していたがせっかくなのでDockerでやってみようと思った。
つまずいた点が多々あったので備忘録としても記しておきます。
#対象
マシンスペックに不安がある人やVMの設定が面倒だなって人向け

#本題
**Dockerはコンテナの作成廃棄を頻繁に行うべき**という姿勢らしいのでDockerfileとdocker-compose.ymlを作成して管理を用意にします。

###最低限の構成
CTF御用達Kali-linuxを使います。
今回使うイメージはbooyaabes/kali-linux-full

```dockerfile:Dockerfile
FROM booyaabes/kali-linux-full

```

```yml:docker-compose.yml
version: '3'
services:
  kali-linux:
    container_name: kali
    build:
     context: .
     dockerfile: Dockerfile
    volumes:
      - ./test:/test
    stdin_open: true
    tty: true


```
この２つのファイルを同じディレクトリに配置しそこにtestディレクトリを作成しコンテナ内とファイル共有スペースを作成します。
TryHackMeのOpenVPN/Task1のページからMy Configuration Fileを取得し先ほど作成したtest内に入れておきます。

![Screenshot at 2020-05-16 18-39-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501570/888d6e12-11f7-f687-6ee9-48b98b842d3a.png)

##躓いた点
一旦このままコンテナを立ち上げてコンテナ内に入りOpenVPNを使ってみます。

```bash
$ 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以降が存在していませんでした。

###解決策１
エラーメッセージを調べたところ以下のようなわかりやすい説明の記事を発見。

[ユニバーサル TUN/TAP デバイスドライバについて](http://archive.linux.or.jp/JF/JFdocs/kernel-docs-2.4/networking/tuntap.txt.html)

上記の指示に従って先程存在しないといわれた子たちを作ります。

```
$ mkdir /dev/net (まだ /dev/net が存在しない場合)
$ mknod /dev/net/tun c 10 200
```
しかしこんどはpermissionに関するエラーが発生。

```bash
ERROR: Cannot ioctl TUNSETIFF tun: Operation not permitted (errno=1)
```

###解決策２
最も簡単な方法としてdocker-compose.yml内でprivilegedをいじって特権を与えると成功するがセキュリティ面に問題が大きいらしい。
[Dockerコンテナを特権モードで実行することが危険な理由
](https://blog.trendmicro.co.jp/archives/23577)

どうにか特権をいじらずにできないか模索していると海外ニキたちが以下のような質問をしていた。
[Calling OpenConnect VPN client in docker container shows TUNSETIFF failed: Operation not permitted](https://stackoverflow.com/questions/30547484/calling-openconnect-vpn-client-in-docker-container-shows-tunsetiff-failed-opera)

要約すると特権の方でもできるけど--cap-add SYS_NET_ADMINでもいけるとのこと。
全権限を付与しているのでなく権限を限定している感じっぽい（詳しい人教えてください）

よってymlを以下のように変更。

```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も変更。

```dockerfile:Dockerfile
FROM booyaabes/kali-linux-full

RUN mkdir -p /dev/net && \
    mknod /dev/net/tun c 10 200

```


余談ですがDockerfileのコマンドはそれぞれ１回しか呼び出さないようにするのが基本のようです。コンテナの作成廃棄の頻度の件も下記に紹介する本に記載されていました。ネットだけである程度の知識も集まるもののこういうよく使う技術に関する本は一冊持っておくと良さそう。
(自宅ではじめるDocker入門)[https://books.rakuten.co.jp/rb/15828738/]

#実行結果
コンテナ内でopenvpnをsudoで実行すると無事接続されました。

![Screenshot at 2020-05-16 20-22-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501570/03cfd3f7-df4c-5ed2-8ce7-bd2361cd19e2.png)

#余談(Parrot OS)
HachTheBoxの方ではKaliと共にParrotなるものが推奨されていました。
初めて聞いたので調べてみるとKaliのようにペネトレーションテストに特化したイタリア出身のLinuxディストリビューションらしいです。

日本記事が非常に少ないというデメリットはありながらもKaliより軽量でありKali VS Parrotなんて記事や動画も多く出回っており、その中のコメントや記事内ではParrotはKaliを超えているという意見がそこそこ多かったように思えました。
個人の好みはもちろんあるでしょうし一概にどっちが優れているかという話でなく、そこまでの力がありながら日本でシェアが低いのは割と謎なので先日購入したジャンクのThinkPadにParrotを実際にいれてみたので知識が深まればそれも記事にしたいと考えています。
（本記事の内容もParrotでDockerを立ち上げて動かしてます）

これに関しても詳しい人いたらツイッターとかにフォロー飛ばしていろいろ教えてください。