BSidesSF 2019 CTF|mixer

#BSidesSF2019CTF

https://ctftime.org/task/7747

Log in as administrator!

(Check out the user cookie)

Location -

https://mixer-f3834380.challenges.bsidessf.net/

Web + Cryptoの問題。

first/last nameを求める適当にログインしてみる。

Welcome back, old moon!

It looks like you aren't admin, though! Better work on that! Remember, is_admin must bet set to 1 (integer)! And you can safely ignore the rack.session cookie. Like actually. But that other cookie, however....

言われたとおりにcookieを見てみると、rack.sessionの他に userというcookieがある。ユーザ名をなしにしてもログインできたのでその時のを貼っておく

b9c04b7aa2c77145465e16e3f307fb55107aeb26db087079fcdc3b6cb5ea0874c483880387d600e921921f919456ebfe

いろいろなユーザ名で試してみる。

0625a518ee1492573b40ae33339ef0f6 a7176a2bf78af997531cc517b9920c65 9c005135a3bfba731ee3beb20a092325
0625a518ee1492573b40ae33339ef0f6 bdc5f581ebf29bd8683ef60e9827f4c2 9c005135a3bfba731ee3beb20a092325
ae37d5d01a4d424eb947c5a40c24d33b a7176a2bf78af997531cc517b9920c65 9c005135a3bfba731ee3beb20a092325
2bc4c3d414444fe15e53b6f6561e0b74 a7176a2bf78af997531cc517b9920c65 9c005135a3bfba731ee3beb20a092325
0625a518ee1492573b40ae33339ef0f6 984c28e4302190321c838e5cc6cadc3c 5e162fce4befa0ceed6bbac8feab365d 2daec709c864e1f137a9d073e40c8712
0625a518ee1492573b40ae33339ef0f6 a7176a2bf78af997531cc517b9920c65 5e162fce4befa0ceed6bbac8feab365d 2daec709c864e1f137a9d073e40c8712
0625a518ee1492573b40ae33339ef0f6 1c5ea018d40d8dcb835ce054d9efbdfd 5e162fce4befa0ceed6bbac8feab365d 2daec709c864e1f137a9d073e40c8712
0625a518ee1492573b40ae33339ef0f6 1c5ea018d40d8dcb835ce054d9efbdfd 282a97739aa9ef4f3842379764bc215b a6f69e57cbd9943d0219c8e2f313e3fd
ae37d5d01a4d424eb947c5a40c24d33b 1c5ea018d40d8dcb835ce054d9efbdfd 97a783272ac4184e53863f2ff448a2fc 2daec709c864e1f137a9d073e40c8712
ae37d5d01a4d424eb947c5a40c24d33b 1c5ea018d40d8dcb835ce054d9efbdfd 7a1e5e579d45b348d46d388af9d4586b a6f69e57cbd9943d0219c8e2f313e3fd
0625a518ee1492573b40ae33339ef0f6 57db219e163684398514638c2b5433a3 cc20c6d8e7678d4e1c8d05813dbff5ba 2e1c18896929f44b6a77bdf2dfc7f8a4
0625a518ee1492573b40ae33339ef0f6 5bf404b026687ca8ce183abbaf88a2e4 2d000ec8e00cbb715031457acbd9d243 01d90aed6871121eb00d7141fd5c621e df4cff2d8d360a6c0ac639f7b8ddfb20
0625a518ee1492573b40ae33339ef0f6 f8db0d0faee43d5514d2c9dc1cc3031a b468e216de753b6e96293ea346bac68a 592c1185fe772c64ad55c6958c40c542
0625a518ee1492573b40ae33339ef0f6 ddd5b848d9101c579665428f81e3475a b1688f8c68e186ffff68a59b224bacb0 592c1185fe772c64ad55c6958c40c542
372e54adbee260618c04e90c700771ec 78b90c697da9eb51116074a270964307 aa198ca3d3e6cab292b72290bc0f849c 592c1185fe772c64ad55c6958c40c542
0625a518ee1492573b40ae33339ef0f6 ddd5b848d9101c579665428f81e3475a 696ccf8e70a85182161bf42206914ac2 592c1185fe772c64ad55c6958c40c542
0625a518ee1492573b40ae33339ef0f6 ddd5b848d9101c579665428f81e3475a 4706ca529e4e797bca0dcc54ca61ee2f 592c1185fe772c64ad55c6958c40c542

法則が見えてきそうで見えてこない。

  • 最初のブロックはFirst Nameの最初の1文字のみを見ている気がする。

  • 最後のブロックは len(First Name||Last Name)に依存していそう。

  • 総ブロック数はある程度文字数が大きくなると多くなる

また、試しに↑の適当な値を貼ってみたところユーザ名がちゃんと復元された。ユーザ名など全ての情報を↑のフォーマットで格納できているということだろう。

お、エラーを出せた。最後のブロックを別の長さのやつに差し替えた。

0625a518ee1492573b40ae33339ef0f6 ddd5b848d9101c579665428f81e3475a 4706ca529e4e797bca0dcc54ca61ee2f df4cff2d8d360a6c0ac639f7b8ddfb20
Error parsing JSON: 765: unexpected token at '{"first_name":"abc","last_name":"xyz","is_admin"in":0}'

最後のブロックの一部が重複したっぽい。この調子でいろいろやってみる。

0625a518ee1492573b40ae33339ef0f6 ddd5b848d9101c579665428f81e3475a 4706ca529e4e797bca0dcc54ca61ee2f 9c005135a3bfba731ee3beb20a092325
Error parsing JSON: 765: unexpected token at '{"first_name":"abc","last_name":"xyz","is_admin"","is_admin":0}'
0625a518ee1492573b40ae33339ef0f6 ddd5b848d9101c579665428f81e3475a 4706ca529e4e797bca0dcc54ca61ee2f
Error parsing JSON: 765: unexpected token at '{"first_name":"abc","last_name":"xyz","is_admin"'

なるほど。これでうまくis_admin":1}となるようにしろということだろうか。末尾のパディングに関するエラーと"エスケープをうまく回避したい。

first-nameの最初15文字を適当にして、16文字目からを 1} とすると良さそう? パディングがどうなっているかわからないですが……

解けた

import requests


r = requests.get(
    "http://localhost:3000/",
    params={
        "action": "login",
        "first_name": "x" + "1}" + " " * 14,
        "last_name": "x" * 4,
    },
    allow_redirects=False,
)
sess = r.cookies["rack.session"]
user = r.cookies["user"]


r = requests.get(
    "http://localhost:3000/",
    cookies={"rack.session": sess, "user": user[:-32] + user[32:64]},
)
print(r.text)

\

Welcome back, x1} xxxx!\

\

And it looks like you're admin, too! Congrats! Your flag is \CTF{is_fun!!uffling_block_sh}\\