LINE CTFということもあり、やはり難易度は高めでした。
今回のコンテストでは、162チーム中36位という結果です。
この記事では、自分が解いた方法を順を追って解説していきます。
0_Sanity Check – Sanity Check
この問題のフラグは、DiscordのLINE CTF 2025サーバーの
announcementsチャンネルのチャンネルトピックに記載されていました。
Answer : LINECTF{77c638f42fae9cfac448387b44bbc1b5}
Web – Yapper catcher
脆弱性の解説
- サーバーの動作:
/
にアクセスすると、Expressサーバーはまずstatus.getStatus
という処理を呼び出します。- この処理は、URLに
id
というパラメータ(例:/?id=...
)があるかどうかを確認します。 id
が無い場合は、次の処理であるstatus.newStatus
に移動し、「新規ステータス作成」ページが表示されます。id
がある場合は、そのIDに対応するステータス更新ページを表示し、処理を終了します。
- ボットの動作:
- ボットは指定した
username
を元に、http://<IP>:<Port>/?user=<username>
というURLにアクセスします。
- ボットは指定した
- 脆弱な点:
- もし
username
として「solver&id=<ステータスID>
」のような値を渡すと、ボットがアクセスするURLはhttp://<IP>:<Port>/?user=solver&id=<あなたのステータスID>
となります。 - サーバーは、このURLに含まれる
user
パラメータとid
パラメータの両方を認識します。 status.getStatus
処理がid
パラメータを検出するため、「新規作成」ページではなく、既存の「ステータス更新」ページをボットに表示します。
- もし
- 攻撃の成立:
- ボットはあなたの「ステータス更新」ページにあるフォーム(ステータスIDが隠しフィールドとして含まれている)に、フラグ入りの引用を書き込んで投稿します。
- サーバーはこの投稿を「更新」とみなし、あなたが設定した既知のパスコードでフラグを暗号化します。
- 結果として、自分のパスコードを使うことで、ボットが投稿したフラグを復号できるようになります。
- まず、自分のステータスを適当に作成します。
- 作成後、URLがhttp://<IP>:<Port>/<32文字のID>となるので、そのIDをコピーします。
/yapper
ページに移動し、「Speaker’s name」の入力欄に以下のペイロードを入力します。
solver&id=<32文字のID>- 「Yapping commence!」ボタンをクリックしてボットを起動します。
- http://<IP>:<Port>/<32文字のID>のページに戻り、リロードします。
- ボットによる新しい投稿が追加されているはずなので、その投稿のパスコード入力欄に、最初に設定した自分のパスコードを入力し、「Decrypt」ボタンをクリックします。
Answer : LINECTF{72385e15e0e665ffe09e7189d9b7c072}
Rev – Baby-python
まず、pyinstxtractorを使用してexeファイルを展開します。
python pyinstxtractor.py chall.exe
これだけでexeを展開し、pycファイルを取り出すことができました。しかし、chall.exeはPython 3.12でビルドされているため、pycdcやdecompile3ではデコンパイルできず、現状では手詰まりの状態です。
コメント