Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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