アロワナ飼いたい

いつかアロワナを飼いたい人のブログです

SECCON Beginners CTF 2022の振り返り

概要

先日行われたSECCON Beginners CTF 2022のメモ。解けた問題に対するアプローチや感想などをまとめる。なお、welcome問を除いて僅かに5問しか解けず、最終順位は220位(チーム:4r0wana)。


phisher

与えられたソースコードを読み、以下の処理を行うスクリプトであることが分かった。

  1. ユーザが文字列を入力する

  2. 入力した文字列を含む画像ファイルが生成される

  3. 2.で生成された画像ファイルを用いて文字認識を行う

  4. 3.で認識できた文字列と「www.example.com」を比較する


4.において、認識された文字列が「www.example.com」となり、入力した文字列に「www.example.com」におけるいずれかの文字が含まれていない場合にフラグが得られる。

つまり、「www.example.com」と誤認識するような文字列を入力に与えればよい。

まず思い浮かんだのはギリシャ文字「ω」で、その後にいくつかのキリル文字など。一旦「ωωω.ęхàмрļę.çом」まで作成したが、ピリオド「.」の突破に悩んだ。

泥臭く1時間ほどかけて、最終的には「ωωẁ。èхàмрļę。çом」を試したところ、フラグが得られた。


CoughingFox

与えられた暗号文の各文字の位置はシャッフルされているが、元々の位置$i$は特定できる。

以下のようなソルバーを書いてフラグを得た。

import string

cipher = [12147, 20481, 7073, 10408, 26615, 19066, 19363, 10852, 11705, 17445, 3028, 10640, 10623, 13243, 5789, 17436, 12348, 10818, 15891, 2818, 13690, 11671, 6410, 16649, 15905, 22240, 7096, 9801, 6090, 9624, 16660, 18531, 22533, 24381, 14909, 17705, 16389, 21346, 19626, 29977, 23452, 14895, 17452, 17733, 22235, 24687, 15649, 21941, 11472]
moji = string.ascii_letters + string.digits + string.punctuation
dic = {}

for c in cipher:
    for i in range(len(cipher)):
        for j in moji:
            if (ord(j) + i) ** 2 + i == c:
                dic[i] = j
                break

dic = sorted(dic.items())

for i in range(len(dic)):
    print(dic[i][1], end = '')


Quiz

実行ファイル内の印字可能文字列をstringsで抽出すればフラグが得られた。

$ strings quiz | grep ctf4b


textex

tex injection」などのキーワードでググり、以下をソースファイルに含めている例を発見した。

$$ \input{/etc/passwd} $$


上記を含む以下のソースをコンパイルすると、/etc/passwdの内容が含まれるPDFが生成された。これを参考に、flagファイルの読み取りを試みた。

なお、与えられたapp.pyの24行目周辺において、ソースコード内にflagという文字列がある場合、ソースコードを空白にするような処理が書かれている。


したがって、以下を含むようなソースコードコンパイルした。

\newcommand{\variable}[2]{#1#2}
$$ \input{\variable{fl}{ag}} $$


実行結果は以下の通りである。


「$$」で囲んでいるため、「_」が下付き文字として解釈されている。本来のflagの中身は「ctf4b{15_73x_pr0n0unc3d_chou?}」と考えられ、これがフラグであった。


Util

IPアドレスの入力フォームが与えられた。OSコマンドインジェクションができそうだと考えたが、入力処理に正規表現を用いており、コマンドなどは不正入力値として処理された。

Fiddlerを使って、以下の通りリクエストを書き換えてフラグを得た。

  1. 「Rules」 > 「Automatic Breakpoints」>「Before Requests」を選択

  2. 「File」>「Capture Traffic」にチェック

  3. 有効なIPアドレスを入力し、「check」をクリック

  4. 記録されたリクエストの「Inspectors」>「Run to Complete」をクリック

  5. 新たに記録されたリクエストの「Inspectors」>「Syntax View」をクリック

  6. リクエストを書き換え、「Run To Complete」をクリック

  7. 書き換えたリクエストの送信結果の確認

  8. 同様にリクエストを書き換え、一つ上のディレクトリを確認

  9. 同様にリクエストを書き換え、フラグファイルを確認


感想

個人参加とはいえ、計12時間ほど取り組んだにもかかわらずの結果に終わりました。CTFを始めて1年ほど経ちましたが、この成長度合いの遅さです。ほとんど勉強してこなかったweb問が2問解けたことは嬉しかったですが、勉強してきたrev問とpwn問が1問しか解けてないことは反省です。運営の皆様、ありがとうございました。参加者の皆様、お疲れさまでした。