LINE CTF

CTF体験記

LINE CTFということもあり、やはり難易度は高めでした。
今回のコンテストでは、162チーム中36位という結果です。
この記事では、自分が解いた方法を順を追って解説していきます。

0_Sanity Check – Sanity Check

この問題のフラグは、DiscordのLINE CTF 2025サーバーの
announcementsチャンネルのチャンネルトピックに記載されていました。

Answer : LINECTF{77c638f42fae9cfac448387b44bbc1b5}

Web – Yapper catcher

脆弱性の解説

  1. サーバーの動作:
    • / にアクセスすると、Expressサーバーはまずstatus.getStatusという処理を呼び出します。
    • この処理は、URLにidというパラメータ(例: /?id=...)があるかどうかを確認します。
    • idが無い場合は、次の処理であるstatus.newStatusに移動し、「新規ステータス作成」ページが表示されます。
    • idがある場合は、そのIDに対応するステータス更新ページを表示し、処理を終了します。
  2. ボットの動作:
    • ボットは指定したusernameを元に、http://<IP>:<Port>/?user=<username>というURLにアクセスします。
  3. 脆弱な点:
    • もしusernameとして「solver&id=<ステータスID>」のような値を渡すと、ボットがアクセスするURLはhttp://<IP>:<Port>/?user=solver&id=<あなたのステータスID>となります。
    • サーバーは、このURLに含まれるuserパラメータとidパラメータの両方を認識します。
    • status.getStatus処理がidパラメータを検出するため、「新規作成」ページではなく、既存の「ステータス更新」ページをボットに表示します。
  4. 攻撃の成立:
    • ボットはあなたの「ステータス更新」ページにあるフォーム(ステータスIDが隠しフィールドとして含まれている)に、フラグ入りの引用を書き込んで投稿します。
    • サーバーはこの投稿を「更新」とみなし、あなたが設定した既知のパスコードでフラグを暗号化します。
    • 結果として、自分のパスコードを使うことで、ボットが投稿したフラグを復号できるようになります。
  1. まず、自分のステータスを適当に作成します。
  2. 作成後、URLがhttp://<IP>:<Port>/<32文字のID>となるので、そのIDをコピーします。
  3. /yapper ページに移動し、「Speaker’s name」の入力欄に以下のペイロードを入力します。
    solver&id=<32文字のID>
  4. 「Yapping commence!」ボタンをクリックしてボットを起動します。
  5. http://<IP>:<Port>/<32文字のID>のページに戻り、リロードします。
  6. ボットによる新しい投稿が追加されているはずなので、その投稿のパスコード入力欄に、最初に設定した自分のパスコードを入力し、「Decrypt」ボタンをクリックします。

Answer : LINECTF{72385e15e0e665ffe09e7189d9b7c072}

Rev – Baby-python

まず、pyinstxtractorを使用してexeファイルを展開します。

python pyinstxtractor.py chall.exe

これだけでexeを展開し、pycファイルを取り出すことができました。しかし、chall.exeはPython 3.12でビルドされているため、pycdcdecompile3ではデコンパイルできず、現状では手詰まりの状態です。

コメント

タイトルとURLをコピーしました