Slide 1

Slide 1 text

Dockerコンテナからホストの rootを取る話 2019/09/29 narupi(@ei1528)

Slide 2

Slide 2 text

自己紹介  narupi  Twitter : @ei1528  CTFをしている(Forensicが好き)

Slide 3

Slide 3 text

動機  最近Dockerにムカついたので破壊したくなった

Slide 4

Slide 4 text

注意事項  ここで得た技術得た知識/技術の悪用厳禁  検証は自己責任  管理下以外のサーバ/アプリケーションに対して攻撃を行わない  初心者なので内容に間違いがある場合がある

Slide 5

Slide 5 text

検証環境  NotSoSecureが提供しているVulnerable Docker VM を利用 (https://www.notsosecure.com/vulnerable-docker-vm/ )  CTF形式

Slide 6

Slide 6 text

コンテナに侵入する  入り口はWordPress  WordPressが動いているコンテナには簡単に侵入できる

Slide 7

Slide 7 text

コンテナ間を移動する  nmapを利用してコンテナが利用しているIP帯に対してスキャンを行う  他のコンテナに侵入するとdocker.sockが見える (コンテナで実行しているサービスについて調べると、起動時にマウントする必要があるらしい)

Slide 8

Slide 8 text

docker.sockについて  UNIXドメインソケット(プロセス間でデータを通信するためのもの)  マウントしたdocker.sockに書き込み権限が与えられているとまずい  dockerのvolumeマウントはデフォルトでread write権限となる(オプションで:roをつけることで read onlyになる) DockerCLI DockerEngine API Docker Daemon Unixソケット

Slide 9

Slide 9 text

docker.sockがマウントされていると  コンテナ内からホストのDockerDaemonにアクセスできる  つまりコンテナ内で実行したDockerコマンドはホスト側で実行される DockerCLI DockerEngine API Docker Daemon Unixソケット ホスト コンテナ DockerCLI Unixソケット

Slide 10

Slide 10 text

コンテナからホストのrootを取る  dockerコマンドがホストで実行できる状況の場合、以下の手順でホストのrootを取ることができ る 1. コンテナ内にdockerをインストールする(意図的にdocker daemonを共有している場合はインス トールされているはず) 2. ホストのルートディレクトリをマウントしたコンテナを起動する(例:docker run –it –v /:/HOGE ubuntu:latest bash) 3. マウントしたディレクトリHOGEをルートディレクトリに変更する(chroot /HOGE)

Slide 11

Slide 11 text

Dockerは安全?  基本的にはDockerを利用することでアプリケーションに脆弱性があった場合でも、影響範囲をコ ンテナ内に留める事ができる  マウントには気をつける必要がある(ホストへのアクセスを許容してしまうリスク)  不明なdocker imageは利用しない(悪意のあるスクリプトが埋め込まれているリスク)  Docker19.03から非rootユーザでもdockerd(デーモン)を実行できるようになった (Rootlessモード)

Slide 12

Slide 12 text

余談(DinDとDooD)  コンテナ内からコンテナを操作する方法として、Docker in Docker(DinD)とDocker outside of Docker(DooD)がある  DinDはDocker本体の開発を効率化されるために生み出された手法らしい (http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/)  DooDはDockerの管理をコンテナから行えるようにする手法らしい (CI用途などで利用されるらしい)

Slide 13

Slide 13 text

DinD  DinD対応イメージを利用してコンテナを作る  デフォルトの権限ではDockerデーモンを起動できないのでprivilegedオプションを利用する必要が ある(すべてのデバイスへのアクセスが可能になる)  暗黙的にData Volumeが利用されコンテナとホストのリソースを共有する  ホストとコンテナが階層化されるのでお互いに見えない

Slide 14

Slide 14 text

DooD  ホストのDocker.sockをマウントすることでDockerデーモンを共有する  ホスト側のDockerをコンテナ側から実行する  コンテナからホスト側が見える  DinDのようにゴミが溜まることはない

Slide 15

Slide 15 text

まとめ  そもそもコンテナに侵入されないようにしよう  ボリュームのマウントには気をつけよう

Slide 16

Slide 16 text

参考  https://oioki.me/2017/09/vulnerable-docker-vm/  https://darksh3ll.info/index.php/18-write-up-vulnerable-docker-vm-by-notsosecure-com  https://rimuru.lunanet.gr.jp/notes/post/how-to-root-from-inside-container/  https://www.lvh.io/posts/dont-expose-the-docker-socket-not-even-to-a-container.html  https://qiita.com/sugiyasu-qr/items/85a1bedb6458d4573407  https://blog.nijohando.jp/post/docker-in-docker-docker-outside-of-docker/  https://qiita.com/toto1310/items/64d7db407d31fd802f9c