【CTF見習い①】Dockerを立ち上げたい<3章 問題環境の構築>
LinuxもWindows Serverも触ったことがない素人が、「詳解セキュリティコンテスト CTFで学ぶ脆弱性攻略の技術」を知識も環境もゼロからやっていくシリーズ。
これが1本目。
3章 問題環境の構築
P18~ 「3.2 Dockerの利用」から。
今日はDockerを立ち上げるところまで。
今日の問題点
コード3-5が一筋縄にいかない
$ docker build . -t myimage
対処した流れ
まずは実行
$ 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で抜けられた。