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
gallery (83pt)
以下の画像のように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は俺が拾っていけるよう頑張っていく。修行するぞ~!