4-Girls ぷち CTF Writeup

はじめに

初めましてzer0です。

今回は、初CTF参加の記念にWriteUpを書きました。(CTFはWriteUpを書くまでがCTFらしい)

結果は以下の通りです。

Scoreboard

感想としては、予想していたよりはできたけど、簡単な問題から解いていたら300pt問題まで解き終わらなかったので、問題を速く解けるようになりたいなと感じました。(300pt問題は年始までにゆっくり解きたいと思います)あとは、専門分野を作って、高得点問題から解けるようになるとかっこいいですね。では、早速WriteUpを書いていきます~

Reversing

[100pt] banner4you

stringsコマンドで無事にフラグを獲得

Answer: ctf4g{S4nt4_C14us}

[200pt] Find Me

fileコマンドでファイルを調べると、elfファイルだったので、実行してみました。

すると、Find me in memory!と表示されたので、IDA Freeで静的解析を行いました。

IDA Free解析画面

読んでみると、分岐があって、片方の分岐に行くと、xor15で暗号化された文字列が復号されそうだとわかりました。

暗号化された文字列を復号するために、CyberChefを使用しました。

CyberChef

無事に、フラグが表示されました!

Answer: ctf4g{10v31y_61n63rbr34d}

Misc

[100pt] この模様はなーんだ?

MaxiCodeという規格の2次元コードらしく、こちらのサイトで読み取ってみると、フラグが表示されました。

Answer:ctf4g{Hotwine0rHotChocolate?}

[200pt] chirstmas card

christmascardを見てみると、文字列っぽいものもなく、stringsコマンドをしてみるも、情報がないため、ステガノグラフィっぽいなと予想しました。

そのため、StegOnlineに画像をアップロードして、BitBrowsePlanesを押すと、フラグが表示されました。

Answer:ctf4g{3nj0y_5te9}

[300pt] 3keywords

ctf4gの3種類のステッカーを使用する問題でした。モールス信号、ASCIIコード表、アルファベット順の数字が書かれているため、まずは、それをアルファベットに変換してみると、beads, sect, encourageが出てきました。写真はTwitterで探してみてください。

この問題は、なかなか解けなかったため、ヒントを見てみると、3つのキーワードで特定の場所を示す方法があるとのことで、調べてみました。すると、what3wordsというアプリが使えそうということがわかりました。インストールして調べてみると、SantaClause Villageっぽいとわかりました。

答えは、公式サイトの第2ドメインを答える必要があったので、公式サイトを調べて、無事にフラグを獲得

Answer:ctf4g{santaclausevillage}

Crypto

[100pt] Do not use the default passwords!

mykeystoreはJAVAで使用されるキーストアらしいです。keytoolを使用してみると、パスワードの入力が求められるので、題名からしてもデフォルトパスワードを使用するのだろうと予想し、mykeysotreのデフォルトパスワードであるchangeitを使用して無事にフラグを獲得 Answer:ctf4g{holidayiscoming2023}

[200pt] R.I.P

FirstBlood賞が取れた問題です。

2023年以降の使用が禁止された暗号ということでTripleDESかなと予想し、問題を解き始めました。Pythonで復号化するためのプログラムが書けそうなので、ChatGPTにコードの型を作ってもらい、プログラムを作成しました。

from Crypto.Cipher import DES3
import binascii

def triple_des_decrypt(ciphertext, key, iv):
    cipher = DES3.new(binascii.unhexlify(key), DES3.MODE_CBC, binascii.unhexlify(iv))
    decrypted_text = cipher.decrypt(ciphertext)
    return decrypted_text.rstrip(b'\0')

def main():
    # キーとIV
    key = "1025A62F14749D12B6A089A22B481CE99049A0F4CD69B9F7"
    iv = "772E34E730489472"

    # encodeされたバイナリファイルのパス
    encoded_file_path = "cipher.bin"

    # decodeして出力するバイナリファイルのパス
    decoded_file_path = "decoded_file.bin"

    # encodeされたファイルをバイナリモードで読み込む
    with open(encoded_file_path, 'rb') as file:
        encoded_data = file.read()

    # Triple DESでデコード
    decrypted_data = triple_des_decrypt(encoded_data, key, iv)

    # デコードされたデータをバイナリファイルに書き込む
    with open(decoded_file_path, 'wb') as file:
        file.write(decrypted_data)

    print(f"Decoding complete. Decoded data written to {decoded_file_path}")

if __name__ == "__main__":
    main()

少し悩んだのが、最初はtxtファイルにデコードした文字列を入れていたのですが、Unicodeにdecodeできないといわれて、binaryファイルで保存したところです。fileコマンドでdecodeしてみると、PDFファイルだったので、納得です。PDFファイルを確認するとフラグを獲得!

Answer:ctf4g{R.I.P_TripleDES}

Forensic

[100pt] Snow covered

問題PDFはいくつもの写真が貼られていて、その中の写真にctf4g{という文字列はあるが、他の写真に隠れてフラグが見えないという問題でした。

問題PDF
kaliでforemost(foremost -t jpg,gif,png -i snowcoverd.pdf)を使用し、PDFからjpgファイルを抽出してフラグを獲得


Answer:ctf4g{PdFw0nd3rLan:D}

[200pt] クジラからのプレゼント

本番では間に合わなかったのですが、せっかく解けたので記載します。 Dockerコンテナをバックアップしたtarファイルが配られました。最初は、imageにしてimportすればよいのかなと思いましたが、docker runでコンテナの中に入ってもフラグっぽいものは見つかりませんでした。そのため、コンテナが起動中にフラグが書き込まれ、そのあと消されたのかなと予想し、tarファイルの中を見ていきました。tarファイルの階層は以下のようになっていました。 ファイルのサイズが、他フォルダと異なるフォルダから中を見ていきました。 すると、af2c7c~フォルダの中のlayer.tarのoptの中に、フラグの一部が書かれた.another_flag_fragment.jpgがありました。 また、optフォルダの中のmyfilesフォルダにもa_piece_of_flag.jpgがありました。←上のフラグを見つけて油断して、このフラグを見落としてしまい本番は間に合いませんでした... 最後のフラグは、365f79~フォルダの中のlayer.tarのrootフォルダの中にある.ash_historyに書いてありました Answer:ctf4g{I_know_all_t#e_His+ory_0f_th1s_im@ge}

Web

[100pt] トナカイ専用

指定されたサイトにアクセスすると、このサイトはトナカイ専用ブラウザ ReindeerBrowser でしか閲覧できませんと表示されます。 User-AgentをReindeerBrowserにすればいけそうかなと予想を立てて、burpsuiteを使用し書き換えてみると、フラグを獲得 Answer:ctf4g{y0u_ar3_th3_r3d-n0s3d_r31nd33r}

[200pt] Escape

指定されたサイトにアクセスすると、検索ページが出てきます。検索ページなので、SQLinjectonと予想し、シングルクォーテーションを入力してみると、やはりSQLinjection可能性が高そうだとerror文から予想しました。

次に、mySQLが動作していることがわかったので、'or1=1#を入力すると、orがサンタさんにEscape処理されてしまいます。 そのため、orを使用せずに、フラグを取り出す方針で進めました(WriteUpを書いている途中でorが大文字ならエスケープ処理されないことに気づいた...)
次に、UNION SELECTでテーブル情報を取り出そうと考え、'UNION/**/SELECT/**/1,2,3,TABLE_NAME/**/FROM/**/INFORMATION_SCHEMA.TABLES#と入力すると怪しい2つのテーブルが見つかりました←空白文字もエスケープ処理されてしまうため、/**/を使用しています。 次に、怪しい2つのテーブルの中身を取り出すことを考え、'UNION/**/ALL/**/SELECT/**/*/**/FROM/**/SantaClauses#を入力してみます。すると、以下のようにフラグの一部が表示されました。 同様に、もう一つのテーブルの中身を取り出すと、フラグを獲得できました Answer: ctf4g{Chr1stm@s_Pre5ent:)}

さいごに

オフラインでの開催だったので、同じテーブルの人たちとわちゃわちゃ解いたのも楽しいですし、いろいろ情報交換もできて非常に楽しかったです。また、難易度的にも解きやすかったですし、初めてのCTFが良い思い出として記憶に残り、セキュリティに対するモチベも上がり、参加してよかったなと本当に思います。