マクニカ主催MNCTF2025優勝者による問題解説

2026年2月26日掲載

キービジュアル

こんにちは。セキュリティエンジニアの鍬田です。
休日にはCTFに参加し、世界中のサイバーセキュリティ技術者と競い合っています。

筆者は、2025年12月にマクニカ主催で開催された個人戦のサイバーセキュリティコンテスト「MNCTF2025」に出場し、1位を獲得しました。

本記事では、CTF(Capture The Flag)の概要に加え、実際に出題された問題の内容を解説します。本記事が、CTFやセキュリティ技術に興味を持つきっかけになれば幸いです。

本記事はCTFを通じたセキュリティ技術の理解促進と、防御・検知の向上を目的とした解説です。許可なく第三者のシステムに対して本記事の内容を適用する行為(不正アクセス等)は法令・利用規約に反し、絶対に行わないでください。 検証は、必ず権限のある環境(CTF基盤、自己所有の検証環境等)で実施してください。

目次

CTFとは

CTFとは「Capture The Flag」の略称で、サイバーセキュリティに関する技術力を競う競技です。Web、ネットワーク、暗号、フォレンジックなど、さまざまな分野の問題が出題され、参加者はそれらを解析・攻略することで、フラグと呼ばれる文字列を取得し、得点を競います。

大会形式はさまざまで、オンライン上で完結するものもあれば、最終ラウンド(Final)がオンサイトで開催される大会もあります。オンサイトは国内に限らず世界各地で実施されており、筆者自身もアメリカやサウジアラビアで開催されたFinalに出場した経験があります。

世界最大級CTF Finalの様子 ※ 世界最大級CTF Finalの様子

また、CTFは官公庁からも注目を集めており、国家サイバー統括室や経済産業省、防衛省などが主催するコンテストも開催されています。加えて、近年ではトリリオンゲームといったドラマでも取り上げられるなど、一般層にも認知が広がりつつあります。

MNCTFについて

今回は、そのようなCTFの中でも、マクニカが主催する「MNCTF」について取り上げたいと思います。

近年のCTFは非常に高難度なものも多く、Easyとされる問題であっても、初学者にとっては歯が立たないケースが少なくありません。一方で、MNCTFは実務に近い視点で設計されており、初学者の方でも比較的に容易に問題を解くことができます。

今年(2025年)の出題内容は、MNCTF2025のサイトからアクセスできます。(要登録)

本コンテストでは、全部で2つのシナリオが用意されていましたが、今回はそのうちの 「3. 脆弱性対応」 シナリオについて解説していきます。

本シナリオでは、React2Shell を題材とした問題が出題されました。

環境

今回は主に Windows上の WSL2(Ubuntu 22.04) を使用しました。また、Kali Linux があると、ツール類があらかじめ揃っているため非常に便利です。CTFに取り組む際は、Linux環境がほぼ必須となります。Windows環境を利用している場合でも、WSL2を使えば比較的容易にLinux環境を構築することができます。

1. Webサーバのバージョン

Webサーバの種類とバージョンを調査してください。
フラグのフォーマットはソフトウェア名/バージョンです。
例)Apache/2.2.1

ubuntu@ubuntu$ curl -I http://task2.*****.info/makuniki_stock
HTTP/1.1 200 OK
Server: nginx/1.25.4
Date: Tue, 03 Feb 2026 05:13:17 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 8403
Connection: keep-alive
Vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, Accept-Encoding
x-nextjs-cache: HIT
x-nextjs-prerender: 1
x-nextjs-prerender: 1
x-nextjs-stale-time: 300
X-Powered-By: Next.js
Cache-Control: s-maxage=31536000
ETag: "14ewitt7lvm69x"

解説

curlコマンドでHTTPレスポンスヘッダを確認することができます。

HTTPレスポンスヘッダの Server フィールドを確認することで、使用されているWebサーバの種類とバージョンを特定できます。
対象サイトでは Server: nginx/1.25.4 が返却されていたため、フラグは nginx/1.25.4 となります。

答え:nginx/1.25.4

2. Webフレームワーク

このサイトはどの Web フレームワーク(JavaScript ベース)で動作しているか?
フレームワーク名を答えてください。

ubuntu@ubuntu$ curl -I http://task2.*****.info/makuniki_stock
HTTP/1.1 200 OK
Server: nginx/1.25.4
Date: Tue, 03 Feb 2026 05:13:17 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 8403
Connection: keep-alive
Vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, Accept-Encoding
x-nextjs-cache: HIT
x-nextjs-prerender: 1
x-nextjs-prerender: 1
x-nextjs-stale-time: 300
X-Powered-By: Next.js
Cache-Control: s-maxage=31536000
ETag: "14ewitt7lvm69x"

解説

対象ページのHTMLを確認すると、/_next/ というパスが多数含まれていることが分かりました。
このパスは、Next.jsがビルド時に生成する静的アセット(JavaScriptやCSSなど)で使用されるものであり、Next.js特有の構造です。

さらに、HTTPレスポンスヘッダに X-Powered-By: Next.js が含まれていることから、対象のWebアプリケーションがJavaScriptベースのフレームワークである Next.js を使用していると判断できます。

答え:Next.js

 

3. フレームワークのバージョン

2. Webフレームワークで回答したフレームワークのバージョンはなんですか? フラグのフォーマットはa.b.c

解説
本問題では、対象となるWebアプリケーションで使用されているフレームワークのバージョンを特定する必要がありました。

調査を進める中で、「Next.jsのバージョンを判別する方法」について解説された記事を参考にしました。

記事内で紹介されている手法を実際に試したところ、レスポンスヘッダやHTMLの情報からフレームワークのバージョン情報を確認することができ、設問で求められている形式(a.b.c)のフラグを取得できました。

答え:16.0.6

4. CVE番号

CSIRT 宛に届いた Mintel からの追加メールによれば、対象サイトには「React Server Components のシリアライズ処理に起因する重大な脆弱性」が存在しているという。
メールには次のログ断片が添付されていた:
POST /makuniki_stock HTTP/1.1
Host: task2.*****.info
Next-Action: x
Content-Type: multipart/form-data; boundary=954fee7ae898471f03e2dad503343606

また、Mintel が作成した調査メモには次の記述があった:
Next.js 15/16 系で発生し得る Server Actions 悪用の脆弱性であり、攻撃者が任意コードを実行できる可能性があります。
この説明と一致する CVE番号 を答えてください。

解説

「React Server Components のシリアライズ処理に起因する重大な脆弱性」といったキーワードでGoogle検索を行うと、本脆弱性に関する複数の記事を確認することができます。

答え:CVE-2025-55182

5. 攻撃者のIPアドレス

アクセスログを調べたところ、すでに攻撃されていた痕跡が見つかった。
攻撃者のIPアドレスを回答してください。

解説

access.logを確認すると、大量の通信が発生していることがわかります。
これらのログの中には、HTTP 500が配信されているリクエストが含まれていました。

HTTP 500 は「サーバ内部エラー」を示すステータスコードで、リクエストの処理中にサーバ側で例外が発生した場合に返されます。
今回の暇では、サーバアクションや RSC(React Server Components)のシリアライズ処理を狙った不正な POST リクエストが送信されることで、サーバ側で例外が発生しやすくなり、その結果として HTTP 500 が受信されるケースが攻撃痕跡と思われます。

access.log を 500 で検索したところ、該当する通信は 1 件のみであることがわかりました。この通信が本問題で求められている答えとなります。

答え:101.xxx.141.27 (一部マスクしてます)

 

6. エクスプロイト

当該脆弱性を利用して、サーバ内の/flag.txt の内容を読んで答えてください。

解説

今回の件では、CVE-2025-55182 に関連する脆弱性を利用して、サーバ内にある /flag.txt の内容を推測することが目的です。

この手順では、エクスプロイトのPoCコードを実行して取得作業を行います。不正アクセス行為に該当する可能性があるため、具体的なコードの詳細は割愛します。

 

 

おわりに

ここまでお読みいただき、ありがとうございました。

本記事を通して、CTFの雰囲気や取り組み方を少しでも感じていただけたのであれば幸いです。

セキュリティ分野のCTF(Capture The Flag)は、実践的な課題に挑戦しながらセキュリティ技術を磨ける競技イベントです。堅牢な防御を実現するには、攻撃者がどんな発想で、どんな手法を使うのかを理解しておくことが欠かせません。CTFはそれを安全な環境で体系的に学べる場として、とても有益です。

また、CTFは、限られた時間の中で順位を競い合う競技であり、わずかな順位が違うだけでFinalに進めるかどうかが決まることもあります。一方で、競技プログラミングと比較すると競技人口はまだ少なく、比較的上位を目指しやすい分野でもあります。ぜひ皆さんもチャレンジしてみてください。

私は、今回のCTFで1位を獲得できたので、副賞として Logicool のワイヤレスキーボードもいただき、とても嬉しく思っています。

このような貴重な機会と素敵な賞品をご用意くださったマクニカの皆さまに、改めて心より感謝申し上げます。

おすすめの記事

条件に該当するページがございません