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

Dockerコンテナからホストのrootを取る話

6aca2cc1a76ef86ca0b778a76f853f8a?s=47 narupi
September 29, 2019

 Dockerコンテナからホストのrootを取る話

Vulnerable Docker VMを利用してDooD環境のコンテナからホストのrootを取る話。
モブセキュリティLT第一回(2019/09/29)で利用。

6aca2cc1a76ef86ca0b778a76f853f8a?s=128

narupi

September 29, 2019
Tweet

Transcript

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

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

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

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

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

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

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

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

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

    Unixソケット ホスト コンテナ DockerCLI Unixソケット
  10. コンテナからホストのrootを取る  dockerコマンドがホストで実行できる状況の場合、以下の手順でホストのrootを取ることができ る 1. コンテナ内にdockerをインストールする(意図的にdocker daemonを共有している場合はインス トールされているはず) 2. ホストのルートディレクトリをマウントしたコンテナを起動する(例:docker

    run –it –v /:/HOGE ubuntu:latest bash) 3. マウントしたディレクトリHOGEをルートディレクトリに変更する(chroot /HOGE)
  11. Dockerは安全?  基本的にはDockerを利用することでアプリケーションに脆弱性があった場合でも、影響範囲をコ ンテナ内に留める事ができる  マウントには気をつける必要がある(ホストへのアクセスを許容してしまうリスク)  不明なdocker imageは利用しない(悪意のあるスクリプトが埋め込まれているリスク) 

    Docker19.03から非rootユーザでもdockerd(デーモン)を実行できるようになった (Rootlessモード)
  12. 余談(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用途などで利用されるらしい)
  13. DinD  DinD対応イメージを利用してコンテナを作る  デフォルトの権限ではDockerデーモンを起動できないのでprivilegedオプションを利用する必要が ある(すべてのデバイスへのアクセスが可能になる)  暗黙的にData Volumeが利用されコンテナとホストのリソースを共有する 

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

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

  16. 参考  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