Slide 1

Slide 1 text

Vulnerable Docker VMで学ぶ 脆弱なコンテナ 2019/09/27 narupi(@ei1528)

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 目的 ● 攻撃側を知ることで防御力を高める術を知る ● セキュリティにおいて攻撃側が如何に有利かを知る ● セキュリティに興味関心を持つ

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

5 Vulnerable Docker VMについて ● NotSoSecureが提供しているVM ● ( https://www.notsosecure.com/vulnerable-docker-vm/ ) ● CTF形式

Slide 6

Slide 6 text

6 環境構築 ● VM(被害者端末)のネットワーク設定がデフォルトでブリッジなので念の 為ホストオンリーネットワークに変更する ● Kali(攻撃者端末)もVMと同じホストオンリーネットワークに指定する 今回のIP Kali : 192.168.56.100 Docker : 192.168.56.102

Slide 7

Slide 7 text

7 起動

Slide 8

Slide 8 text

8 対象調査 ● ポートスキャン(nmap)を実施して対象の環境を把握する ● (-sV:各ポートを利用しているサービスのバージョンを検出 ● -A :OSとバージョンを検出)

Slide 9

Slide 9 text

9 対象調査 ● 8000番ポートでApache2.4.10が動いている ● (詳細よりWordPress4.8.1が動いていてwp-adminが見える状態なのがわ かる)

Slide 10

Slide 10 text

10 入り口を探す ● サービス自体の脆弱性を突く ● (OpenSSH 6.6p1の脆弱性, Apache 2.4.10の脆弱性, WordPress4.8.1の 脆弱性 etc…) ● サービスの設定不備を突く ● (脆弱なアカウント, 脆弱なWordPressプラグイン, XSSの可能性,RCEの 可能性 etc...)

Slide 11

Slide 11 text

11 サービスの脆弱性を調査 ● Vulnerable Docker VMが配布されたのが2017年なので、当時の最新バ ージョンが動いていると考えられる(しっかりパッチを当てている環境だ とすると、0day exploit以外刺さらない) ● VMの意図と異なるのでこっちは利用しない

Slide 12

Slide 12 text

12 設定不備を調査 ● 脆弱性スキャンツールを利用 ● (OWASP ZAP, Burp Suite, Nikto, WPScan) ● 対象がWordPressなのでWPScanを試す

Slide 13

Slide 13 text

13 WPScanについて ● Rubyで動作するWordPressの脆弱性スキャナ ● WordPressにインストールされているテーマやプラグインの列挙 ● (脆弱性のあるものだけを列挙したりできる) ● ユーザ情報の列挙 ● ユーザ名を指定してブルートフォース攻撃

Slide 14

Slide 14 text

14 WPScanの実施 ● プラグイン/テーマの脆弱性については、VM公開時の状況がわからない ので切り捨てた(本来なら侵入経路に成り得る) ● ユーザ情報を列挙してみる ● wpscan --url http://192.168.56.102:8000 --disable-tls-checks -- enumerate u

Slide 15

Slide 15 text

15 パスワードを総当りしてみる ● ランダムな文字列を生成して総当りするのは時間がかかるので、辞書攻 撃を試す ● (辞書はseclistsの100k-most-used-passwords-NCSC.txtを利用) ● wpscan --url http://192.168.56.102:8000/ -P 100k-most-used-passwords- NCSC.txt -U bob

Slide 16

Slide 16 text

16 パスワードを総当りしてみる 少し待つとパスワードが特定できる

Slide 17

Slide 17 text

17 WebShellを設置する方法 ● WordPressのテーマを利用して設置 ->テーマページのphpを編集してWebShellを埋め込む(404.phpなど) ● WordPressにプラグインとして設置 ->オフラインならプラグインのアップロード オンラインならプラグインのインストール

Slide 18

Slide 18 text

18 WebShellとは ● Webを介して実行するShell ● 最も簡単なものはGETリクエストでコマンドを送信する形 → ● 高機能なものもある(今回はWeevelyを利用した) → Weevely https://github.com/epinna/weevely3

Slide 19

Slide 19 text

19 Weevelyについて ● 難読化したPHPWebShellを生成するためセキュリティソフトに検知さ れにくい ● Telnetのような形式の接続を提供してくれる

Slide 20

Slide 20 text

20 Weevelyが生成したWebShell

Slide 21

Slide 21 text

21 コンテナに侵入 ● .dockerenvが存在するかでコンテナ内であるかチェックする

Slide 22

Slide 22 text

22 コンテナ内でできること ● curlやwgetが使える場合 -> 任意のバイナリが実行できる(nmapなど) ● コンテナ間通信が許可されている場合 -> 他のコンテナの発見と侵入 ● サービスの破壊,データの取得

Slide 23

Slide 23 text

23 DBの確認(Adminer設置) ● PHPMyAdminのようなdb管理ツール(https://www.adminer.org/) ● シングルファイルで動作するのでWordPressのテーマを編集することで 設置可能 ● db認証情報はwp-configから抜き取れる

Slide 24

Slide 24 text

24 Adminer

Slide 25

Slide 25 text

25 他のコンテナを探す ● nmapバイナリをKali側のWeb鯖に置いて,VM側からcurlでダウンロード する ● Ip rでroute情報を表示 ● Nmapで同一ネットワークを調査する -> 172.18.0.1~4が利用されている -> 8022に不明なサービス (8000はWordPress)

Slide 26

Slide 26 text

26 コンテナ内部ネットワークへアクセスする ● 任意のPHPがアップロードできる状況にあるのでreGeorgを利用して SOCKSプロキシを構成する(https://github.com/sensepost/reGeorg) ● ProxychainsでreGeorgプロキシの情報を設定する ● FoxyProxyでreGeorgプロキシの情報を設定する

Slide 27

Slide 27 text

27 Docker-SSH ● 8022ポートのサービスをcurlで調査するとDocker-SSHが動いているこ とがわかる(https://github.com/jeroenpeeters/docker-ssh) ● FoxyProxyを介してブラウザからアクセスする

Slide 28

Slide 28 text

28 ホストへ侵入する方法を探す ● Docker-SSHコンテナへはパスワードなしでsshできるらしいので Proxychainsを利用してshellから作業をする(webだとセッションが切れ て大変だった) ● /run以下を見るとdocker.sockが見えている -> docker.sockはデーモンプロセスと通信するためのソケット -> docker.sockは特権で実行される(実質的にroot)

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

31 コンテナからホストのrootを取る ● ホストのdocker.sockをマウントしている場合、dockerコマンドはホス ト側で実行したものと同じ結果が得られる →コンテナ上でホスト側のルートディレクトリをマウントしたコンテナ を立ち上げる(DooD) →適当な名前でルートディレクトリをマウントしてchrootでルートディ レクトリをマウントしたフォルダに変える →実質的なホストrootの奪取

Slide 32

Slide 32 text

32 HACKED

Slide 33

Slide 33 text

33 VMの脆弱な点をまとめると ● WordPressのセキュリティ(コンテナへの侵入) ->wp-adminが見える, 脆弱なパスワードの運用 ● Docker-SSHの運用方法(ホストへの侵入) ->docker.sockへの書き込み権限がある

Slide 34

Slide 34 text

34 まとめ ● WordPressには気をつけよう ● Dockerは運用方法に気をつければ攻撃者がホストに到達するのを難しくで きる ● Docker imageはしっかり中身を理解して利用する ->Docker-SSHはdocker.sockをマウントする必要がある ->悪意のあるimageに気をつける(reverse shellが埋め込まれてたりする)

Slide 35

Slide 35 text

35 参考文献 ● 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