はまやんはまやんはまやん

hamayanhamayan's blog

Jade CTF 2022 Writeups

[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を埋め込む。

  1. 適当にユーザーVwK271G1j4a2VAUkULD6Uを作成
  2. serverに対してPOST /でbodyをusername=VwK271G1j4a2VAUkULD6U&password=9223372036854775807
  3. APIに目的のsignatureが出来上がっている API: http://api/register.php?username=VwK271G1j4a2VAUkULD6U&password=9223372036854775807&signature=1aae3f07e60361aeaaeaabbe9d97e4b07a579ab7
  4. apiに対してGET /update_score.php?username=VwK271G1j4a2VAUkULD6U&next_level=9223372036854775807&signature=1aae3f07e60361aeaaeaabbe9d97e4b07a579ab7をして有効なsignatureで金額を増やす
  5. 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コードが紹介されているが、そうやって使うのねという感じ。
んー、探せてても解けたか怪しいな…