Save 37% off PRO during our Black Friday Sale! »

Flag🚩のきもち ビギナー向けFlag獲得への足掛かり

F74146bada61d15a5e652919815bd355?s=47 Satoki
October 17, 2021

Flag🚩のきもち ビギナー向けFlag獲得への足掛かり

SECCON Beginners Live 2021 発表スライド

F74146bada61d15a5e652919815bd355?s=128

Satoki

October 17, 2021
Tweet

Transcript

  1. Flag🚩のきもち ~ビギナー向けFlag獲得への足掛かり~ 14:00-14:30

  2. 1 自己紹介 Satoki satoki, satoki00 名大情報学研究科1年 CTF歴1.5年? すこしセキュリティのお仕事 将来の夢は養われること 2021年度作問

    Misc:depixelization, fly, writeme Web:cant_use_db, check_url
  3. 2 お話について(1/2) 対象はBeginner, Easy, Mediumを解くのに苦労する方 Hardが解けるようなPro向けではありません 難易度 Hard Beginner Medium

    Easy 対象
  4. 3 お話について(2/2) Web(+Misc)の見通しの立て方や脆弱性選択について話します 難易度やジャンルにより通用しない場合があります CTFジャンル ・welcome … 様々な場所からFlagを探す ・crypto ・reversing

    ・pwnable ・web … Webアプリケーションの脆弱性を用いる ・misc … セキュリティ+謎解き(など) …
  5. 4 CTFの大切なこと(1/3) Q. Flag獲得のために大切なことは?

  6. 5 CTFの大切なこと(2/3) 脆弱性についての 知識 攻撃手法を閃く 知能 最後まで諦めない 忍耐力 緑の缶川 すべて大切だが…

    川
  7. 6 CTFの大切なこと(3/3) Flagの場所🚩 大切なのは

  8. 7 よく見る失敗?(1/3) SQLインジェクションによってFlagを獲得する問題 正解はもちろんデータベースの中だが… 競技者 DB Webフロント <svg/onload=alert(1)> XSSだ!! 1

    🚩
  9. 8 よく見る失敗?(2/3) SQLインジェクションによってFlagを獲得する問題 正解はもちろんデータベースの中だが… そこに私はいません 🚩

  10. 9 よく見る失敗?(3/3) SQLインジェクションによってFlagを獲得する問題 正解はもちろんデータベースの中だが… Webフロント Flagの場所は Webフロントではない? SQLiか!! 競技者 t'

    OR 't' = 't DB 🚩
  11. 10 Flag獲得までの道(1/4) 場所がわかっても攻撃に用いる脆弱性が分からない 脆弱性は大量にありそうに見える XSS SQLi CSSi SSRF CSRF XXE

    SSTI XSS XSS XSS XSS CSRF CSRF CSSi SQLi SSRF SSTI XXE SSTI
  12. 11 Flag獲得までの道(2/4) すべて試す必要があるのか? 脆弱性すべてを試すのはリソース的に厳しい SSTI CSRF SSRF XXE SQLi XSS

    🚩 🚩 🚩 🚩 🚩 🚩
  13. 12 Flag獲得までの道(3/4) Flagの場所から脆弱性を絞ることができる ブラックボックスでも場所は分かる場合が多い 12 SSTI CSRF SSRF XXE SQLi

    XSS 🚩 🚩 🚩 🚩 🚩 🚩
  14. 13 Flag獲得までの道(4/4) Flagの場所から逆算することができる 知識が少ない場合でも集中的に調査できる SSTI CSRF SSRF XXE SQLi XSS

    13 🚩 🚩 🚩 🚩 🚩 🚩
  15. 14 脆弱性の選択(1/6) Flagの場所から脆弱性を絞る場合の例 どうしても解けない場合は見落としがあるかも 14 ・Flagはクローラにある ・Flagはデータベースにある ・Flagはサーバのファイルにある 🚩 Admin

    🚩 🚩 全てに使える銀の脆弱性はない
  16. 15 脆弱性の選択(2/6) Flagの場所から脆弱性を絞る場合の例 どうしても解けない場合は見落としがあるかも 15 ・Flagはクローラにある 問題のWebフロントやソースコードを見る → AdminにURLを教えるようなページやボタンの実装がある XSSなどクローラを対象とした脆弱性を用いる

    クローラの挙動によってさらにポイントを絞っていく [例外]難易度設定がおかしい場合はChromiumの1dayを使う場合も… Admin 🚩
  17. 16 脆弱性の選択(3/6) Flagの場所から脆弱性を絞る場合の例 どうしても解けない場合は見落としがあるかも 16 ・Flagはデータベースにある 問題のWebフロントやソースコードを見る → データベースを操作していそうな実装がある or

    データベースに関連しそうなエラーが不正な入力で起こる SQLiなどデータベースを対象とした脆弱性を用いる ログインすればよいのか、データを取得するのか目的を絞っていく 🚩
  18. 17 脆弱性の選択(4/6) Flagの場所から脆弱性を絞る場合の例 どうしても解けない場合は見落としがあるかも 17 ・Flagはサーバのファイルにある 問題のソースコードや使用しているソフトウェア情報を見る → ファイルを読み書き実行している箇所がある or

    ソフトウェア固有機能や古いバージョンが動作している SSTI, XXEなどファイルなどを対象とした脆弱性を用いる ファイルを読み取るのかコードを実行するのか手法を絞っていく 🚩
  19. 18 脆弱性の選択(5/6) Flagの場所から脆弱性を逆算する場合の例 狙いどころが分かれば深掘り検索できる 18 どこにあるのか クローラのCookie どうすればとれるのか JavaScriptの実行 なにができるのか

    scriptタグの挿入 問題を深堀りする → 知識がつく 例えばFlagはクローラにある… 🚩 問題 CSPによる制限
  20. なにができるのか JavaScriptの実行 19 脆弱性の選択(6/6) Flagの場所から脆弱性を逆算しなくなる 問題名, 問題構成, ソースを見たら一瞬で解法がわかる人へ 19 どこにあるのか

    クローラのCookie Flagまで駆け上がっていける 例えばFlagはクローラにある… 問題ではない CSPバイパス 🚩
  21. 20 まとめ(1/1) 🚩の気持ちを理解する ・Flagの場所は重要な情報 ・Flagの場所から脆弱性の分野を絞る ・Flagの場所から脆弱性を導き出す 20

  22. 21 実際に試す(1/1) 実際のCTF問題に通用するのか? SECCON Beginners CTF 2021の問題で試してみよう! 21 GitHub https://github.com/SECCON/Beginners_CTF_2021

    ・check_url [Web, Easy, 232solve] /web/check_url ・writeme [Misc, Medium, 5solve] /misc/writeme ※技術的詳細はWriteUpで! https://github.com/satoki/ctf4b_2021_satoki_writeups
  23. 22 check_url [Web, Easy] (1/7) 22 curlが実行できるサイト URLとソースコードが 渡されている

  24. 23 check_url [Web, Easy] (2/7) 23 🚩の場所は? ソースコードを確認すると… <?php error_reporting(0);

    if ($_SERVER["REMOTE_ADDR"] === "127.0.0.1"){ echo "Hi, Admin or SSSSRFer<br>"; echo "********************FLAG********************"; }else{ echo "Here, take this<br>"; 文字列としてプログラムに記述されている
  25. 24 check_url [Web, Easy] (3/7) 24 🚩の場所は? 文字列としてプログラムに記述されている ファイルを読み取る箇所は見つからない 脆弱性を絞ると…

    ・サーバに侵入し、ソースファイルを読み取る =PHPコードやApacheの脆弱性を使用する → 非常に難しい(Easyではない) ・プログラムのFlagを表示している部分を使用する =$_SERVER["REMOTE_ADDR"] === "127.0.0.1"を通過する → SSRFで達成できそう!
  26. 25 check_url [Web, Easy] (4/7) 25 SSRFでFlagを表示する方針 自分自身をcurlすれば良さそうだが問題がある… $url =

    $_GET["url"]; if ($url !== "https://www.example.com"){ $url = preg_replace("/[^a-zA-Z0-9¥/:]+/u", "👻", $url); //Super sanitizing } if(stripos($url,"localhost") !== false || stripos($url,"apache") !== false){ die("do not hack me!"); } 問題:Super sanitizingでa-zA-Z0-9/:以外が👻になる
  27. 26 check_url [Web, Easy] (5/7) 26 問題を解決するための調査 a-zA-Z0-9/:以外で自分自身のアドレスを指定する 127.0.0.1(localhost)を一番面白く表記できた奴が優勝 -

    Qiita https://qiita.com/naka_kyon/items/88478be20b300e757fc0
  28. 27 check_url [Web, Easy] (6/7) 27 SSRFに絞ってテクニックを調査してもよい GitHub - swisskyrepo/PayloadsAllTheThings

    https://github.com/swisskyrepo/PayloadsAllTheThings
  29. 28 check_url [Web, Easy] (7/7) 28 28 28 http://0x7F000001 が利用できそう…

    Flagゲット!!
  30. 29 writeme [Misc, Medium] (1/10) 29 $ nc writeme.quals.beginners.seccon.jp 27182

    Chance: flag Traceback (most recent call last): File "/home/ctf/writeme/./writeme.py", line 8, in <module> print(eval(input("Chance: ")[:5])) # 42=99 :) File "<string>", line 1, in <module> NameError: name 'flag' is not defined $ nc writeme.quals.beginners.seccon.jp 27182 Chance: 1+2 3 File: /etc/passwd Error よくわからないパズル Dockerfileとソースコードが渡されている ※writeme.quals.beginners.seccon.jpは現在利用不可
  31. 30 writeme [Misc, Medium] (2/10) 30 🚩の場所は? Dockerfileを確認すると… flagという名前でファイルに格納されている ADD

    writeme.py /home/ctf/writeme/writeme.py ADD flag /home/ctf/writeme/flag RUN chmod 500 /home/ctf/writeme/writeme.py RUN chmod 400 /home/ctf/writeme/flag RUN chown ctf:root /home/ctf -R USER ctf WORKDIR /home/ctf/writeme/ CMD socat TCP-L:27182,fork,reuseaddr EXEC:"python3 ./writeme.py",stderr
  32. 31 writeme [Misc, Medium] (3/10) 31 🚩の場所は? flagという名前でファイルに格納されている 脆弱性を絞ると… ・サーバに侵入し、ファイルを読み取る

    =Nginxの脆弱性などを使用する → 非常に難しい(Mediumではない) ・ Pythonコードの脆弱性を使用する =ソースコードを解析する → ユーザ入力の処理やファイル読み取りがねらい所!
  33. 32 writeme [Misc, Medium] (4/10) 32 処理1. Chanceという入力を受け取り、5文字だけ実行する 処理2. Fileという入力を受け取り、指定されたサーバ内のファイルの

    好きな場所に文字列”Hack”を書き込む ※ただし、ファイル名にflagは使用できない 処理3. 書き込んだファイルを開く Pythonコードの脆弱性を使用する方針 ソースコードを確認すると…
  34. 33 writeme [Misc, Medium] (5/10) 33 Pythonコードの脆弱性を使用する方針 ソースコードを確認すると… 42 >=

    99であればflagを表示する機能がある flagを開くことは不可能に見える if 42 >= 99: print(open("flag").readline()) # Congrats! else: print(fd.readline())
  35. 34 writeme [Misc, Medium] (6/10) 34 flagファイルを表示したいが複数の問題がある 不自然な点もいくつかある 不自然な点(Mediumな部分): 謎のChanceがある

    →5文字なのでid()くらいでは? 謎のコメント# Congrats!がある →想定解では? 問題:ファイル名にflagが指定できない 問題:42>=99が正しいわけがない
  36. 35 writeme [Misc, Medium] (7/10) 35 問題:ファイル名にflagが指定できない 問題を解決するための調査 Pythonの文字列比較をバイパスする 無理です。(たぶん)

    🚩
  37. 36 writeme [Misc, Medium] (8/10) 36 問題を解決するための調査 idについて調べるとメモリをいじる方向へ… Pythonのid関数は一体何を指しているのか?|teratail https://teratail.com/questions/192616

  38. 37 writeme [Misc, Medium] (9/10) 37 問題を解決するための調査 もうこれ答えでは…汗(みんな大好き42)

  39. 38 writeme [Misc, Medium] (10/10) 38 id(1)や/proc/self/memが利用できそう $ nc writeme.quals.beginners.seccon.jp

    27182 Chance: id(1) 140233555966256 File: /proc/self/mem Seek: 140233555967592 ctf4b{r36ul4r_3xpr35510n_f0r_4ny_51n6l3_ch4r4c73r} id(1)の結果 + 41*32 + 24で定数が書き換えられる Flagゲット!!
  40. 39 39 技術的な解説不足 論理の飛躍 🙇 時間の関係上 謝罪(1/10000000000)

  41. 40 40 Flag🚩の場所から解法を見つける流れ 持ち帰ってほしいもの(1/1)

  42. 41 41 最後に みんなで CTFを楽しみましょう! 🚩 ばいばい~