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

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

narupi
September 29, 2019

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

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

narupi

September 29, 2019
Tweet

More Decks by narupi

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. コンテナからホストのrootを取る
     dockerコマンドがホストで実行できる状況の場合、以下の手順でホストのrootを取ることができ

    1. コンテナ内にdockerをインストールする(意図的にdocker daemonを共有している場合はインス
    トールされているはず)
    2. ホストのルートディレクトリをマウントしたコンテナを起動する(例:docker run –it –v /:/HOGE
    ubuntu:latest bash)
    3. マウントしたディレクトリHOGEをルートディレクトリに変更する(chroot /HOGE)

    View Slide

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

    View Slide

  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用途などで利用されるらしい)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide