- [forensic] LM10
- [forensic] AUTOCAD
- [web] ULTRA BABY WEB
- [web] BABY WEB
- [web] ++GAME
- [stegano] AVENGERS ASSEMBLE!
- [web] GREEN COFFEE
[forensic] LM10
見やすそうなTCP通信があるので、とりあえず「追跡 > TCPストリーム」で眺める。
画像ファイルがいくつか落とされているので、持ってきてみてみよう。
「ファイル > オブジェクトをエクスポート > HTTP」で持ってくる。
random.pngにフラグが書いてある。
jctf{No_doubt_he's_the_best_in_the world}
[forensic] AUTOCAD
開けないpngファイルが得られる。
TSXBINで開いて、正しいpngファイルと比較してみると、WidthとHeightが設定されていないよう。
Heightを適当に大きな値にして、widthを全探索で大きくしてみる。
with open('poster.png', 'rb') as f: b = f.read() pre = b[:16] wid = b[16:20] post = b[20:] for wid in range(2000): with open(f'outs/out{wid}.png', 'wb') as f: f.write(pre + wid.to_bytes(4, 'big') + post)
Explorerのサムネイルで適当に見ていると、横幅を10進数で800にしたところで急に画像が出てくる。
青い空を見上げればいつもそこに白い猫で開いて、ステガノグラフィー解析で適当に見ると「ビットプレーン ビット4」でフラグが出てくる。
jctf{st3g_1s_easy_as_f**k}
[web] ULTRA BABY WEB
guess問だろうと思って、本文を参考にCookie: user=admin
としてみるとフラグが得られた。
jadeCTF{my_l0v3_f0r_c00k1es_1s_n3ver_end1ng}
[web] BABY WEB
アクセスすると/?page=0
というのが付与されてくる。
0はランダムに値が変わるが、1とか2とかを試すと変わらない。
bruteforce禁止とあるが、うしろめたさを感じつつ3秒くらいスリープを入れて0から順に値を持ってきてみる。
みると、値が固定になったり変動したりというのが見て取れる。
k m 4 k R i hz n b0uO g JFo8DAG _ UIpM3L5mbZEx 1 X94C9XMafc1OtOqbWWBr t ejs0NO6fOswD3lExGDlFOLmy4wtOYxIS3 _ EDLh9LXPvg U m 4 k C i Vc n lFXM g H0iw5MR _ y0yknVwK271G 1 j4a2VAUkULD6UfuTXkLh t blfkSalq3hcnwFznfywTWjIEoy1MI8zBM _ 7EGJWjAe16 D m 4 k h i ua n sqKD g ctIfolc _ MSplxZMMq23g 1 LrQ6GarlVoPEvNZ1z7bu t qX458h0ogW8IYYe1dYelA5qc8UR0bKBes _ cxFw2mvKHO
場所を見てみると、1, 2, 3, 5, 8, 13, 21, ...という感じでフィボナッチ数列になっている。
フィボナッチ数列に従って取り出してみるとフラグが出てくる。
import requests import time flag = "m4" a = 1 b = 2 for p in range(100): c = a + b t = requests.get(f'http://34.76.206.46:10008/?page={c}').text flag += t print(f"[+] {flag}") a = b b = c time.sleep(3)
(これはwebの何を問うているんだろう…)
jadeCTF{f1bonacci_FTW!}
[web] ++GAME
特定ユーザーの所持金を0円から9223372036854775807円に増やす問題。
APIサーバーでGET /update_score.php?username=[username]&next_level=9223372036854775807&signature=[signature]
が成功すれば増やすことができる。
しかし、signatureを作成するにはsecretを把握する必要がある。
このsignatureはsha1(username+next_level+secret)
で作成される。
serverのindex.phpを見ると、sha1(任意のusername+任意のpassword+secret)
を作成することができ、
この任意の入力部分にusername+next_levelを埋め込む。
- 適当にユーザー
VwK271G1j4a2VAUkULD6U
を作成 - serverに対して
POST /
でbodyをusername=VwK271G1j4a2VAUkULD6U&password=9223372036854775807
- APIに目的のsignatureが出来上がっている
API: http://api/register.php?username=VwK271G1j4a2VAUkULD6U&password=9223372036854775807&signature=1aae3f07e60361aeaaeaabbe9d97e4b07a579ab7
- apiに対して
GET /update_score.php?username=VwK271G1j4a2VAUkULD6U&next_level=9223372036854775807&signature=1aae3f07e60361aeaaeaabbe9d97e4b07a579ab7
をして有効なsignatureで金額を増やす - serverに対して
GET /dashboard.php
するとフラグが得られる。
jadeCTF{b4s1c_yet_sm4rt_xploiTTT}
[stegano] AVENGERS ASSEMBLE!
画像を見た瞬間何を要求されているかが理解できて笑ってしまった。
気分転換にパズルを解いた。
jadeCTF{scr4mbl3d_w3_f4ll_un1t3d_w3_st4nd}
[web] GREEN COFFEE
適当にディレクトリスキャニングすると/internal
が見つかる。
You shouldn't be here. This is for internal use onlyと言われてしまう。
スキャニングしても何も出てこんが…なんだろう。
ここまででストップ。
以下、復習。
discordを見るとRequest Smugglingができるっぽい。
grenfeldt.dev
あー、レスポンスにserver: gunicorn/20.0.4
含まれてますね…
discordの方にそのまま使えるexploitコードが紹介されているが、そうやって使うのねという感じ。
んー、探せてても解けたか怪しいな…