SECCON Beginners CTF 2022 Writeup

最終更新日:

2022/06/04 ~ 2022/06/05まで開催されたSECCON Beginners CTF 2022のwriteup。
チーム DCDC で出場した。  

  • チーム得点:2108pt
  • チーム順位:14位 / 891チーム

人数制限がないCTF?だったため、DCDCで動けるメンバーが多数動員され、ライブ感のある楽しいCTFだった。
DCDCメンバーからはSECCON4b作問者メンバーがおり、すごいチームだなあと感じる。
以下、私の解いた問題のWriteup。

web

以下の画像のようにFlag自体はすぐ見つかる。

しかし、ファイルを開いても?????????...[snip]と表示され、マトモにPDFを見ることができない。

ソースコードを確認すると、レスポンスのサイズにサイズ制限がかけられており、これが悪さしていると考えた。

HTTPのリクエストには範囲リクエストというものがあり、サーバー側が対応していればコンテンツを分割要求することができる。 今回はそれを利用することで攻略した。 https://developer.mozilla.org/ja/docs/Web/HTTP/Range_requests

curl https://gallery.quals.beginners.seccon.jp/images/flag_7a96139e-71a2-4381-bf31-adf37df94c04.pdf -i -H "Range: bytes=0-10000" -o 1.pdf_chunk
curl https://gallery.quals.beginners.seccon.jp/images/flag_7a96139e-71a2-4381-bf31-adf37df94c04.pdf -i -H "Range: bytes=10001-20000" -o 2.pdf_chunk
curl https://gallery.quals.beginners.seccon.jp/images/flag_7a96139e-71a2-4381-bf31-adf37df94c04.pdf -i -H "Range: bytes=20001-30000" -o 3.pdf_chunk
curl https://gallery.quals.beginners.seccon.jp/images/flag_7a96139e-71a2-4381-bf31-adf37df94c04.pdf -i -H "Range: bytes=30001-40000" -o 4.pdf_chunk
curl https://gallery.quals.beginners.seccon.jp/images/flag_7a96139e-71a2-4381-bf31-adf37df94c04.pdf -i -H "Range: bytes=40001-50000" -o 5.pdf_chunk
cat *.pdf_chunk > out.pdf

PDF内部にコピーできる白文字でフラグが記載されている。

ctf4b{r4nge_reque5t_1s_u5efu1!}

misc

phisher (70pt)

ホモグリフ攻撃を行い、フラグを得る問題。
サーバーに送った文字列を画像にしてOCRに読み込ませている。

https://www.irongeek.com/homoglyph-attack-generator.php
https://fonts.google.com/specimen/Murecho?subset=japanese&sort=date#glyphs

を参考にwww.example.comというアルファベットを使わずに、OCRにwww.example.comという読み込み結果を出力できるような文字列を検証した。

ωωω․ėхаⅿрⅼė․сοм

という文字列を使ったらうまくいった。

ctf4b{n16h7_ph15h1n6_15_600d}

H2 (69pt)

pcapファイルからフラグを探す。 ポイントとしては以下になる。

  • キャプチャの中身はHTTP/2の通信
  • フラグのあるパケットはx-flagというヘッダが付与される

大量のパケットの中身はほとんど似通った内容であるため、通常のパケットのヘッダの数とは違うパケットをフィルタしたらフラグが出てきた。
考え方としては、フラグが埋まっているパケットならば、通常のパケットのヘッダの数がn+1になるため。

ctf4b{http2_uses_HPACK_and_huffm4n_c0ding}

hitchhike4b (91pt)

pythonのhelp()関数からどうにかして2つに分けられたフラグを引っ張ってくる問題。
help()関数では通常、ヘルプビューワとしてlessを使っているため、そのままシェルをキックできる。
しかしこの問題ではビューワがcatになっており、シェルが立ち上げられないようになっていた。

色々調べているとhelp()ではモジュールの中身を見れるらしいということで、__main__をみたらflag1をゲット。

その後2時間くらいガチャガチャやり、FILEに示されているファイルを入力したらflag2を入手した。

これ謎機能すぎない???????????????????????????

ctf4b{53cc0n_15_1n_my_34r5_4nd_1n_my_3y35}

crypto

CoughingFox (55pt)

以下のプログラムと出力が渡される。

# problem.py
from random import shuffle

flag = b"ctf4b{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}"

cipher = []

for i in range(len(flag)):
    f = flag[i]
    c = (f + i)**2 + i
    cipher.append(c)

shuffle(cipher)
print("cipher =", cipher)
# output.txt
cipher = [12147, 20481, 7073, 10408, 26615, 19066, 19363, 10852, 11705, 17445, 3028, 10640, 10623, 13243, 5789, 17436, 12348, 10818, 15891, 2818, 13690, 11671, 6410, 16649, 15905, 22240, 7096, 9801, 6090, 9624, 16660, 18531, 22533, 24381, 14909, 17705, 16389, 21346, 19626, 29977, 23452, 14895, 17452, 17733, 22235, 24687, 15649, 21941, 11472]

気合で殴るソルバーを書いた。

# solver.py
cipher = [12147, 20481, 7073, 10408, 26615, 19066, 19363, 10852, 11705, 17445, 3028, 10640, 10623, 13243, 5789, 17436, 12348, 10818, 15891, 2818, 13690, 11671, 6410, 16649, 15905, 22240, 7096, 9801, 6090, 9624, 16660, 18531, 22533, 24381, 14909, 17705, 16389, 21346, 19626, 29977, 23452, 14895, 17452, 17733, 22235, 24687, 15649, 21941, 11472]

solv = []
data = []

for i in range(255):
    for word in range(255):
        c = (word + i)**2 + i
        if c in cipher:
            solv.append({'index':i, "chunk": word})
            break

for c in solv:
    data.append(chr(c["chunk"]))

print("".join(data))

ctf4b{Hey,Fox?YouCanNotTearThatHouseDown,CanYou?}

お気持ち

24時間のCTFだったのでチームメンバーが皆頑張って最後までプレイしていたので楽しかった。 一方、チームとしてはCryptoの進捗が悪く、そこで上位チームとの点数差が開いたと考えている。 Cryptoは俺が拾っていけるよう頑張っていく。修行するぞ~!