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

hamayanhamayan's blog

nookstop [UIUCTF 2020]

CTFtime.org / UIUCTF 2020 / nookstop

The Nook Stop has been acting up today.....
https://nookstop.chal.uiuc.tf/
author: ian5v

f:id:hamayanhamayan:20200724113607p:plain

Flagボタンを押そうとすると逃げられる。

わざわざ画面から押さなくても…

ソースコードを見てみると、以下のようなjsコードが書いてある。

async function print(m, ms) {
    $("#output").append("\n");
    for (var i=0; i < m.length; i++)
    {
        var sel = $("#output");
        sel.append(m[i]);
        await sleep(ms);
    }
    $("#output").append("\n");
}

var msg1 = "Welcome to the Nook Stop, a magical multimedia terminal from Nook Inc.\nPlease select one of the following services:\n1) Network status\n2) Flag";
var msg2 = "Ah, sorry!! Our banking systems run on FORTRAN and they're a bit \non the slow side today.............................................\nyou know how this game's netcode can be sometimes, ahahahahaha!\nAlthought, come to think of it, they did say they were rolling out \nsome kind of new system the other day.......anyway, seems like that flag button isn't working right now."

$(document).ready(function(){

    $("#flag").click(function(){
        console.log("TODO: シークレット_バックエンド_サービスを可能にする");
        document.cookie = "clicked_flag_button=true";
        location.reload();
    });

    f = $("#flag");

    f.mousemove(function(){
        var r = Math.random()*100;
        if (r < 25)
            f.css("margin-left", "+=100px");
        else if (r >= 25 && r < 50)
            f.css("margin-left", "-=30px");
        else if (r >= 50 && r < 75)
            f.css("margin-top", "+=50px");
        else if (r >= 75 && r < 97)
            f.css("margin-top", "-=50px");
        else
            f.remove();
    });


    $("#status").click(function(){
        print(msg2,100);
    });

    print(msg1,10);
});

急に日本語が書いてあってびっくりする。
authorは日本人じゃなさそうだけど…まあ、それは良くって…
クリックされると、Cookieに何かが書き込まれるようだ。
手動でclicked_flag_button=trueを書き込んで、リロードしてみよう。

Not that easy c: but here's a crumb: uiuctf{w

ほう。50ptと言えど、このくらいではだめなようだ。

他に攻撃点は?

他に目立った点といえば/static/cookie.jsくらいしかない。
getCookie関数が定義されているが使われていない。

解説を見る

あーーーーーーー!

「シークレットバックエンドサービスを可能にする」

これがヒントだったとは…
secret_backend_serviceが名前で値がtrueのCookieを入れると後半も出てくる。

Not that easy c: but here's a crumb: uiuctf{w
Nicely done! Here's a flag for your troubles:

    uiuctf{wait_its_all_cookies?}

Capture the flag.