みなさんこんにちは、最近のブログはだいぶ3DCGの印象が強めだったkaitoyamaです。
今日まで開催されていたCPCTFにて、Forensicsの2問の作成と1問の原案及び解法確認を行ったので、そのwriteupを書きます。(一応運営も担当していましたが、ほとんどは23Bや24Bの運営がやってくれました!)
I love MD [Forensics Lv.3]
名前だけ見るとMD記法の問題に見えますが、実際はMD5というハッシュ値の衝突を探す問題です。Lv.4にキャッシュでハッシュ値を使う問題を作っていたのもあって、Lv.3としては適切な難易度なのではということで作成しました。
解法としては、MD5のハッシュ値の衝突ケースについて調べて見つかった結果を入力するだけという問題です。
他の問題との正解者数を見る感じ、良いところに調整できたのではと思っています。
Cached LLM [Forensics Lv4]
ユーザーのアップロードしたコンテンツに対して不適切に切り詰めたハッシュをキーとしてキャッシュを使うことで他のユーザーのあげたコンテンツを入手できるというのが、この問題のコアの部分でした。
発案の大元はこの記事です。
さて、解法としては、ログを見ると一番最初にflagについて話していそうなログがあり、キャッシュのキーがわかります。使っているハッシュ関数はSHA256ですが、だいぶ切り詰めて使っているので容易に衝突するinputを作れるところが突破口になります。
最初公開時、問題環境にキャッシュがセットされておらず、解けない状態になっていました。大変申し訳ございません。
配布ファイル用にログを作ったあと、その機構を削除する際に、間違ってflagのキャッシュを追加する部分まで一緒に消してしまっていました。
ちなみにログのその他の質問は、ChatGPTにLLMに聞くべき50の質問という形で提案してもらった質問でした。
Event Analyze [Forensics Lv.5]
まず、この問題については、大きな誤りがありました。
この問題のシナリオでサプライチェーン攻撃を扱う部分がありました。この部分の作問作業において、実際のnpm.jsへのアップロードが行われ、問題意識なく2週間以上にわたって、READMEへの注意書きの表示などもせずに公開が続いていました。
開催中に参加者より指摘があったことで状況が把握され、
- npmへの削除依頼
- READMEへの注意書きの追加
- private repositoryを使った配布ファイルへの差し替え
が行われました
指摘いただいた参加者の方には深く感謝すると共に、締切直前の作問になってしまったため、作問時の適切な手法の検討が不十分になってしまう環境を生み出してしまったこと、実際の作業を共同作問者に完全に任せてしまい、作問時に上記の現象が発生していることに気づけていなかったことを運営の立場、共同で作問をしていたものとして、深く反省しております。
CTFの大会を開催する立場において、作問時に行なっている作業の影響範囲などについては、参加者以上に十分に理解した上で、外部への影響は及ぼさないように十分に手順を考えてから行うことが重要なことは言うまでもありません。
再発防止として以下を実施してまいります
- 特にForensics分野など実際に悪意のあるスクリプトを扱う部分を中心に、作問前に、外部への影響を及ぼさない適切な作問手順と不適切な作問手順についてを周知徹底する
- 作問が開催直前まで続いたために、作問者がこのような粗雑な手順を取ることになったという点を深く認識し、スケジュール感覚についても見直す
以下、解法については修正後のものについてのwriteupとなります。
今回自分が最後に作問というか原案出しをした問題でした。
ForensicsのLv.5として何を作るかという話になった際に、別の作問者がdisk問を作ると言っていたのでmemdump系の問題を作ろうと思って始めました(結局時間が足らずdisk問は完成しませんでした...)
しかし、自分の手元ではユーザーに配れそうなdumpを取れなかったので、seigo2016に実際の作業を協力してもらって作問を進めました。
分担としては自分が簡単な技術検証(この情報はちゃんとログに表示されるかなどの確認)をしたのち、シナリオを書き、それをseigo2016が問題に合わせてファイルなどを作成して、手元のhyper-vで実行、dumpを作成し、自分に共有。最後に自分が想定解法で解けることを確かめました。
解法は問題のhint3の通りなので以下に転記します
イベントログのディレクトリをhayabusaで解析すると、marktype以下のディレクトリにあるpythonファイルが検知されていることがわかります。
ここで、marktypeでgit log
を行うと混入させたユーザー名を取得できます。
また、windows defenderのSupportフォルダの中にあるMPログを見ると、そのpythonファイルのsha1のハッシュ値を得ることができ、これをvirustotalで検索すると報告済みのpythonファイルの名前を取得できます。
次に、stack-cmdlinesを見ると、ARPスキャンやICMPスキャンが行われていることがわかります。
また、git show
を見ると、nodeのパッケージに変更が加えられていることから、その周辺の通信が怪しいとわかります。
そこで、スキャンの実行が何によって行われているか見るとnode.exe
によってこれらのスキャンプロセスは作成されています。
ここで、このスキャンプロセスの流れを見ると2025-04-19 23:12:56.611 +09:00
にICMPスキャンが終わり2025-04-19 23:13:02.469 +09:00
にARPスキャンをしているようです。この前後のnode.exe
に関するイベントを見ると、ARPスキャンの直後、 Network Connectionイベントがあることがわかります。
よって、これが、外部への通信ではないかと考えられます。
最終的にはmemdump問ではなく、EventLogやDefenderのログを解析する問題となりましたが、ある程度難易度としては適当な問題ができたのではと思っています。また、解法として名前だけは聞いていたhayabusaやtakajoを使えたのも個人的には学びが多く楽しかったです。
本当に、CTF部門において、直前の深夜作問が常態化しているのがよくない結果を招いたと深く反省しています。
最後に
今年の作問の様子を見ていると結構LLMと相談しているメンバーが多かったですし、自分も相談しながら作成した部分やweb UIの部分は任せた部分も多かったです。来年は原案作りの部分も共同でできるような未来が来るのではとワクワクしています。
来年も開催された際にはぜひ皆様ご参加いただけますとありがたいです。