【CTF見習い①】Dockerを立ち上げたい<3章 問題環境の構築>

LinuxもWindows Serverも触ったことがない素人が、「詳解セキュリティコンテスト CTFで学ぶ脆弱性攻略の技術」を知識も環境もゼロからやっていくシリーズ。
これが1本目。

3章 問題環境の構築
 P18~ 「3.2 Dockerの利用」から。
 今日はDockerを立ち上げるところまで。

今日の問題点

コード3-5が一筋縄にいかない

$ docker build . -t myimage

コード3-5をUbuntuで実行したい。。。

対処した流れ

まずは実行

$ docker build . -t myimage
Command 'docker' not found, but can be installed with:
sudo apt install docker.io      # version 20.10.12-0ubuntu4, or
sudo apt install podman-docker  # version 3.4.4+ds1-1ubuntu1

なるほど、「docker」がインストールされてないらしい。

Dockerコマンドをインストール

$ curl -sSL https://get.docker.com/ | sh
# Executing docker install script, commit: 1d97565eca92bb523082b7d4f530c74104e05d35

WSL DETECTED: We recommend using Docker Desktop for Windows.
Please get Docker Desktop from https://www.docker.com/products/docker-desktop


You may press Ctrl+C now to abort this script.
+ sleep 20
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sudo -E sh -c mkdir -p /etc/apt/keyrings && chmod -R 0755 /etc/apt/keyrings
+ sudo -E sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
+ sudo -E sh -c chmod a+r /etc/apt/keyrings/docker.gpg
+ sudo -E sh -c echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable" > /etc/apt/sources.list.d/docker.list
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-scan-plugin >/dev/null
+ version_gte 20.10
+ [ -z  ]
+ return 0
+ sudo -E sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce-rootless-extras >/dev/null

================================================================================

To run Docker as a non-privileged user, consider setting up the
Docker daemon in rootless mode for your user:

    dockerd-rootless-setuptool.sh install

Visit https://docs.docker.com/go/rootless/ to learn about rootless mode.


To run the Docker daemon as a fully privileged service, but granting non-root
users access, refer to https://docs.docker.com/go/daemon-access/

WARNING: Access to the remote API on a privileged Docker daemon is equivalent
         to root access on the host. Refer to the 'Docker daemon attack surface'
         documentation for details: https://docs.docker.com/go/attack-surface/

================================================================================

インストールはできたけど、気になる文章が↓。

To run Docker as a non-privileged user, consider setting up the
Docker daemon in rootless mode for your user:
       dockerd-rootless-setuptool.sh install

でもとりあえず、気にせずコード3-5を再トライ。

$ docker build . -t myimage
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

まだDockerに接続できない。

dockerのstopとstartを試す

調べたら、dockerをstopさせて再スタートすればよいとの記事を見た。

$ sudo service docker stop
 * Docker already stopped - file /var/run/docker-ssd.pid not found.
$ sudo service docker start
 * Starting Docker: docker                                  [ OK ]

もう一度トライ

$ docker build . -t myimage
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=myimage&target=&ulimits=null&version=1": dial unix /var/run/docker.sock: connect: permission denied

これでもダメ。

iptablesの設定を変更【成功】

ログを見てみる。

$ sudo cat /var/log/docker.log >log.txt

最終行にこの文章があった。

failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain: (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1
(exit status 4))

理屈はわからないけど、この2つのコマンドを試すとよいらしい。

$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
$ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

もう一度Startさせてから、

$ sudo service docker start

再々再度、コード3-5をトライ

$ sudo docker build . -t myimage

Sending build context to Docker daemon  39.42kB
Step 1/2 : FROM alpine:latest
latest: Pulling from library/alpine
8921db27df28: Pull complete
Digest: sha256:f271e74b17ced29b915d351685fd4644785c6d1559dd1f2d4189a5e851ef753a
Status: Downloaded newer image for alpine:latest
---> 042a816809aa
Step 2/2 : COPY ./sample.txt /sample.txt
---> 6f716a69ee57
Successfully built 6f716a69ee57
Successfully tagged myimage:latest

ようやく、Dockerが立ち上がってくれたようだ。

コード3-6

$ docker run -p 8080:8080 -it myimage sh
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.

やっぱり、権限が足りないみたいなので、sudoで実行。

$ sudo docker run -p 8080:8080 -it myimage sh
/ #

できた。

素人感

ちなみに、素人が抜け出せなくて混乱している図。

/ # quit()
> ^C
/ # ^C
/ # quit
sh: quit: not found
/ # quit()
> qtuit()
> q
/ # q
sh: q: not found
/ # fin
sh: fin: not found
/ # ^C
/ # exit

exitで抜けられた。

謝辞


この記事が気に入ったらサポートをしてみませんか?