🤿

DIVER OSINT CTF 2025 Writeup @ team [object Object]

に公開

はじめに

2025年6月7日~8日に開催された、DIVER OSINT CTF 2025 に参加したので、その Writeup となります。

OSINT (オシントと読む) とは、Open Source Intelligence の略で、日本語にするなら公開情報調査になるそうです。その名の通り、公開されている情報合法的な手段を用いて収集し、調査・分析することを指します。
OSINT CTF というのは、OSINT に CTF (Capture The Flag) の要素を組み合わせたもので、公開情報をもとに、指定されたフラグとなる情報を探し出す ことを競います。

今回は日本の OSINT CTF である、DIVER OSINT CTF に参加しました。DIVER OSINT CTF は 2024 年に初めて開催され、今年 2025 年は二回目の開催となります。
以前 Zenn で 2024 年の writeup 記事 を読んで、めちゃくちゃ面白そうなイベントだと思ったので、今年は参加できてよかったです。

今回、@tkgstrator さんと二人で、チーム [object Object] として参加しました。

最終的に 668 チーム中 22 位という結果でした。OSINT CTF は初めての参加だったのですが、結構いい成績になったんじゃないかなと思います。(二人以下編成のチームに絞ると4位くらいぽい)

変更履歴
  • 2025/06/13: 一部情報をマスクし忘れていたのを修正

メンバー紹介

kurumi

そう、私です。
今回のユーザー名は リコリコ とか トラペジウム のキャラから連想しています。

https://p1at.dev/

https://github.com/p1atdev

tkgstrator

噂によると眼鏡っ子の美少女らしいです。
開催数日前に突然誘ったら快く参加してくれました。

https://bsky.app/profile/tkgstrator.work

https://github.com/tkgstrator


説明

以下で、出題された問題を、カテゴリ別に紹介しています。カテゴリ内の問題の順序は、テンプレをコピペしたのでほとんどアルファベット順ですが、一部読みやすさのために順序をいじっています。

登場する絵文字の意味:

絵文字 問題 カテゴリ
✅, 🟢 解けた そのカテゴリを全部解けた
🟨 - そのカテゴリの一部を解けた
解けなかった そのカテゴリを全部解けなかった

となっています。

問題名の後ろについている (100 pt / 469 solves) は、(正解時の獲得ポイント / 正解チーム数) を意味しています。
introduction 以降の問題では、公式の設定した難易度ラベル (easy, medium, hard) も併せて記載しています。

カテゴリごとに、軽くカテゴリの説明や感想を載せています。
tkgstrator さんが解いた問題は、問題名にユーザー名をつけてあり、それ以外は私が解きました。

🟢 welcome

✅ welcome (10pt / 668 solves)

Discord のアナウンスで提示された、

Diver25{We_understand_the_rules_and_how_to_submit_flags!}

を提出して CTF 開始!
Welcome!

🟢 introduction

introduction はなんとか全問解くことができてよかったです。個人的に難しいと感じるものも結構ありました...

✅ bx (100pt / 469 solves)

この写真で見える "BX" という看板の座標を答えなさい。

文化シャッターに目が行きますが、よく見ると「カトリック上野協会」という看板が見えて、こっちの方が住所として強そうなのでこっち使いました。

場所は↓

https://maps.app.goo.gl/Cx4rSdR4wHQStXMw8

です。

回答はブラウザ上で Google Map みたいに直接ピンを刺す感じで、かなり直感的で良かったです。

✅ document (100pt / 280 solves)

アメリカ海軍横須賀基地司令部(CFAY)は、米軍の関係者向けに羽田空港・成田空港と基地の間でシャトルバスを運行している。2023年に乗り場案内の書類を作成した人物の名前を答えよ。
Flag形式: Diver25{George Washington}

無駄に苦戦して、解法に気づいたときに発狂しかけました。

「CFAY シャトルバス」とかでググると、↓みたいなのがヒットします。

初めはてっきり、どこか別のページに広報担当の名前が書いてあるのかなと思って、探し回ってたんですが、全く見つからず。それでしばらく放置してたんですが、途中で思い返してみると、document っていうタイトルだし、PDF の方に何かあるなと思い、「PDF metadata」でググって PDF を投げ込んでみると、

https://www.sejda.com/ja/edit-pdf-metadata

というわけで、フラグはこれで得られる作者名でした。

✅ finding_my_way (100pt / 408 solves)

34.735639, 138.994950 にある 建造物 の、OpenStreetMapにおけるWay(ウェイ)番号を答えよ。
Flag形式: Diver25{123456789}
ヒント: データを入念に確認してください。あなたのOSINT能力を期待しています。

タイトルを見たときに花海咲季を連想しましたが、あっちは Fighting My Way でした。

これは指示通りにやるだけです。

OpenStreetMap という地図ツールがあるので、検索欄に 34.735639, 138.994950 と入れます。

座標を入れて、 右クリック→地物を検索

「ウェイ: 568613762」となっているのがお目当ての Way 番号です。ウェーイ

https://www.openstreetmap.org/way/568613762

フラグは

Diver25{568613762}

でした。

✅ flight_from (100pt / 362 solves) @tkgstrator

このヘリコプターが出発した飛行場のICAOコード(4レターコード)で答えよ。
Flag形式: Diver25{RJTT}

この画像は FlightRadar24 という、飛行機の位置情報をリアルタイムで見ることができるサイトのもののようです。画像が言うには、JA845H という期待コードのヘリが「OKO (RJTY, 横田飛行場) → ?」のルートで飛んでいるらしいのですが、OKORJTY も正解ではないです。(OKO は IATA 空港コード、RJTY は ICAO 空港コードというやつです)

私はここで詰まって解けなかったんですが、@tkgstrator さんが解いてくれました。

画像を見ると、画像の時時点でヘリの Age が 2 years なので、このフライトは 2024 年 2 月なのがわかります。そこで、「JA845H 2024/2」でググると、2024 年 2 月 2 日のフライトが FlightAware でヒットしました。FlightAware は FlightRader24 の類似サービスで、フライト履歴を調べられます。

https://ja.flightaware.com/live/flight/JA845H/history/20240202/0117Z

このフライトでは、「?→RJTC (立川飛行場)」となっており、中央にある横須賀基地をスルーして、立川飛行場に着陸していることがわかります。

JA845H は学校法人平田学園航空事業本部で登録されているドクターヘリの機体番号で、ちゃんとした飛行場以外の不明地点から飛んだり降りすることが多そうなので、FlightRader24 では誤って横田飛行場から飛んでると誤認識されたのかもしれないです。
このときにようやくヒントの言ってる意味がわかりました...

フラグは最終的に

Diver25{RJTC}

でした。

✅ hidden_service (100pt / 354 solves)

添付ファイルを確認して、Flagを獲得してください!
Flag形式: Diver25{xxxxxxxxxxxxxxxxx}

問題名からも推測できる通り、Tor ブラウザを使って Hidden Service にアクセスする問題ですね。
一番の難関は、この長いドメイン名を正確に入力することでしょう。
私は Shottr という便利スクリーンショットツールに付属している OCR 機能を使って書き起こしました。ただ、頭の方にある 1l の識別が厳しく、初めは 1 でやってたのですが正しくは l のようでした。

正しい URL は、

となります。

間違った ドメイン 正しいドメイン

フラグは

Diver25{w3lc0m3_70_d4rkw3b!}

でした。コピペができるありがたみを感じられる問題でした。

✅ louvre (176pt / 181 solves) @tkgstrator

ルーブル美術館の公共Wi-Fiアクセスポイントのうち、以下の条件を満たすもののベンダーを答えよ。

  • 情報は2025年2月28日に収集されており、オンライン上で確認できる。
  • ベンダーはBSSIDに準拠して判定せよ。
    Flag形式: Diver25{Company Name} (例: Apple Inc.の場合、Diver25{Apple Inc.} となる。)

WiGLE を用いて、アクセスポイント名から MAC アドレスを割り出して、ベンダーを調べる問題です。
アカウントを作成してもレートリミットが何故か厳しすぎて、私はイライラして耐えられなかったので解けませんでした。 @tkgstrator さんが解いてくれました。

ルーブル美術館のフリー Wi-Fi は Louvre_Wifi_Gratuit という SSID だと公式サイトに書いてあります。

https://contact.louvre.fr/hc/en-gb/articles/12853523479453-Do-you-offer-WiFi

WiGLE で探すと見つかりました。

BSSID が A8:5B:F7:E7:E3:21 だったので、MAC Address Vendor Lookup というサイトでベンダーを調べました。

https://maclookup.app/search/result?mac=A8:5B:F7:E7:E3:21

Hewlett Packard Enterprise だそうです。

よって、フラグは

Diver25{Hewlett Packard Enterprise}

でした。

✅ night_accident (100pt / 269 solves)

動画 / Video:
https://www.youtube.com/watch?v=jHgqCpJNL28
この動画で、車とバスが衝突しそうになった場所はどこか。
(回答は座標ピン)

実際に動画にアクセスしてみると、運転手とバスが危うく接触事故を起こしそうになります。この場所を特定することが最終目標です。

まず、バスに注目すると「SBS Transit」と書かれているので、ググるとシンガポールのバスなのがわかります。


動画のスクリーンショット

https://ja.wikipedia.org/wiki/SBSトランジット

他に場所に係りそうな情報を探すと、バスの後ろに「58」と書かれているので 58 番の路線のバスが走っていることがわかります。


動画のスクリーンショット

「sbs transit 58 route」でググると、いくつか(1, 2) 情報がヒットしますが、地名だけ分かってもよくわからんので地図が欲しいです。
ヒットした中で moovit というサイトに、通行ルートの地図が載っていました。


SBS Transit 58 Bus Route Schedule and Stops (Updated)

これにより、もしこれ以上情報が出なくても、最悪バスツアーすれば特定できそうなことがわかりました。でもやっぱりもっと絞り込みたいのでさらに情報を探します。

周囲の建物の情報を使いたいので、建物がよく写っているシーンでスクショして Google 画像検索をかけました。画像単体だけだと他の都市も混ざったので「singapore」を加えました。

すると、似たような建物が映った記事がいくつかヒット(1, 2)しました。

うち、Hundreds of crows seen flying & squawking among trees near Bishan HDB blocks という記事では、動画内で映っていた街路樹と白黒の段差がそっくりだったので、目的地が近くかもしれません。場所は「Block 197 Bishan Street 13」だそうなので、そこから実際の場所を探し始めました。

Moovit の地図と照らし合わせると、ちょうど 58 番バスが近くを通るようなので良さそうです。(青ピンが Block 197 Bishan Street 13)

Block 197 周辺のバス停をあたっていけば、動画で出てくる地形に近い場所が見つかりそうです。

動画をよく観察して、探索時に他に注目すべき点は、

  • 00:02 前後:
    • 左側に看板広告っぽいものが立っている
  • 00:04 前後:
    • 正面に白っぽい木と、正面の建物の入り口が同じくらいの位置
    • 右下を見ると、運転手の車は地面に黄色い四角が書かれた場所から出てきている
      • → 交差点で合流??
      • 四角の角のすぐそこから白黒縞模様の分離帯がある
    • 右奥を見ると、バス停がありバスが停車している
  • 00:07〜:
    • 右2車線だが、左は2車線に加えてバス停用のスペース
      • → 交差点 or 合流地点が近くにあるバス停を探せば良さそう
  • 00:08〜:
    • 運転手は直進と右折ができるレーンを進む
      • → 道の先で右折が可能
  • 00:11〜:
    • バス停の窪みの終わりくらいにも、謎の黄色い四角が地面に描かれている
  • 全体通して:
    • 動画は 2013 年に撮影されているので、最新のストリートビューとは一致しない可能性がある

などを考えながら見ていきます。

すると実は、Blk 115 が目的のバス停になってて、意外とすぐ見つかりました。

ストリートビューを確認すると、最新の2024年ではちょっと似てないですが、2011 年にすると、結構似ているなというのがわかります。

2024 年 2011 年

変な看板と白い木もあるので、安心して確定できます。

回答は、

https://maps.app.goo.gl/UUVj5EsaWEgcDKZY9

でした。

✅ p2t (377pt / 112 solves) @tkgstrator

この写真の左側に掲示されている写真には、ある動物が写っている。その名前を、日本語で書かれている通りに答えよ。
Flag 形式: Diver25{シバイヌ}

最初、日本語理解できなくて何言ってるのかわからなかったです。「ハシブトカラス」は答えではないです。
@tkgstrator さんが解いてくれました。

問題が言ってるのは、「正面に掲示されている写真の、(ここでは写っていない)左隣で掲示されている写真に写っている動物の名前は何か?」です。
つまり、この写真が掲示されている施設を特定して、ハシブトガラスと一緒に写っている写真を探せということです。

最初、真っ黒なハシブトガラスの左側ある空白スペースに、見えない何かの動物が埋め込まれていて、それを取り出すのかと思っていました...

右で見切れている「立山」でググると、富山県にある山が出てきます。

  • きっちりした博物館らしくない、手作り感あふれる掲示方法
  • 特に珍しくもないハシブトカラスの写真
  • 立山に言及した文章

などを考えながら施設を探すと、とやま観光ナビにて雰囲気の近い素材を使用している写真を見つけることができました。


https://www.info-toyama.com/attractions/31031 .

ハシブトガラスの写真は立山自然保護センターの中にある可能性が高そうです。

https://tateyama-shizenhogo-c.raicho-mimamori.net/

しかしながら、公式サイトを漁ってもそれらしき画像は出てきませんでした。綺麗な野鳥の写真しか出てきません。

後から考えてみると、綺麗な写真をそのまま配信できるのだから、一度印刷したものを壁に貼ったものを再び撮影して投稿する意義は薄いですね。観光客が撮影したものが投稿されていないか調べる方がよさそうです。

立山自然保護センター 鳥」でググり、画像を調べると、

立山自然保護センターで展示されている写真を撮影した写真を投稿しているブログ記事が見つかりました。

https://yachou.info/murodoudaira-raichou/#toc21

この画像によるとハシブトガラスの左隣にいるのは「トビ」となり、
フラグは

Diver25{トビ}

となるらようです。

✅ ship (100pt / 363 solves)

これは、ある組織が運用する船舶である。もし将来、この船が外国に売却されたとしても、変わらない番号を答えよ。
Flag形式: Diver25{現地語での船名_番号}(例: 船名が「ペンギン饅頭号」で番号が 1234567 の場合、Flagは Diver25{ペンギン饅頭号_1234567} となる)

とりあえず Google 画像検索にかけると東京海洋大学海洋科学部の所有する「神鷹丸 (4代)」であることがわかります。

https://ja.wikipedia.org/wiki/神鷹丸_(4代)

問題文にある「もし将来、この船が外国に売却されたとしても、変わらない番号」がよくわからないんですが、神鷹丸の基本情報を見ると、「IMO番号 9767675」「MMSI番号 431328000」などが書いてあるのできっとどれかのことでしょう。IMO 番号について飛んでみると、

https://ja.wikipedia.org/wiki/IMO番号

船舶に与えられたIMO番号は廃船になるまで変更されることがなく、所有者や船籍が変更されたとしても変更されない。

とあるので、これのことですね。

フラグは

Diver25{神鷹丸_9767675}

でした。

🟨 geo

なんでもありな GeoGuesser みたいな問題です。ただ別に私は GeoGuesser そんなにやったことないです。

想像してたよりもだいぶ難しかった! hole は悔しかったですが、全体的にはまあまあ良くできた方なんじゃないかと思います。

✅ Afghanistan (414pt / 94 solves) [medium] @tkgstrator

動画 / Video:
https://www.youtube.com/watch?v=NWQwx4-MeRg&t=65s
この動画の65~67秒に表示される写真はいつどこで撮影されたものか。
Flag形式: Diver25{撮影場所名_YYYY-MM-DD}(撮影場所名は英語)
例えば、2025年6月5日に、Camp Darbyで撮られた場合は、Diver25{Camp Darby_2025-06-05}となる。

言われた通りに動画のシーンを見ると、

となる。ここから基地を特定するの...!? Google 画像検索にかけても碌な情報が出てこなかったので絶望して後回しにしてたら、@tkgstrator さんが解いてくれました。

Google 画像検索ではなく Google 検索でテキストで「afghanistan military camp basketball」みたいな検索ワードで調べると何故かヒットして、なんと Getty Images の素材であることがわかりました。

しかし、日本からそのまま開いてみようとすると何故か画像が見れません。VPN を使って外国 IP にすると見れるようになるので、開いてみると詳細なキャプション付きで見ることができました。

「April 16, 2009」にアフガニスタンの「Camp Bostick」で撮影されたことがわかるので、
フラグは

Diver25{Camp Bostick_2009-04-16}

となります。

✅ advertisement (100pt / 233 solves) [easy]

記事 / Article:
https://web.archive.org/web/20250108154113/https://www.noticiasaominuto.com/mundo/2699746/kyiv-diz-que-russia-usou-como-recrutas-ate-180000-presidiarios
この記事の写真が撮影された場所はどこか。
(回答は座標ピン)

記事の写真を開くと、

が見つかりますが、記事を読んでも特に写真の場所については言及がないです。ロシアなのはまあわかります。

この画像を Google 画像検索に投げ込んでみるとたくさんヒットしたので、めちゃくちゃ使いまわされてる画像みたいなので、上の記事と同様にあんまり場所に関する言及の期待ができないです。

なので今回は真面目に場所を特定しました。まずはヒットした類似画像含めて情報を集めました。

すぐにわかるのは、でかい広告の下にある 「TOK?O-CITY」みたいなテキストです。周辺施設の名前な気がするので、これがわかれば絞りやすそうです。バーガーキングが近くにあるらしいのはわかります。

文字が見やすい画像を探してなんて書いてあるのか ChatGPT に聞きました: https://chatgpt.com/share/6843dc5e-a004-8003-aa91-275471a25596

曰く、

  1. ГОРОДСКИЕ РЕСТОРАНЫ: 直訳すると「都市(市内)のレストランズ」、要するに「City Restaurants(市街地レストラン)」という意味です。
  2. ТОКИО-CITY: 日本の「東京」をロシア語風に書いたあとに英語で “CITY” をつけた店名/チェーン名です。
  3. КОПИ…: おそらくその後に «ЦЕНТР»(ツェントル)が続き、全体で КОПИЦЕНТР(コピーセンター)という意味のはずです。

ですが、「ГОРОДСКИЕ РЕСТОРАНЫ ТОКИО-CITY КОПИЦЕНТР」とかで Google Map 検索しても、Tokyo-City がチェーン店だからか複数ヒットしました 😅

でもそこまで大量にあるわけじゃないし、街並みや他の角度からの画像 も参考にして気合いで絞りました。

回答は、大体ここら辺です↓

https://maps.app.goo.gl/RsWNpCiWdrCoqQ1A9

Tokyo-City とかいう名前のせいで、めちゃくちゃ東京の店がヒットして検索しづらかった...

❌ elevator (499pt / 12 solves) [hard]

これらの写真はあるホテルの客室内と、その窓からの景色を撮影したものである(撮影日は2024年)。
このホテルに設置されたエレベーターには、2件の故障記録が存在しているものが1基ある。 故障日と、> 故障記録があるエレベーターの登録番号を答えよ。
Flag形式: Diver25{YYYYMMDD_YYYYMMDD_1234567}
例えば、登録番号 "1234567" のエレベーターが2000年11月20日と2020年2月13日に故障していた場合、Flagは Diver25{20001120_20200213_1234567} となる。

elevator01.jpg elevator02.jpg
(回答は座標ピン)

東横 INN のホテルということしかわからず、手も足も出ませんでした...

一枚目の画像、一体どういう状況で何が起きているのか全然わからないんですが、崩落や倒壊だとしたら日本でニュースになっているはずだけど、調べても全然ヒットしないし、全然手掛かりを拾えなかったです。
終わってから聞いた話だとどうやら韓国らしいです。東横 INN が海外にもあるんですね... (鏡のシールは日本語なのに...)

❌ hole (449pt / 72 solves) [medium]

この穴があった場所はどこか。
(回答は座標ピン)

水溜まり?の場所を特定するのかと一瞬ギョッとするんですが、サイズが書かれていたり、右下に「使用飞跃功能时,请遵守官方功能操作指示 (飛躍機能を使用する際は、公式の操作指示に従ってください。)」と書いてあるので、何かしら水溜まりをジャンプするような商品の説明に使われているんだろうと推測できます。

翻訳は ChatGPT がやってくれました: https://chatgpt.com/share/68454356-bc00-8003-a88e-831c7aef551e

Google 画像検索に投げてみると、いくつか(1, 2 等) 記事がヒットしますが、どれも内容は同じで、中国の車メーカー BYD の新製品 YangWang U9 EV のプロモーションビデオの1シーンだったことがわかります。

https://www.youtube.com/watch?v=zIKAn8yDkpA

ジャンプができる車で、水たまりはジャンプ性能を示すために使われていたわけですね。

動画を注意深く見てみると、

  • 山西省大同市標高 1035 m の場所で撮影された
  • 周りはめちゃくちゃ平地で、遠くに山が見える
  • 道路が正方形のタイルで敷き詰められている

みたいなことがわかります。動画内に地名が出ているのがありがたいですね。
ただ、初めは何か私有地の試走場なのかなと思っていたので、これだけの情報だと場所を絞れませんでした。ダメもとで、地名が写っているカットを Gemini に渡して DeepResearch させて見ました。


PVのスクリーンショット

すると、Gemini が「幻の空港『大同南関空港』」とかいうのを推してきたのですが、幻はともかく、言われてみれば空港の可能性は高いなと思いました。
というのも、大同あたりの空港の滑走路の地面を見てみると、動画の地面みたいに、正方形のタイル張りっぽいことに気づきます。


大同雲岡機場 の滑走路の地面。四角いタイルっぽく見える。

なので、付近の滑走路の可能性が高いだろうなとは思えたのですが、普通に滑走路を見つけられなかったです。

✅ night_street (428pt / 86 solves) [hard]

画像の中心に写っている茶色の2階建ての建物に入る施設の正式名称を現地語表記で答えなさい。
Flag形式: Diver25{施設名}(例: Diver25{お台場海浜公園前郵便局})
注意: この問題を解く際、外部サイトへの機械的なアクセスやスクレイピングは禁止します。また、それらを行う必要はありません。 ただし、ブラウザから手動で取得できる情報や、公開されているAPIサービスやデータセットの利用は問題ありません。

シンプルに場所を特定する問題でした。

左の赤い屋根の建物は、「冷や」という旗が見えるので、チェーンのファミレスだろうというのはわかりましたが、リンガーハットを知らなかったので、リンガーハットだということに気づくまでだいぶ手間がかかりました。
ちなみに、ChatGPT o4-mini-high は赤い屋根のことを「デニーズ」、Gemini は「韓国の賑やかな街で撮影された可能性が高い」と言ってきました。AI に立場を奪われるのはまだまだ先のようです。

隣の建物は「???クリニック」と書かれているのはわかりますが、漢字の部分が潰れていて読めそうにありません。

なので情報を得るために、とりあえず赤い建物だけクロップして Google 画像検索にかけたところ、次のブログ記事がヒットし、記事内容から建物がリンガーハットだとわかりました。

https://ameblo.jp/accent0802/entry-12641878417.html

しかし、リンガーハットだとわかってもすぐに写真の場所がわかるわけではありませんでした。何せチェーン店なので、有限と言っても数百店舗あるので手動でブルートフォースするとえらく疲れます。


リンガーハットの店舗検索画面スクリーンショット

しかし他に方法が思いつかなかったので疲れるまで日本の端から手動でチェックしていきました。しばらくしたら疲れたのでやめました

店舗の外観だけわかれば判断できると思ったので、外観だけいっぱい揃ってるサイトないかな〜と「リンガーハット 店舗 外観」で検索したところ、リンガーハットの公式サイトに「ピックアック店舗」という特集があり、いくつかの店の外観がまとめて見れるとわかりました。

https://www.ringerhut.jp/pickup/back_number.php

運が良ければここで見つけられて、運が悪かったら大人しく OpenStreetMap か何かかな〜と思いながらスクロールしていたら、運が良かったのですぐ見つかりました。


リンガーハット ピックアップ店舗のスクリーンショット

名古屋の弥富通の店だそうです。店名のライトや屋根の外観がそっくりですね。(リンガーハットだとわかる前は、ライトの「ん」をアルファベットの「h」と見間違えていて、英語系の店名なのかなと思っていました。)

ストリートビューを確認すると、


https://maps.app.goo.gl/CveUjsCpJSmzanKi9

隣の建物もあっているようです。クリニックの名前は弥富通クリニックでした。

フラグはお隣の建物の名前で、

Diver25{弥富通クリニック}

です。

❌ what3slashes (446pt / 75 solves) [medium]

この画像が撮影されたとき、正面に家が3軒、右手に家が1軒あった。
それから少し経った、ある月の初旬にこの場所にもう一度訪れてみた。そのときには、正面左側に家が1軒増えていて、正面右側にもう1軒が建設中であった。その時点で、建設中の家に屋根はなかったが、黒っぽい屋根を作る予定だという。
「ある月の初旬」とは何年の何月のことだろうか。
Flag形式 : Diver25{YYYY/MM} (e.g. Diver25{2025/06})

タイトルと、写真に写っている三つのスラッシュから、what3words が連想できます。もし連想できなくても、LLM に突っ込めば教えてくれます:
Gemini に突っ込むと、

  • このカードはモンゴル郵便what3words 住所
    • 番地とかの実装がされてないので代わりに三つの単語の組み合わせで座標を表現して、そこに配達する

また、画像を Google 画像検索すると what3words の公式記事に辿り着きます。

https://what3words.com/de/partner/mongol-post

画像のカードもどこかの住所を表していると思うんですが、書き起こすと多分

///Бумба.Цогц.Баталгав? になるので、多分 ここ になるんですが、お題の画像の状態と似つかないので微妙な感じ...

時間が経ったせいで見た目が変わった可能性もあるんですが、ストリートビューが1年分しかなく、めんどかったので他の衛生画像の調査まで手が回らず...

だいぶ面倒なステップ踏みそうだったのでスキップしました。解法がイメージできなかったです。

✅ convenience (462pt / 63 solves) [easy]

青森県内に、公園とコンビニ、スーパーマーケットが互いに約100m圏内に存在する場所がいくつかある。また、これはOpenStreetMapで確認可能である。
この条件を満たす 公園 のうち、最南端 のものについて、OpenStreetMap上での Way Number を答えよ。
なお、「公園」の定義は、OpenStreetMap上で "park" (leisure=park) と分類されているものに準拠する。
Flag形式: Diver25{123456789}

この問題は Claude 4 Sonnet が 8 割やりました。

まず、問題から OpenStreetMap を使えそうだとわかるので、 OpenStreetMap のデータを使ってフィルタリングする処理を実装するだけで済みそうです。「OpenStreetMap Python」などで検索すると参考になる記事がいくつかヒットします:

https://qiita.com/nokonoko_1203/items/823abd6920553ee5f457

https://qiita.com/Bulgent/items/518a3bfa08eb9bdef476

https://zenn.dev/prog24/articles/a80a0aeae27845

とにかく、Python から OpenStreetMap のデータを取得して、距離などに応じたフィルタリングができそうだとわかります。

https://claude.ai/share/ac8d1bf4-f626-4b9c-97ae-76b83180422d

同時並行で Gemini 2.5 Pro にも書かせていたんですが、あっちは残念なことに実行時エラーを直せなかったものの、青森県の範囲指定方法が Claude よりもスマートだったりしたので、いいとこ取りするように途中で指示を挟みました。

最終的なコードは以下です。

`convenience.py`

この記事で登場する最初で最後のコード

import overpy
import math
from geopy.distance import geodesic
import pandas as pd

def haversine_distance(lat1, lon1, lat2, lon2):
    """2つの座標間の距離をメートル単位で計算"""
    R = 6371000  # 地球の半径(メートル)
    
    lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2])
    dlat = lat2 - lat1
    dlon = lon2 - lon1
    
    a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
    c = 2 * math.asin(math.sqrt(a))
    
    return R * c

def calculate_geometry_radius(way):
    """Wayオブジェクトから内接円の半径を計算"""
    # ジオメトリデータが利用可能かチェック
    if not hasattr(way, '_nd_ids') or not way._nd_ids:
        return 20  # デフォルト値(小さな建物想定)
    
    try:
        # ジオメトリが'out geom'で取得されている場合、座標データを直接使用
        coords = []
        
        # way.get_nodes()でノードを取得しようとする
        try:
            nodes = way.get_nodes(resolve_missing=False)
            for node in nodes:
                if hasattr(node, 'lat') and hasattr(node, 'lon'):
                    coords.append((float(node.lat), float(node.lon)))
        except:
            # ノードが解決できない場合は、デフォルト半径を返す
            return 20
        
        if len(coords) < 2:
            return 20
        
        # 重心を計算
        center_lat = sum(lat for lat, lon in coords) / len(coords)
        center_lon = sum(lon for lat, lon in coords) / len(coords)
        
        # 重心から最も遠いノードまでの距離を半径とする
        max_distance = 0
        for lat, lon in coords:
            distance = haversine_distance(center_lat, center_lon, lat, lon)
            max_distance = max(max_distance, distance)
        
        return max_distance if max_distance > 0 else 20
    
    except Exception as e:
        # エラーが発生した場合はデフォルト値を返す
        return 20

def get_aomori_data():
    """青森県内の公園、コンビニ、スーパーマーケットのデータを取得"""
    api = overpy.Overpass()
    
    print("公園データを取得中...")
    # 公園の取得(青森県内を明示的に指定)
    parks_query = """
    [out:json][timeout:120];
    area["name"="青森県"]["admin_level"="4"]->.aomori;
    (
      way["leisure"="park"](area.aomori);
      relation["leisure"="park"](area.aomori);
      node["leisure"="park"](area.aomori);
    );
    out geom center;
    """
    parks_result = api.query(parks_query)
    
    print("コンビニデータを取得中...")
    # コンビニの取得
    convenience_query = """
    [out:json][timeout:120];
    area["name"="青森県"]["admin_level"="4"]->.aomori;
    (
      node["shop"="convenience"](area.aomori);
      way["shop"="convenience"](area.aomori);
    );
    out geom center;
    """
    convenience_result = api.query(convenience_query)
    
    print("スーパーマーケットデータを取得中...")
    # スーパーマーケットの取得
    supermarket_query = """
    [out:json][timeout:120];
    area["name"="青森県"]["admin_level"="4"]->.aomori;
    (
      node["shop"="supermarket"](area.aomori);
      way["shop"="supermarket"](area.aomori);
    );
    out geom center;
    """
    supermarket_result = api.query(supermarket_query)
    
    return parks_result, convenience_result, supermarket_result

def extract_coordinates_with_geometry(result):
    """OSMの結果から座標とジオメトリの半径を抽出"""
    facilities = []
    
    # ノードから座標を取得(半径は0)
    for node in result.nodes:
        facilities.append({
            'id': node.id,
            'lat': float(node.lat),
            'lon': float(node.lon),
            'name': node.tags.get('name', '名前なし'),
            'type': 'node',
            'radius': 5  # ノードでも小さな半径を設定
        })
    
    # ウェイから中心座標とジオメトリ半径を取得
    for way in result.ways:
        if hasattr(way, 'center_lat') and hasattr(way, 'center_lon'):
            # ウェイのジオメトリから半径を計算
            radius = calculate_geometry_radius(way)
            
            facilities.append({
                'id': way.id,
                'lat': float(way.center_lat),
                'lon': float(way.center_lon),
                'name': way.tags.get('name', '名前なし'),
                'type': 'way',
                'radius': radius
            })
        else:
            # center座標が無い場合は、最初のノードの座標を使用
            try:
                nodes = way.get_nodes(resolve_missing=False)
                if nodes and len(nodes) > 0:
                    first_node = nodes[0]
                    if hasattr(first_node, 'lat') and hasattr(first_node, 'lon'):
                        radius = calculate_geometry_radius(way)
                        facilities.append({
                            'id': way.id,
                            'lat': float(first_node.lat),
                            'lon': float(first_node.lon),
                            'name': way.tags.get('name', '名前なし'),
                            'type': 'way',
                            'radius': radius
                        })
            except:
                # ノードが取得できない場合はスキップ
                continue
    
    # リレーションから中心座標を取得
    for relation in result.relations:
        if hasattr(relation, 'center_lat') and hasattr(relation, 'center_lon'):
            # リレーションの場合、構成要素のサイズに基づいて半径を推定
            radius = 100  # 大きな施設として扱う
            
            facilities.append({
                'id': relation.id,
                'lat': float(relation.center_lat),
                'lon': float(relation.center_lon),
                'name': relation.tags.get('name', '名前なし'),
                'type': 'relation',
                'radius': radius
            })
    
    return facilities

def calculate_facility_distance(facility1, facility2):
    """2つの施設間の実際の距離を計算(ジオメトリを考慮)"""
    # 中心間の距離を計算
    center_distance = haversine_distance(
        facility1['lat'], facility1['lon'],
        facility2['lat'], facility2['lon']
    )
    
    # 実際の距離は中心間距離から両方の半径を引いた値
    actual_distance = center_distance - facility1['radius'] - facility2['radius']
    
    # 負の値になった場合は0とする(施設が重なっている場合)
    return max(0, actual_distance)

def find_nearby_facilities(parks, convenience_stores, supermarkets, max_distance=100):
    """互いに100m圏内にある公園・コンビニ・スーパーを見つける(ジオメトリ考慮)"""
    results = []
    
    print(f"分析中: 公園{len(parks)}件, コンビニ{len(convenience_stores)}件, スーパー{len(supermarkets)}件")
    
    for i, park in enumerate(parks):
        if i % 10 == 0:
            print(f"進捗: {i}/{len(parks)} 公園を処理中...")
        
        # 近くのコンビニを探す
        nearby_convenience = []
        for conv in convenience_stores:
            distance = calculate_facility_distance(park, conv)
            if distance <= max_distance:
                nearby_convenience.append((conv, distance))
        
        # 近くのスーパーを探す
        nearby_supermarket = []
        for super_store in supermarkets:
            distance = calculate_facility_distance(park, super_store)
            if distance <= max_distance:
                nearby_supermarket.append((super_store, distance))
        
        # 公園の近くにコンビニとスーパーの両方がある場合
        if nearby_convenience and nearby_supermarket:
            # さらに、コンビニとスーパーが互いに100m圏内かチェック
            for conv, conv_dist in nearby_convenience:
                for super_store, super_dist in nearby_supermarket:
                    conv_super_distance = calculate_facility_distance(conv, super_store)
                    
                    if conv_super_distance <= max_distance:
                        results.append({
                            'park': park,
                            'convenience': conv,
                            'supermarket': super_store,
                            'park_conv_distance': conv_dist,
                            'park_super_distance': super_dist,
                            'conv_super_distance': conv_super_distance,
                            'park_lat': park['lat'],
                            'park_lon': park['lon']
                        })
    
    return results

def main():
    try:
        # データを取得
        parks_result, convenience_result, supermarket_result = get_aomori_data()
        
        # 座標とジオメトリを抽出
        parks = extract_coordinates_with_geometry(parks_result)
        convenience_stores = extract_coordinates_with_geometry(convenience_result)
        supermarkets = extract_coordinates_with_geometry(supermarket_result)
        
        print(f"取得完了: 公園{len(parks)}件, コンビニ{len(convenience_stores)}件, スーパー{len(supermarkets)}件")
        
        # ジオメトリ情報の統計を表示
        park_radii = [p['radius'] for p in parks if p['radius'] > 5]
        if park_radii:
            print(f"公園の平均半径: {sum(park_radii)/len(park_radii):.1f}m (最大: {max(park_radii):.1f}m, 最小: {min(park_radii):.1f}m)")
        
        conv_radii = [c['radius'] for c in convenience_stores if c['radius'] > 5]
        if conv_radii:
            print(f"コンビニの平均半径: {sum(conv_radii)/len(conv_radii):.1f}m")
        
        super_radii = [s['radius'] for s in supermarkets if s['radius'] > 5]
        if super_radii:
            print(f"スーパーの平均半径: {sum(super_radii)/len(super_radii):.1f}m")
        
        # 近接する施設を検索
        nearby_results = find_nearby_facilities(parks, convenience_stores, supermarkets)
        
        if not nearby_results:
            print("条件を満たす場所が見つかりませんでした。")
            return
        
        print(f"\n条件を満たす場所が{len(nearby_results)}件見つかりました。")
        
        # 最南端(最小緯度)の公園を見つける
        southernmost = min(nearby_results, key=lambda x: x['park_lat'])
        
        print("\n=== 最南端の公園 ===")
        print(f"公園名: {southernmost['park']['name']}")
        print(f"座標: {southernmost['park_lat']:.6f}, {southernmost['park_lon']:.6f}")
        print(f"公園ID: {southernmost['park']['id']} ({southernmost['park']['type']})")
        print(f"公園の半径: {southernmost['park']['radius']:.1f}m")
        
        print(f"\n近くのコンビニ: {southernmost['convenience']['name']}")
        print(f"  実距離: {southernmost['park_conv_distance']:.1f}m")
        print(f"  コンビニ半径: {southernmost['convenience']['radius']:.1f}m")
        
        print(f"\n近くのスーパー: {southernmost['supermarket']['name']}")
        print(f"  実距離: {southernmost['park_super_distance']:.1f}m")
        print(f"  スーパー半径: {southernmost['supermarket']['radius']:.1f}m")
        
        print(f"\nコンビニ-スーパー実距離: {southernmost['conv_super_distance']:.1f}m")
        
        # Google Mapsリンクを生成
        maps_url = f"https://www.google.com/maps/@{southernmost['park_lat']},{southernmost['park_lon']},17z"
        print(f"\nGoogle Maps: {maps_url}")
        
        # 全結果をDataFrameで表示
        if len(nearby_results) > 1:
            print(f"\n=== 全{len(nearby_results)}件の結果(緯度順) ===")
            df_results = []
            for result in sorted(nearby_results, key=lambda x: x['park_lat']):
                df_results.append({
                    '公園名': result['park']['name'],
                    '緯度': f"{result['park_lat']:.6f}",
                    '経度': f"{result['park_lon']:.6f}",
                    'コンビニ': result['convenience']['name'],
                    'スーパー': result['supermarket']['name'],
                    '公園-コンビニ(m)': f"{result['park_conv_distance']:.1f}",
                    '公園-スーパー(m)': f"{result['park_super_distance']:.1f}",
                    'コンビニ-スーパー(m)': f"{result['conv_super_distance']:.1f}",
                    '公園半径(m)': f"{result['park']['radius']:.1f}"
                })
            
            df = pd.DataFrame(df_results)
            print(df.to_string(index=False))
    
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        print("インターネット接続とOverpass APIの状態を確認してください。")
        print("青森県のデータが見つからない場合は、クエリの地域名を確認してください。")

if __name__ == "__main__":
    # 必要なライブラリのインストール方法
    print("必要なライブラリ:")
    print("pip install overpy geopy pandas")
    print("\n実行中...\n")
    
    main()

実行すると、

公園データを取得中...
コンビニデータを取得中...
スーパーマーケットデータを取得中...
取得完了: 公園910件, コンビニ548件, スーパー285件
公園の平均半径: 20.2m (最大: 100.0m, 最小: 20.0m)
コンビニの平均半径: 20.0m
スーパーの平均半径: 20.0m
分析中: 公園910件, コンビニ548件, スーパー285件
進捗: 0/910 公園を処理中...
進捗: 10/910 公園を処理中...
... 略
進捗: 900/910 公園を処理中...

条件を満たす場所が7件見つかりました。

=== 最南端の公園 ===
公園名: 扇町緑地
座標: 40.584433, 140.500164
公園ID: 759381890 (way)
公園の半径: 20.0m

近くのコンビニ: セブン-イレブン
  実距離: 46.6m
  コンビニ半径: 20.0m

近くのスーパー: いとく
  実距離: 69.2m
  スーパー半径: 20.0m

コンビニ-スーパー実距離: 55.6m

となり、知りたい公園は 扇町緑地 です。実際に周囲のコンビニ・スーパーを探すと確かに近くにあるのがわかると思います。

https://maps.app.goo.gl/5zaXKXBP73ED159N9

フラグは Way 番号なので、OpenStreetMap で取得して、

Diver25{759381890}

となります。

✅ Talentopolis (472pt / 53 solves) [medium]

記事 / Article:
https://www.guineaecuatorialpress.com/noticias/primera_edicion_de_talentopoli
"Primera edición de Talentopolis" という記事内に登場するステージの位置を答えよ。

情報収集


モザイクは筆者が加工。出典: 赤道ギニア広報情報事務所 https://www.guineaecuatorialpress.com/noticias/primera_edicion_de_talentopoli .

この画像に写ったステージの場所を特定するタスクです。記事をちゃんと真面目に読むと、

マラボーのサン・フアン地区では9月7日(土)の午後、JPLエージェンシー(若手リーダーシップ育成プログラム)が主催する 「タレントポリス」イベント が開催されました。このイベントは、赤道ギニアの若者たちの身体的・知的・芸術的能力を披露することを目的としています。
この活動は、赤道ギニアの若者たちに健康的な生活習慣を身につけるよう促すとともに、犯罪以外の選択肢があることを理解してもらうことも目的としています。
イベントでは、ダンス、詩、数学計算などの様々なスキルが披露されました。
タレントポリスの活動範囲は全国規模で、サン・フアン地区に続き、他の都市部でも開催される予定です。このイベントは月に2回、月初めと月末に行われる計画です。初回は月初め、2回目は月末に開催される予定です。
ソース: 赤道ギニア広報情報事務所
訳: PLaMo翻訳

このイベントは「タレントポリス (Talentopolis)」で、Malabo の San Juan 地区 で行われたと書かれています。Malabo の San Juan 地区 です。また、JPL エージェンシーが主催するとも書いてあるので、写真の後ろの JP? は JPL だとわかります。

また、記事の左側の写真アイコンがついたボタン (Ver la galería) をクリックすると、さらに追加で2枚写真を見つけることができます。そのうちの一つは、


モザイクは筆者が加工。出典: 赤道ギニア広報情報事務所 https://www.guineaecuatorialpress.com/noticias/primera_edicion_de_talentopoli

この写真で JPL エージェントのロゴがはっきり見えました。

また、垂れ幕をクロップして、「Talentopolis」と一緒に Google 画像検索 にかけると JPL エージェンシーの Instagram 投稿がヒットして広報アカウントがわかります。(これは結局使わなかったですが)

他にも、「jpl events talentopolis」でググると JPL エージェンシーの Facebook アカウントが見つかります。写真タブ を開いて、少し古めの写真を探すと、初回 Talentopolis の予告画像が見つかります。(Facebook 未ログインでもリロード頑張ると、ログインしてくださいのポップアップを耐えられる)。
こんな画像がありました。(類似画像がいくつかありますが、内容は全く同じでした)

こんなことが書いてあります (Gemini):

イベント名: TALENTÓPOLIS "Primer Acto del ATERRIZAJE DE LAS ESTRELLAS" (タレントポリス 「星たちの着陸・第一幕」)
開催日時: 9月7日 15:00
場所: A2- SAN JUAN (Malabo) (マラボのサンフアン地区)
参加したい場合: 222... の電話番号に電話

となっており、記事の内容と一致するイベントについて、場所についての言及に A2- が加わりました。(A2の意味は最終的に終わってから気づきました 😅)

この情報だけだとまだ心許ないので、「Talentopolis 2024 san juan」でググって、さらなる詳細情報や写真がないか探すと、ヒットしました。

https://ahoraeg.com/cultura/2024/09/10/inicia-el-proyecto-talentopolis-en-el-barrio-san-juan-de-esta-ciudad-capital/

(モザイクかけるの面倒なので各自でアクセスしてみてください)

嬉しい wide-shot な画像が見つかりました。いろんな角度からの写真があるので、周囲の建物や街の構造が少しイメージできそうです。周囲の状態を書き起こしてみました:


筆者作

イメージがはっきりしてきましたね!!!
(当時は自分のイメージ用に書いたのでもっと簡素でした)

場所の特定

さて、ここまで情報が揃ったので Google Map と睨めっこです。

まず、Malabo San Juan を探します。いやらしいのが、地球の円周 1/4 くらい離れた距離のところに、そこそこ大きめな San Juan と Malabo の都市があるせいで、航空ルートを推薦されますが、頑なに 「Malabo San Juan」を突き通していきます。先に Malabo を検索してから、周辺検索などで San Juan 地区を探すとやりやすいです。

頑張って San Juan の名前を探すと、San Juan が名前に入った学校などが見つかります。なので、この辺りが San Jaun 地区だと思うので、この辺りで先ほどイメージした構造を探しました。

探すのは割と時間がかかったのですが、最終的に似た形の構造物が集まっている付近を探すと、写真と似ている屋根の色や草に向かっている道が一致することから、ステージの場所が特定されます。


https://maps.app.goo.gl/pjz7VQQrSXH6CoEW8

フラグは星で示した場所の座標です。

Facebook の情報から得られた A2 というのは、団地の棟の番号 のことだったようです。

Gemini に記事の画像を与えて DeepResearch をさせてみましたが、特定には至りませんでした。JPLJP だと思い込んでいたようなので、その間違いがなかったらもう少しいい調査ができてたかもしれませんが...

🟨 recon

問題ごとに少しずつ繋がりがあるタイプの問題です。
最初の 00_engineer は他の問題の前提情報になるので必須ですが、それ以外は特に解く順番は決まっていません。

今回は読みやすい順に並べているので、数字と順序が一致していません。

全体的にアカウント情報見つけるのがむずかしかった...

✅ 00_engineer (100pt / 346 solves) [easy]

東京駅の近くでソフトウェアエンジニアの名札を拾った。おそらく落とし物だろう。
このエンジニアが勤務している会社のWebサイト(トップページ)のURLを答えよ。
Flag 形式: Diver25{https://google.com}

まず確認するのは名札に書いてあるユーザー名でしょう。ユーザー名を見かけたら脊髄反射で whatsmyname にかけて、同じ ID で登録している SNS アカウントを探します。

しかし何故か偽陽性以外のヒットがゼロで、颯爽と手がかりを失いここで一度試合終了しました。
TECH MEET? から探そうとしていたけど、マジでぜんぜん関係なかった...

しばらく放置した後にダメもとで Gemini に DeepResearch させたら普通に Twitter アカウントGitHub アカウント を掘り出してきたので横転してました。(おそらく会社のサイトはエージェントのアクセスがブロックされていたので、会社名はハルシネーションした)

https://x.com/kodai_sn

https://github.com/kodai-sn

Twitter はまあ 1 文字 ID 違うからいいとしても、GitHub はなんで whatsmyname 引っ掛からなかったんだ...

これによってポートフォリオサイト会社名メールアドレスが判明しました。

  • ポートフォリオサイト: https://kodai-sn.github.io/
  • 会社名: Magneight Software
    • CEO: Mizuki Sekozaki (Google 検索結果ゼロでびっくり)
  • メールアドレス: kodaisn.development@gmail.com (git のコミット履歴から見れます)

今回のフラグは会社の URL なので、Magneight Software の Web サイトを探す必要があります。
ググるとヒットします。

https://magneight.com/index.html

フラグは

Diver25{https://magneight.com}

です。

Gemini に救われました...

✅ 03_ceo (302pt / 142 solves) [medium]

"00_engineer" の問題で見つかった会社の、CEOのメールアドレス(Gmail)を答えよ。
Flag 形式: Diver25{example@gmail.com}

Kodai さんのツイートを漁ると、SpeakerDeck のスライドが見つかります。

https://x.com/kodai_sn/status/1895844067323629964

https://speakerdeck.com/kodaisn/git-hands-on-updated

新旧の二種類あるが、本当にフォントしか違わないっぽい...?

ここで、レポジトリをフォークして〜の話があるので、実際に kodai-sn のレポのフォーク を見ると、

Mizuki CEO がフォーク していたので GitHub アカウントが特定でき、メアドも判明しました。

https://github.com/mizuki1206edelweiss

  • メアド: mizuki1206anemone@gmail.com

フラグは

Diver25{mizuki1206anemone@gmail.com}

です。

後から聞いた話だと、SpeakerDeck のスライドに白い文字で CEO のメアドが埋め込まれていたらしく(なぜ!?)、それを答えても正解になるそうです。
PDF ダウンロードしたけど気づかなかった... LLM に投げてれば読んでくれたかもしれませんね。

✅ 04_internal (416pt / 93 solves) [medium]

"00_engineer" の問題で見つかった会社では、Webブラウザからアクセス可能な社内用のDevOpsプラットフォームが運用されている。
そのシステムのバージョン名を、表記されている通りに答えよ。
Flag 形式: Diver25{135.0.1-f2+nightly}

うっかり公開しているサイトを探せと言われたら脊髄反射で Censys を開きます。

とりあえず何も考えずに magneight.com で検索すると、ヒットします。

詳細を開いてスクロールすると、ポート 3000/TCPGitea のサーバー が公開されているのがわかります。

https://search.censys.io/hosts/202.212.71.93?resource=hosts&sort=RELEVANCE&per_page=25&virtual_hosts=EXCLUDE&q=magneight.com&at_time=2025-06-07T23%3A48%3A13.767Z

IP とポート指定でアクセスできました: http://202.212.71.93:3000/

フラグとなる Gitea バージョンは、フッターに書いてありました: 1.24.0+dev-303-gd88b012525

フラグは、

Diver25{1.24.0+dev-303-gd88b012525}

です。

ちなみに、Censys に IP を入れると、その IP で公開されているドメインを知ることができます。
今回は、magn8soft.tokyo というドメインの存在を知ることができました。(が、私は有効に使うことはできなかった...)

❌ 01_asset (473pt / 53 solves) [easy]

"00_engineer" の問題で見つかった会社のCEOが持っていたスマートフォンの資産番号を答えよ。
Flag 形式: Diver25{ABCD-12345}

判明している CEO の情報は、

  • 名前: Mizuki Sekozaki
  • GitHub: mizuki1206edelweiss
  • メールアドレス: mizuki1206anemone@gmail.com

です。とりあえず GitHub ユーザー名を whatsmyname に突っ込んでみましたが、何もヒットしなかったので、SNS やってない系か〜っと思って手がかりなくなって詰みました。

後から知ったんですが、インスタのアカウントがあり、そこから探れるらしいです。なぜ whatsmyname に引っ掛からなかったのか...

kodai-sn でも引っ掛からなかったことを踏まえて、多少は手動で捜査すべきでしたね... でもインスタアカウント持ってなかったからどっちにしろ気づけなかったかも...

❌ 02_recruit (488pt / 37 solves) [medium]

"00_engineer" の問題で見つかった会社で、採用を担当していると思われる人物の氏名を答えよ。
Flag 形式: Diver25{Shigeru Ishiba} (ローマ字表記)

採用担当どこにいるの!?
何も手がかり得られなくて何もできませんでした。

❌ 05_designer (500pt / 7 solves) [hard]

"00_engineer" の問題で見つかった会社のWebサイトを手がけたデザイナーの連絡先(メールアドレス)を答えよ。
Flag 形式: Diver25{foo.bar@example.com}

Kodai さんが Twitter でデザイナーと銭湯に行ったことについて言及していたので、SNS 経由で手繰れるのかと思ったのですが、全然違うようでした...

https://x.com/kodai_sn/status/1896903452485423370

特に何もできなかったです。

❌ 06_leaked (499pt / 12 solves) [medium]

"00_engineer" の問題で見つかったソフトウェアエンジニアのパスワードが漏洩して公開されてしまったらしい。彼はパスワードを変更して事なきを得たようだが、漏洩したパスワードは何だっただろうか。
Flag 形式: Diver25{his_password}

Kodai さんが SpeakerDeck に上げているスライドで、practice-fork というレポに三つ目のコミットが写っているのに対して、GitHub 上では二つしかなかったので、公開されたクレデンシャルどうにか探してくるものだと思ってたんですが、全然違ったようです。

後から聞いた話だと Pastebin だったらしいです。パスワードをそんなところに置く発想が無かったので全く思いつかなかった...

https://pastebin.com/eHzc8rmB

🟨 transportation

電車や航空、船舶など、交通手段に関する問題です。

✅ 36_years_ago (347pt / 125 solves) [easy] @tkgstrator

このニュース動画に映っている航空機に、1989年8月時点で割り当てられていたトランスポンダのMode Sコードを16進数表記で答えてください。
https://www.youtube.com/watch?v=OvR2O_Vpwc0
Flag形式: Diver25{1234AB}

動画は、日本のニュース動画で、飛行機がなぜか離陸せずに崖から落ちてしまう事故について言及されています。

飛行機の尾翼あたりにアルファベットと数字が見えると思いますが、あれは飛行機の機体記号です。

最初、事故機の機体記号を JA4210 だと思い込んでおり、全然解けずにいました。@tkgstrator が実際の事故機は JA4098 だと指摘してくれたのでちゃんと進められるようになりました。

JA4098 でググると、 日本法人所有が所有していた、Cessna 172P Skyhawkで、製造番号が 17276610 だとわかりました。

https://flyteam.jp/registration/JA4098

今回知りたいのは、現在の情報じゃなくて36年前の情報なので、過去の情報を探る必要があります。

日本の航空機体の登録履歴を検索できる JA Search で「JA4098」を検索すると、以前の機体記号が N9768L だとわかります。(機体記号 は国を跨いで売買されると変更されます。)

https://jasearch.info/aircraft_hist.html?r_number=JA4098&r_series=1

2024年12月26日に登録が抹消されていて、事故があった事実と一致しています。

ここから地味に苦労したのが、N9768L の Mode S コードが全く見つからなかったです。

AviationDB というサイトに載っている、CESSNA の Mode S Code は 53316552 (おそらく10進数) とあったのですが、16進数にした Diver25{32D8BC8}Diver25{53316552} も正解にならなかったです。

https://www.aviationdb.com/Aviation/Aircraft/9/N9768L.shtm

FAA というアメリカ公式の飛行機の登録について検索できるサイトがあるんですが、N9768L の登録は抹消されていたので、情報がありませんでした。

https://registry.faa.gov/aircraftinquiry/Search/NNumberResult?NNumberTxt=9768L

どうにかこうにかして @tkgstrator が見つけてくれたのが、↓のサイトでした。

https://airport-data.com/aircraft/N9768L.html

Mode S (ICAO24) Code: AD9D6A

とあったので、

Diver25{AD9D6A}

とすると、正解でした。

今改めて DuckDuckGo から「"N9768L" mode s code」で検索をかけたら、FlightRader のページがトップに出てきて、普通に MODE S: AD9D6A と書いてありました。なぜだ...

https://www.flightradar24.com/data/aircraft/n9768l

❌ air2air (495pt / 24 solves) [medium]

動画 / Video:
https://www.youtube.com/watch?v=wUa5TGj6uxc
(無音です / No audio)
この動画は2025年3月11日(現地時間)に撮影された。遠くに映っている航空機のコールサインと機体記号を答えよ。
(撮影者が搭乗している航空機ではない)
Flag形式: Diver25{コールサイン_機体記号}(例: Diver25{ANA0183_JA381A})

https://www.youtube.com/watch?v=wUa5TGj6uxc

動画を見ると以下の情報がわかりました:

  • 撮影者は飛行機に乗っており、座席 40A から撮影
    • 大きい機体の後ろの方に座っている (ボーイング?)
  • 飛行ルートを見ると、TPE (台湾桃園国際空港) へ飛ぶ
    • 出発の空港は不明だが、角度的におそらく関西国際空港 (KIX)?これじゃなくてもそんなに候補が多くない
  • 撮影時はおそらく航行の真ん中くらい
  • 動画の初めの方で、窓から上側にを撮影していて、遠くに飛行体が写っている (これが目的の機体)

おそらくやることとしては、

  1. 乗ってる飛行機の種類の特定
  2. フライトの特定
  3. FlightAware か何かで上空を飛んでる飛行機の特定

をやるんだと思いますが、飛行機の特定がすんなり行かなかったので飛ばしました。
(翼の様子からすぐわかるかなと思ったんですが、あんまり似たようなのが見つからず... 飛行機詳しくなくて時間浪費しそうだったので飛ばした)

✅ next_train (100pt / 245 solves) [easy]

この音声が録音された駅はどこか。駅名を答えよ(日本語でも英語でも可)。
(駅名は鉄道会社の公式サイトやWikipediaに記載されている表記とする)
Flag形式: Diver25{京都駅}

Zenn に音声ファイル上げられないので、代わりに writeup 用に作成した Gemini 渾身の書き置きしを置いておきます:

音声内容

はい、承知いたしました。動画から聞こえる会話やアナウンス、環境音について詳細に書き起こします。

これはJR品川駅の15番線ホーム(横須賀線・総武線快速)で録音された音声です。


音声の書き起こし(時系列)

00:00 - 00:02

  • 駅アナウンス(英語): 「...at the closing doors.(...アット ザ クロージング ドアーズ)」
    • ※「ドアが閉まりますのでご注意ください(Please stand clear of the closing doors.)」というアナウンスの末尾部分だと思われます。

00:04 - 00:11

  • 環境音: 電車がホームに入線してくる「ガタン、ゴトン」という走行音と、ブレーキがかかる際の「キーッ」という高い金属音が聞こえます。

00:18 - 00:19

  • 駅アナウンス(日本語): 「15番線の電車は…」

00:20 - 00:29

  • 子供の声: (少し離れた場所から、電車に向かって叫んでいるような元気な声で、繰り返し)
    • 「また来てくれてありがとう!」
    • 「また来てくれてありがとう!」
    • 「また来てくれてありがとう!」

00:30 - 00:33

  • 環境音: 隣の線路を別の電車が通過していく「ゴーーーッ」という大きな走行音が聞こえます。

00:36 - 00:51

  • 駅アナウンス(日本語): 「JR東日本をご利用くださいまして、ありがとうございます。15番線の電車は、14時16分発、普通電車、久里浜(くりはま)行きです。」

00:52 - 01:06

  • 駅アナウンス(英語): "Thank you for riding with JR East. The next train from track number 15 will be the 2:16 PM local train bound for Kurihama."
    • (訳:JR東日本をご利用いただきありがとうございます。15番線から次に発車する電車は、午後2時16分発、久里浜行きの普通列車です。)

01:08 - 01:10

  • 駅アナウンス(日本語): 「この電車は15両です。」

結論から言うと、品川駅のアナウンスでした。

最近の Gemini はカラオケ音声の評価もやってくれると聞いたことがあったので、試しに Google AI Studio の Gemini に頼んでみたら、が一発で当ててくれました。(一般の Gemini は音声ファイルをアップできませんが、Google AI Studio は無料で利用可能で、Pro 系も使えます。)

Thoughts の日本語訳

(翻訳は PLaMo)

音声の発信源を特定する

現在、音声の発信源を特定することに重点を置いて調査を進めています。まず第一に、主要言語が日本語であり、補助的に英語のアナウンスが流れていることが判明しました。具体的な日本語フレーズ「まもなく1番線に...」などが確認されており、これは日本国内の公共交通機関における状況である可能性が高いことを示唆しています。

地理的な位置の特定

さらに音声データを分析した結果、提供された日本語フレーズが重要な位置情報を含んでいることが明らかになりました。「JR東日本をご利用いただきありがとうございます」という英語アナウンスから、これは東日本旅客鉄道の駅であることが判明しました。目的地として「久里浜」が特定されています。今後は久里浜駅の位置特定に注力します。列車の走行音も、この音声が駅関連のものであることを示す有力な証拠となっています。

駅の位置の特定

現在、東京駅が有力な発信源候補として浮上しています。音声データからは、久里浜行きの普通列車、15両編成の列車運行、そしてJR東日本の運営形態など、すべてが横須賀線の特徴を非常によく表しています。「15番線」というアナウンスもこの結論を裏付けています。「ありがとう」という歓声は、主要ターミナル駅という賑やかな環境であれば十分に考えられる反応です。

発信源の特定

現在、東京駅が最有力候補として注目されています。JR東日本、久里浜行きの横須賀線列車、そして「15番線」というアナウンスの組み合わせは、この仮説を強く支持するものです。さらなる確認作業として、品川駅における横須賀線のホーム番号を確認する必要があります。品川駅も有力候補であるためです。また、歓声の様子から判断すると、より地域的な駅ではなく、東京のような主要駅である可能性が高いと考えられます。

駅の特定を確定する

JR品川駅が発信源であるとの確信を得ました。「15番線」というアナウンスと「普通電車 久里浜行き」という英語アナウンスは、品川駅における横須賀線の運行スケジュールと完全に一致しています。賑やかな雰囲気は、JR東日本の主要ハブ駅としての特徴をよく表しており、この結論を裏付けています。発信源の位置は特定済みです。

駅の特定を最終確認する

現在、この音声がJR品川駅から発信されたものであると確信しています。「15番線」という具体的なアナウンスと「普通電車 久里浜行き」という英語アナウンスは、品川駅における横須賀線の運行スケジュールと完全に合致しています。日本語と英語のアナウンスが併用されている点も、JR東日本の駅であることを強く示しています。賑やかな雰囲気は、JR東日本の主要通勤ターミナル駅である品川の特徴と完全に一致しており、歓声の様子もこの結論を補強するものです。

言ってることは確かにそれっぽいけど、ホントかなぁ〜と思いながら、品川駅 15 番線 (横須賀行き) の時刻表を探すと、


https://www.jreast-timetable.jp/2506/timetable/tt0788/0788070.html#time_14 .

確かに14時16分に久里浜行きの電車があり、音声の内容と一致することがわかります。

自分が聞いた時は「久里浜」を聞き取れなかったので、Gemini に完全敗北でした。

以上より、フラグは

Diver25{品川駅}

✅ listen (473pt / 53 solves) [medium]

音声 / Audio:
https://drive.google.com/file/d/1s_HC_S_9szbkupw9jQo4Zsvkoj73Qd_6/view?usp=sharing
この航空管制のやり取りが録音された空港のICAOコード(4レターコード)を答えよ。
Flag形式: Diver25{RJTT}

音声の出典: LiveATC CYEG-Del-Gnd-Misc-Jan-18-2025-0500Z

音声を聞くと、航空機と管制塔のやり取りをしているのがわかります。
例によって早速 Google AI Studio の Gemini に説明してもらいました:

通信内容の説明

この音声は、空港の 航空交通管制(ATC: Air Traffic Control) における、管制官と航空機のパイロットとの間の無線通信を録音したものです。英語で交信が行われており、航空機の離着陸や地上での移動に関する指示が主な内容です。

以下に、音声の詳細な内容を時系列で解説します。

音声の概要

  • 種類: 航空無線通信(ATC)
  • 場所: 空港の管制塔(Tower)および地上管制(Ground)
  • 言語: 英語
  • 内容: 複数の航空機に対する離陸許可、着陸許可、地上走行(タキシング)の指示、周波数の変更指示など。

主なやり取りの解説

この音声には、複数の航空機と管制官とのやり取りが含まれています。以下に代表的なものをいくつか挙げます。

01:40 - 01:53

  • 管制官: 「Porter 295、滑走路02に着陸しました。地上管制(Ground)の周波数133.65または121.7に21分に交信してください。滑走路30からの離陸許可を出します。」
  • パイロット: 「地上管制133.65、滑走路30からの離陸許可、了解。Porterです。」
  • 解説: Porter航空295便が着陸した後、地上での移動のために管制(地上管制)の周波数を変更するよう指示されています。同時に、別の航空機への離陸許可も出ており、管制官が複数の業務を並行して行っていることがわかります。

02:28 - 02:37

  • 管制官: 「地上で完了したら、地上管制の周波数121.7に交信してください。」
  • パイロット: 「滑走路...を継続し、地上管制21.7に交信します。Porter 289。」
  • 解説: こちらも地上での移動に関する指示です。パイロットは指示を復唱し、自機のコールサイン(識別符号)を伝えています。

03:50 - 03:55

  • 管制官: 「Porter 289、タキシーウェイ(地上走行路)Bravo 1経由で駐機場まで進んでください。」
  • 解説: 着陸後の航空機が、どの経路を通って駐機場(ゲート)へ向かうべきかを指示しています。

04:08 - 04:25

  • パイロット: 「WestJet 177、滑走路02の手前で待機中、準備完了です。」
  • 管制官: 「出発管制(Departure)に周波数を合わせてください。133.65です。風は170度から23ノット。滑走路02からの離陸を許可します。」
  • パイロット: 「出発管制133.65、滑走路02からの離陸許可、了解。WestJet 177。」
  • 解説: WestJet航空177便が離陸準備完了を報告し、管制官が風の情報(風向きと風速)を伝えた上で離陸を許可しています。離陸後は出発管制(Departure Control)と交信するよう指示されています。

05:28 - 05:31

  • 管制官: 「滑走路02への着陸を許可します。」
  • パイロット: 「滑走路02に着陸します、了解。」
  • 解説: 空港に接近してきた航空機に対して、管制官が着陸の最終的な許可を与えている場面です。

専門用語の簡単な解説

  • Tower(タワー): 離着陸を管理する管制官。
  • Ground(グラウンド): 地上での航空機の移動(タキシング)を管理する管制官。
  • Departure(デパーチャー): 離陸後の航空機を目的の高度・経路まで誘導する管制官。
  • Callsign(コールサイン): 航空機を識別するための呼び名(例:「Porter 295」「WestJet 177」)。
  • Runway(ランウェイ): 滑走路。方角に基づいた番号で呼ばれます(例:「Runway 02」)。
  • Taxi(タキシング): 航空機が自らの動力で地上を移動すること。
  • Clear for Takeoff/Land: 離陸・着陸の公式な許可。
  • Holding Short: 滑走路に進入する手前で待機すること。

まとめ

この音声は、空港がいかにして多くの航空機の動きを安全かつ効率的に管理しているかを示す貴重な記録です。管制官は、簡潔かつ正確な言葉で指示を出し、パイロットはそれを復唱して確認します。この一連のやり取りによって、空の安全が保たれています。

へぇ〜って思いながらも、空港に関する直接的な言及がなかったので、どうやって空港特定できるのだろうかとそのまま聞いてみたら、

要約

  1. 航空会社を特定する
  • 音声中に Poter (ポーター航空) と WestJet (ウェストジェット航空) が登場する
  • どちらもカナダの航空会社なので、この時点で カナダの空港 の可能性が高い
  1. 滑走路番号を照合する
  1. ATC(航空交通管制)の周波数を確認
  • 周波数は担当管制官ごとに割り当てられているので、組み合わせはユニーク
  • 音声中の周波数:
  • 地上管制: 133.65
  • 出発/飛行場管制: 121.7
  • 「atc frequencies」でググったり、LiveATC.net で調べるといい

みたいなことを言っていました。おまけで周波数をベースに空港の推定もやってくれたのですが、「ハリファックス・スタンフィールド国際空港 (CYHZ)」を提示してきており、Gemini 自身も自分で言っておきながら滑走路との矛盾を指摘している通り、間違いでした。
滑走路の知識は正しかったのですが、周波数についてはインターネットへのアクセスがなかったのでハルシネーションしていたのかもしれないです。

ともあれ、ここまで示してくれたらあとはカナダの空港を調べるだけです。

航空会社と機体の情報があるので、FlightRader でそれぞれ調べると、

https://www.flightradar24.com/data/flights/pd296
https://www.flightradar24.com/data/flights/ws177

最新のデータになってしまいますが、St. John's (YYT) や Edmonton (YEG) から出発しがちっぽいのでここから調べていきました。

すると「エドモントン国際空港 (Edmonton)」が近そうです。

https://ja.wikipedia.org/wiki/エドモントン国際空港

滑走路の方向は、「02/20」「12/30」の二つあるので、音声の内容と一致します。

フラグは、ICAO コードの「CYEG」で、

Diver25{CYEG}

です。

✅ platform (136pt / 192 solves) [easy]

この写真が撮影された駅はどこか。駅名を答えよ(日本語でも英語でも可)。
(駅名は鉄道会社の公式サイトやWikipediaに記載されている表記とする)
Flag形式: Diver25{京都駅}
ヒント1: 10両 9号車乗車口 means No.9 car's door of 10-cars train
ヒント2: 弱冷房車 means mildly air-conditioned train car

日本の駅ですね。観察すると、

  • 左側にカフェか何かの店「らいと」がある
  • 10 両 9 号車 が弱冷房車
  • 6 両編成, 12 両編成もある
  • 周りにビル群は見えないので、大都会というわけではなさそう
  • 屋根ない
  • 一方面に線路は一本

ということがわかりました。
ちなみに、今 Gemini に直接場所を聞いてみたら京王線の池ノ上駅だと言ってきましたが、全然違います。

「らいと」の店名でググっても、外観が似ている店がヒットしなかったので一旦置いておきました。

当初は方針が立たなかったんですが、ヒントを見てみると、10 両だったり弱冷房車がキーワードになるようなので、弱冷房車でググってみると、Wikipedia がありました。

https://ja.wikipedia.org/wiki/弱冷房車

読むと、どこの線に、何両編成の電車の何号車が弱冷房車なのかが書いてあるので、これによって線を絞ることができそうです。
候補として上がる地上の線は、

などがあがりますが、編成車両数が合わなかったりで中央線が残るのですが、都会なイメージの中央線は、画像の駅と雰囲気が違うので不採用でした。
今考えると、6両, 10両, 12両全部ある路線を調べればよかったのかなと思います。「12両編成」でググると中央線快速と青梅線の資料がヒットするのですが、当時は思い付かなかったです。

そこで、「⚪︎両編成」とか書いてあるシール?の部分をクロップして「6両」みたいなキーワードと一緒に Google 画像検索 すると、シールの外観が似ていて、しかも路線に言及している記事が見つかりました。

https://ameblo.jp/ichitamo/entry-12805191136.html

これで、この駅は 青梅線 だということがわかりました。

https://ja.wikipedia.org/wiki/青梅線

線が絞れたので、あとは駅を探すだけです。他にスマートな方法があるのかもしれないですが、自分は Google マップで青梅線の駅を総当たりしました。
目印になるのは、左側に高いビルがない こと、線路と「らいと」の間に通行可能な道路があること、少なくとも プラットフォームの端に屋根がない ことくらいです。

最終的に、牛浜駅 とわかりました。


https://maps.app.goo.gl/tgag3Xg31e19WeK67 .

「らいと」はバーだったようです。

フラグは、

Diver25{牛浜駅}

です。

✅ sanction (375pt / 112 solves) [easy]

2024年10月25日、制裁下にあるロシア船籍のRORO船「ANGARA」がある港湾に停泊していることが衛星画像で確認された。
停泊位置を答えよ。
(フラグは座標ピン)

RORO船とはなんぞやと調べてみると、

https://ja.wikipedia.org/wiki/RO-RO船

ローロー船と読み、特殊な貨物船のことらしいです。

「RORO ANGARA」でググると、いくつか (1, 2) ブログ記事などがヒットします。また、MarineTraffic もヒットしました。

https://www.marinetraffic.com/en/ais/details/ships/shipid:755977/mmsi:273210440/imo:9179842/vessel:ANGARA

MarineTraffic は FlightRader の船版みたいなもののようで、船の航海記録が見れるようです。知りたいのは 2024 年 10 月 25 日の停泊位置ですが、このサイトだと見つけられませんでした...
VesselFinder というのでもヒットしたんですが、欲しい日時の停泊位置はわからず。

他にヒットした記事の中に、「War Sanctions」というサイトがありました。

https://war-sanctions.gur.gov.ua/en/transport/ships/33

問題タイトルにもなっている「sanction」は、「制裁」という意味で、ロシアに対する何らかの制裁に関連する話ということでしょう。
そこで、この船に関する sanction を調べてみました。「ANGARA sanction」でググると、War Sanctions のページや、他の制裁まとめサイトっぽいサイト などに加えて、Ministry of Foreign Affairs of Japan (外務省) の PDF 資料がヒットしました。

https://www.mofa.go.jp/files/100853978.pdf

「ANGARA」で検索をかけると、

ANGARA が 2024 年 10 月 25 日に「Rajin Port, DPRK」に停泊していることがわかりました。この港は北朝鮮の羅津港らしいです。

https://ja.wikipedia.org/wiki/羅津港

なので、回答は羅津港のこの写真の位置になります。

https://maps.app.goo.gl/tfwLurssVQCVQmCs5

🟢 history

歴史的な事象・記録について調べる問題です。二問だけではあったのですが、全問正解できてよかったです。

DIVER OSINT CTF 2024 の過去問を解いた際は history 一つも解けなかったのですが、割と手法や心持ちが参考になりました。internment の問題は、解き方が Akeome (こっちも解けなかった) と類似している感じがしたので、学びを活かせている気がしました。

✅ bridge (263pt / 155 solves) [medium]

動画 / Video:
https://www.youtube.com/watch?v=fRMi8TXQRuo
(無音です / No audio)
この動画で列車が通過した橋梁は、ある災害で損傷した後に架け替えられたものである。架け替えに際して、他の橋梁の構造物が流用されたことがある文献に示されている。その流用元の橋梁名を答えよ(この橋の名前ではない)。
Flag形式: Diver25{橋梁名}(例: Diver25{日本橋川橋梁}

動画を見ると、以下がわかります:

  • 00:00-00:01: 「園芸資材 千歳農園」と書かれた建物
  • 00:02~: 田舎っぽい。山がちょっと見えて、高い建物がない
  • 00:16-[00:22]: 川の上にかかっている橋を通過
  • 00:26~: 黒と赤の建物で、「N??yht?s D?t」の看板がついてる。セブンイレブン、ガソリンスタンドがある。
  • 00:32~: 「??寺」

はっきりと文字が読めたのは「園芸資材 千歳農園」でしたが、ググっても別の全然違うところにある店しかヒットしなかったので、おそらく店の倉庫的な感じなのかもしれません。それか私の調べ方が悪かったです。
熊本なんだろうとはざっくりわかります。

他にこの中で、特定に繋がりそうなのは、黒と赤の建物でしょうか。ただ寺は文字数が少ない割に読みづらい割合が多かったので検索し辛く、有用な情報は得られませんでした。

黒赤の建物は、引きでクロップしてGoogle 画像検索で建物を調べても、びっくりドンキーに判定されていい情報が見つかりませんでした。今気づいたんですが、看板だけクロップして調べると、もっと読みやすい看板画像が見つかりました。
当時のクロップは適当だったので、微妙な位置で Google 画像検索にかけると、ノーティーズEst というパチンコ店の情報が見つかりました。となると、**看板のテキストは「Naughties」**だと推測できます。改めて「naughties dst」でググると、パチンコの店舗情報 が見つかり、住所が「熊本県熊本市中央区黒髪7-29」であるとわかりました。

Google マップで見てみます。

ちゃんと景色が動画の通りになっています。ピンが刺さってるのがパチンコ店で、中央の赤い橋が今回のターゲットです。
この路線は「豊肥本線」、川の名前は「白川」と言うようですが、橋自体の名前は Google マップからはわかりませんでした。一番近くの駅は、橋からパチンコ側にすぐの場所に「竜田口駅」という駅があることがわかりました。

問題文にある通り、一度破損して復旧工事がされているとのことなので、「豊肥本線 白川 復旧工事」みたいなワードでググってみます。
すると、「白川橋」の復旧工事景観整備 の資料が見つかりますが、これは今回の目的の橋とは別の白川の橋でした。

JR 九州 豊肥線 白川 橋梁 被災」みたいなワードで調べてみますが、どれも第一白川橋梁、白川橋に関連する情報しか出てきませんでした。(1, 2, 3, 4)

竜田口駅に近いので、「豊肥線 白川 橋梁 復旧 工事 "竜田口"」と、竜田口を強制的に含むように検索したところ、「熊本県下における近代橋梁の発展史に関する研究」と言うタイトルの PDF がヒットしました。

https://kumadai.repo.nii.ac.jp/record/23247/files/24-0097-1.pdf

PDF で「竜田」で検索をかけると、竜田口付近の橋の工事についての言及がありました。


戸塚, 誠司 「熊本県下における近代橋梁の発展史に関する研究」 P.39 https://kumadai.repo.nii.ac.jp/records/23247 .

大阪城の橋梁を転用していたとのこと。ここで、橋の名前をコピペすると「川橋梁」になるんですが、よく読むと一文字目がなんか違います。これは OCR の精度が悪くて、間違った文字がコピーされるみたいです (1敗)。正確には「澱川橋梁」です。

よって、フラグは

Diver25{澱川橋梁}

です。

ちなみに調査の過程で知ったんですが、竜田口駅はガールズバンドクライの聖地だったようです。

✅ internment (478pt / 48 solves) [hard]

著名な木曜島の真珠採りダイバーであった藤井富太郎氏は、第二次世界大戦中、強制収容されました。彼が釈放された収容所と釈放の年月日を明らかにしてください。
Flag 形式: Diver25{YYYY-MM-DD_キャンプ番号_キャンプ地名_州名}
例えば、「2025年6月1日に、キャンプ番号7番のDiver州Daibaキャンプ」から釈放されたならば、 Diver25{2025-06-01_7_Daiba_Diver} となります。なお、キャンプ番号がない場合はX(大文字のX)を入れてください。例えば、Diver25{2025-06-01_X_Daiba_Diver} となります。

internment は抑留と言う意味らしいです。

藤井富太郎氏って誰〜って調べてみると、いくつか (1, 2, 3, 4) 資料がヒットしました。
要約すると、

  • 第二次世界大戦中の真珠採りダイバー
  • 1925年 オーストラリアの木曜島に行く
  • 1941年 ヘイ収容所に強制収容
  • 1961年 オーストラリア国籍取得, 66年パスポート取得
  • 1986年 木曜島で死去
  • 1987年 自宅前に銅像設置

オーストラリア・木曜島に渡った日本人の足跡を追う : 藤井富太郎氏の生涯から考える より

収容されたままパスポート取得したんかい!って突っ込みたくなるレベルに、釈放に関する情報が出てこないです。

今回の問題では、釈放された時の収容所、釈放日時を探す必要があります。

最初はアプローチがわからなくて、

  • 藤井富太郎 釈放
  • 藤井富太郎 銅像

とかで調べたり、藤井富太郎について調べた論文や本がないか CiNii で調べてみたのですが、特に情報がなかったです。

CiNii で検索したうち、NDL(国立国会図書館) のオンラインで見れる資料があり、「民俗建築 (150);2016・11」では「トレス海峡の真珠貝ダイバー藤井富太郎」と言うタイトルで、藤井富太郎についての話が載っていました。

https://dl.ndl.go.jp/pid/13000201

曰く、

  • 第二次世界大戦が始まると、オーストラリア大陸南東部にいた日本人は全員ヘイ収容所に強制収容された
  • 基本的に戦後は送還されたが、トミー・フジイ(藤井富太郎)だけは、戦後もオーストラリアに残り、木曜島で真珠採りを続けた

らしいと言うことがわかりました。日本に送還されていないということは、「日本に送還された記録」がないということなので、日本語の資料がない可能性 があります。

一方で、強制収容や釈放は何かしら公的な記録として残っていそうな気がしてきたので、これに関する オーストラリアのオープンデータ がないか調べることにしました。

Gemini にオーストラリアの強制収用に関する情報があるか DeepResearch させてみました。すると、良さそうな情報源があることがわかりました。(流石に藤井富太郎の釈放に関する情報は得られなかったですが)

流石に藤井富太郎の情報までは探せなかったのですが、NAA で検索すればいい ことがわかったので、上出来です。

https://www.naa.gov.au/

RecordSearch から、「Fujii Tomitaro」で検索すると、ヒットしたのは7つ、添付ファイルがありそうなのは6個しなかったので全部確認しました。

この中で関係がありそうなのはこれでした。


[Prisoner of War/Internee: Fujii, Tomitaro; Date of birth - 10 December 1907; Nationality - Japanese](https://recordsearch.naa.gov.au/SearchNRetrieve/NAAMedia/ShowImage.aspx?B=8610767&T=P&S=1 =600x)

赤字で RELEASED と書かれているのは 1946 年 12 月 10 日だとわかります。
ただ、他のフィールドは筆記体やばすぎて全然読めなかったので、ChatGPT に読ませたところ、こういう内容のようです (Gemini は筆記体の読み取りが苦手かも):

Date From whom received Record of movements, transfers, etc. Date of Casualty Place of Casualty Authority (A.A.F.A.113, or other Document) Signature of Officer
26.1.42 C.C. Hay marched in ex Thursday Island 2.1.42 Hay A.113 Westbrook
29.5.43 C.C. Hay Transferred to P.O.W. 14.5.43 Hay A.113 Palling
13.3.46 16/Out to Tatura 8.3.46 Tatura 137/46 (署名不明)
26.9.46 H. Cond. Transferred to 3 Int. Camp Rushworth 26.9.46 Rushworth 16/46 Pos(?)
28.9.46 M. Pn. rec. 4 Camp. 26.9.46 122/46
10.12.46 Released 10.12.46 215/46 Organ

26.9.463 Int. Camp RushworthTransferred していたことがわかります。オーストラリアの Rushworth は Victoria 州にあるそうです。

https://en.wikipedia.org/wiki/Rushworth,_Victoria

なので、フラグは

Diver25{1946-12-10_3_Rushworth_Victoria}

になると思いきや、通らなかったので、おそらく 28.9.46M. Pn. rec. 4 Camp. で Camp 4 に移送されたっぽく、

Diver25{1946-12-10_4_Rushworth_Victoria}

で通りました。

他の資料 をみると、収容中に何回か移送されていたそう。

🟢 company

二つとも正解できたのは結構嬉しいです。

去年の DIVER OSINT CTF 2024 の過去問を、事前に予習として解いていたときに、ニューヨークの交差点の苦情の問題で、ニューヨークのオープンデータベースまでたどり着いたのに、フィルタリングめんどくさくて諦めたらあと最後の一歩だったってのが悔しかったので、今回それと似た雰囲気の問題スタイルだったこの二問を解けたのは個人的に嬉しかったです。

やることがはっきりしている割には正解者が少なかったので、美味しい問題でした。

✅ bid (491pt / 31 solves) [medium]

2023年、オマーンにおいて、ある施設に関連するニュースが報じられた。
https://www.youtube.com/watch?v=TFdubskF9Kw
その後、2024年10~11月に、この施設に関連すると推定される、井戸およびパイプラインを建設するための入札が実施された。
このとき、3位の金額で入札した企業のCEOの名前を、Webサイトに掲載されている英語表記で答えよ。
Flag形式: Diver25{Kelly Ortberg}

やることは以下の通りです。

  1. YouTube 動画の内容を把握
  2. 入札検索のサイトを調べる
  3. 入札を探す
  4. 3位の会社を探す
  5. 会社のホームページとCEOを探す

オマーンで使われる文字は英語とアラビア語ですが、こっちには Gemini がいるので外国語の壁なんてあってほぼないようなものです。以下を Gemini にやらせました

  1. YouTube 動画の要約と説明 (キャプションがついてたので行けた)
  2. 入札のサイトどこにあるのか調べさせた: https://gemini.google.com/share/a399d3fa44cc

この二つが終われば、あとは指定した条件で手動で検索かますだけなので終わりです。

今回の内容は、

  • オマーンで、アル・バシャエル (Al Bashayer) 地域に獣医病院を作る契約をアル・カイラット農業サービス開発会社 (Al Khairat Company for Agricultural Services and Development) と農林水産省的な部署が結んだ
  • 調査対象:
    • これに関するプロジェクトで、かつ「井戸およびパイプライン建設」を目的とした入札(2024年10月~11月)を探す
    • 入札3位の企業を探して CEO を探す

入札サイトを探すと、↓が見つかります。めちゃくちゃ重いです。

https://etendering.tenderboard.gov.om/product/publicDash

もしアラビア語になってたら、「EN」を全力で探してクリック すれば英語になります。

ここら辺のボタンの意味もスクショして AI に聞くと文脈を汲んでくれるのでいい感じでした。この中で、特に考えず「Opend (審査段階)」から調べたのですが、ヒットしなかったので「Awarded (落札済み)」の方を調べました。

これを探すと以下が見つかります。カテゴリ「Procurement Category」を「Pipeline Network Construction and Drilling Wells」にして検索します。時期もフィルタリングしたかったんですが、検索結果がゼロになってしまうので除外しました。多分正確な入札時期と落札時期がずれていて引っ掛からなかったのだと思います。

検索すると、候補がいっぱい出てきます。2024年10月以降の落札は数個だけなので順番に見ていくと、実は一番上のやつが探しているやつです。

当時はどうやって見つけたか忘れたんですが、Tender Title に「AL-BASHAYER VETERINARY HOSPITAL IN WALAYAT」とあるで、件の獣医病院に関連する入札です。

左側の Tender No. 「1190/2023/MAFWR/DGAWRDK-94- Recall - 1」でググると、詳細情報のページが見つかります。

https://etendering.tenderboard.gov.om/product/nitParameterView?mode=public&tenderNo=62644&PublicUrl=1&CTRL_STRDIRECTION=LTR&encparam=mode,tenderNo,PublicUrl,CTRL_STRDIRECTION,randomno&hashval=a34c6c2faa1d2a895fd3b37806bafc76958a9ed9396aad8afe5dd7ef034977f2

ちゃんと条件を満たしているのがわかります。

  • 入札の時期: 2024/11/3 ~ 2024/11/17 くらい
  • 入札内容 (Tender Title): DRILLING WELL BORE SUPPLY& INSTALLATION OF PUMP AND PIPELINE FOR AL-BASHAYER VETERINARY HOSPITAL IN WILAYAT ADAM AT AL-DAKHLIAH GOVERNORAT (アル・ダハリヤ県アダム地区のアル・バシャエル獣医病院井戸掘りとパイプラインネットワークの構築)
  • カテゴリ: Pipeline Network Construction and Drilling Wells (井戸掘りとパイプラインネットワークの構築)
  • 統領 (Governorate): Al Dakhiliyah (アル・ダハリヤ県)

ドンピシャなので安心して次に進めますね。

当初は Opened の方を探していて、「Preparing the pump for Well No.1...」だと思ったのですが、入札者や入札タイトルが違うので、色々悩んでました。

次は 入札企業 が知りたいのですが、さっきの行のメールアイコンのボタンを押すと見れました。

入札金額が3位というのは、多い順なのか少ない順なのかわからなかったけど、まあ上から順かな〜って3位を見ると 6627.600 の GOLDENSANDSTRANSPORTSERVICESLLC が見つかりました。
けどこれでググってもなんもヒットしないのですが、よく見るとなぜかスペースがどっかいってキチキチになってるだけなので、いい感じのところで切ってあげると Golden Sands Transport Services LLC になります。
ググると、

https://goldensandsoman.com/

がヒットし、

https://goldensandsoman.com/about-us/

CEO の情報も素直に見つかります。

以上より、フラグはこのCEOの名前となります。

この問題で辛かったのは、なぜか入札検索サイトで右クリック禁止!!されるのと、サイトが重い、見づらいことでした...

そのアラビア語読めないけどなんて書いてあるかわかるよ

✅ expense (499pt / 13 solves) [medium]

2025年1月、São Miguel do Guamáの市長が、ある食品関連会社にクレジットカード決済で支払った金額(現地通貨)を答えよ。
Flag形式: Diver25{1234.56}(通貨記号/コードは不要)
ヒント1: 私的な取引ではないだろう。

こちらも基本的な流れは bid と同じ。クレジットカード決済が公開されているのか...!?と驚くが、ヒントにある通り、公的な取引なのできっと何かしらオープンデータで公開されているはずである。なのでまず以下を Gemini に聞いてみた

  1. São Miguel do Guamá市について教えて
    • ブラジルの市 (略)
  2. 市の入札情報はどこで検索できる?
    • 市役所 公式サイト https://saomigueldoguama.pa.gov.br/ から Licitações(入札)を選択
    • 透明性のポータル 市の公式サイトから Portal da Transparência、Licitações(入札) など
  3. 市長誰?
    • São Miguel do Guamá市の現在の市長は、Eduardo Pio X(エドゥアルド・ピオ・デース)氏です。 (後から確認したら、「Eduardo Sampaio Gomes Leite, mais conhecido como Eduardo Pio X (Eduardo Sampaio Gomes Leite は Eduardo Pio X として知られていますが...)」みたいな文章が市のページに書いてあったのでちゃんと確認するべき」)

https://saomigueldoguama.pa.gov.br/

アクセスしてスクロールすると、こんなボタンがあります。

(Geminiが) 翻訳すると、

透明性ポータル コロナウイルス透明性
入札の公示と契約 都市土地財産税 IPTU
電子請求書 検査結果(研究室/検査室)
オンライン給与明細 オンラインC票(所得証明書のようなもの)

となります。透明性ポータルがあるので、クリックすると市の透明性ポータルに飛ぶことができます。

https://saomigueldoguama.pa.gov.br/portal-da-transparencia

ブラウザの翻訳を使って眺めると、「Licitações / Contratos (入札 / 契約)」があるので、クリックすると、先ほどの「入札の公示と契約」のボタンとほぼ同じところに飛びます。

https://www.portalcr2.com.br/licitacoes/licitacoes-sao-miguel-do-guama

しかし、特に何も出てきません。欲しい情報は 2025 年なので、2024年以前のページに戻る必要はないはずです。ブラウザの幅を広くすると「Início (スタート?)」があるのでクリックしてみると、

何かしらの方法で翻訳すると、「Gastos com Cartão de Crédito」が「クレジットカードでの支出」という意味だとわかります。しかし、クリックしても相変わらず情報は何も出てきません。


検索はクレジットカードの支出の結果を返していないか、表示できるデータがないようです。

困ったので、「São Miguel do Guamá Gastos com Cartão de Crédito (サン・ミゲル・ド・グアマ クレジットカード支出)」でググると、別の透明性ポータルを見つけられました。

https://portaldatransparencia.gov.br/localidades/1507607-sao-miguel-do-guama?ano=2024

英語に切り替えるボタンがないのでアレですが、ロゴやドメインを見る限り、ブラジル政府により近い透明性ポータル (Portal da Transparência) のようです。こっちはちゃんと数字も出ていて、何かデータを見つけられそうです。
2024 のドロップダウンもあるので、2025 に設定して下にスクロールすると、さっき見かけた「Gastos」や「Cartão」みたいなワードが見つかります。

訳すと、「市民防衛支払いカードによる支出」みたいな感じになるので、右の青いボタンから詳細に飛べます。

https://portaldatransparencia.gov.br/cartoes/consulta?tipoCartao=3&de=01%2F01%2F2025&ate=31%2F12%2F2025&ordenarPor=mesExtrato&direcao=desc

日付や種類でのフィルターのようなものがされているのが見えます。「Extrato de cartão」で変なフィルターされているので外して、左の「FILTROS (フィルター)」から1月~2月くらいに絞り、「Consultr」します。
それでもまだフィルターしきれないので、一度「プリント→PDFで保存」し、 Gemini に食料関係っぽいものがあるか聞きました。(怠惰)

二件あるようです。市長の名前は、「Eduardo Pio X」だったので、一つ目の「EDUARDO SAMPAIO GOMES LEITE」が該当しそうです。受取人についても調査させたところ、食品の販売・流通をする会社だそうです。(今翻訳したら「ブリティ食品販売株式会社」になったのであってそう)

印刷した PDF に金額も載ってたら良かったのですが、載ってなかったのでさっきの検索結果に戻ります。どれが目的の取引かわからないので、「Portador (保有者)」で市長のカードにフィルターします。***.820.282-** - EDUARDO SAMPAIO GOMES LEITE が選択できます。

一つに絞られました。あとは、取引金額を調べられれば良いです。右にスクロールすると、

通貨の記号もついているので、一番右の「Valor R$ (支出)」が目当ての取引金額です。1.593.081,94 R$ なので、

フラグは

Diver25{1.593.081,94}

です。

期間のフィルタリングを間違えると、「Valor R$ 」ではなく「Valor Gasto no Período R$ (期間中の支出額)」になり、定期購入なのかわからないですが金額が 3.864.760,53 R$ になってしまいます (1敗)。

デフォルトで英語に切り替えられないこと以外は、割とモダンな Web サイトになっていて操作性は良いサイトでした。

🟨 hardware

ハードウェアに関する問題です。

✅ phone (441pt / 78 solves) [medium] @tkgstrator

2016年7月23日~24日、この携帯電話の発売に先立ってEMI試験が行われた。試験は三重県の会社が実施したようだ。その試験に供された端末のシリアル番号を答えよ。
シリアル番号に / や - といった記号を含む場合、その記号も含めて記載すること。
Flag形式(例): Diver25{123-45/6789-0}

調べると、どうやらこの携帯は SH-01J っぽいことがわかります。

https://ja.wikipedia.org/wiki/SH-01J

製品ページも見つかる。

https://www.docomo.ne.jp/support/product/sh01j/index.html

三重県の EMI 試験やっている会社で調べると、三重県工業研究所 がヒット。

https://www.pref.mie.lg.jp/kougi/hp/000124880.htm

ただ、私はこれ以上どうすればいいのかわからなかったので、@tkgstrator が解いてくれました。

ChatGPT 曰く、技適通ってる製品は EMI 試験も通過していて、海外で使える製品は FCC 認証も通っているらしいので、端末の FCC ID から検査の情報を調べられるかもしれません。

まず、 SH-01J の取扱説明書を探します。

https://www.docomo.ne.jp/binary/pdf/support/manual/SH-01J_J_syousai_FV2.pdf

FCC で検索をかけるとヒットし、FCC ID APYHRO0024 が見つかります。

FCC ID から試験レポートを検索できるサードパティのサイト FFC IF.io を利用して、APYHRO0024 を調べました。

https://fccid.io/APYHRO0024

時期の違いで色々ヒットしますが、2016年7月23日~24日のものは見つかりません。一番近いのは、2016-08-23 となっているものなので、それを開いてみます。

https://fccid.io/APYHRO00240

下にスクロールしていくと、Available Exhibits にいろんなレポート PDF が掲載されていました。
試験について調べたいので、この中で test が含まれているものを探せばよさそうです。

適当にファイルを開いていたら、

https://fccid.io/APYHRO00240/Test-Setup-Photos/SAR-APYHRO00240-TestSetupPhoto-confidential-KL80160307R-0823-3109178

が見つかりました。ここで使われている携帯のシリアル番号は 004401115831014 のようですが、これは EMI 試験ではないので、不正解でした。
また適当にファイルを選んでいたら、

https://fccid.io/APYHRO00240/Test-Report/Pt15C-WLAN-BT-LE-APYHRO00240-TestReport-KL80160313-3109153

を見つけたのですが、ここに載っている二つのシリアル番号も、EMI 試験ではないし試験日が 7/26~8/2 になっているので、合致していません。不正解でした。

おとなしく一番上から当たっていくと、普通にそれが正解のファイルでした。

https://fccid.io/APYHRO00240/Test-Report/Pt15B-APYHRO00240-TestReport-11380556H-B-3109241

タイトルに大きく「EMI TEST REPORT」とあり、モデル番号は「SH-01J」、試験日は「2016/7/23~24」となっています。どこの会社がやったのか探すと、フッターに「Mie-ken」とあるので、これで間違い無いでしょう。

シリアル番号はというと、別のページにあるのでスクロールすると

を見つけることができます。シリアル番号は 004401/11/583099/0 です。

よって、フラグは

Diver25{004401/11/583099/0}

です。

❌ UART (495pt / 24 solves) [hard]

https://www.office-partner.de/tp-link-archer-ax20-12778639
この商品のイーサネットスイッチコントローラに直接UARTでアクセスを試みたい。どの部品の、どのピンにアクセスすればいいだろうか。
PCB上の部品番号 と、その部品の UART RX / UART TX ピン番号 を答えよ。ピン番号は部品の仕様に準拠せよ。
なお、ピンヘッダやコネクタが利用可能な場合でも、イーサネットスイッチコントローラのピン番号を答えてほしい。
Flag形式: Diver25{PCB上の部品番号_UART RXピン番号_UART TXピン番号}
(例えば、イーサネットスイッチコントローラが T21 という部品番号で、RXのピン番号が120、TXのピン番号が150であれば、Diver25{T21_120_150}となる)

全然予備知識なくてめちゃくちゃ時間かかりそうだったのでスキップしました。

🟨 military

身近じゃない話題なので調査のアプローチが思いつきづらくて難しかったです。

✅ object (359pt / 120 solves) [medium]

69.216246, 33.378242 には大きな構造物が存在する。この構造物のプロジェクト番号および、構造物の名称(固有名詞)を 現地語 で答えよ。
Flag形式: Diver25{プロジェクト番号_名称}(例: Diver25{955А_Борей-А}

69.216246, 33.378242 を見ると、白っぽい何かが浮いているのがわかる。

https://maps.app.goo.gl/G4bcJvkzJ9LQvnHz8

近くには海軍基地 Olenya Guba Naval Base があるので、これと絡めて検索すると良さそうだろうか?と思って検索してみるも、

がヒットする感じだった。ここら辺全然詳しくなかったので、とりあえず近そうなロシャリクについて調べて行った。

Wiki がちょくちょくヒットして、潜水艦に関するプロジェクトっぽいのがわかる。

https://ru.wikipedia.org/wiki/АС-12
https://en.wikipedia.org/wiki/Russian_submarine_Losharik

ロシャリクのプロジェクト番号は 10831 なのだが、この時はこれを構造体の方の番号だと勘違いしていた。

色々探している途中で、ロシアの掲示板っぽいサイトを見つけた (幸運)

https://militaryrussia.livejournal.com/tag/пр.10831/

ロシア語だが、今回の目的の建造物に対して注釈がついている!

ПД-72 という番号?割り当てられているらしいとわかった。(アルファベットだと PD-72 みたいな感じらしい。)

そのあとは、ПД-72 とプロジェクト番号 10831 がフラグだと思ったが、通らなかったので隣の潜水艦のプロジェクト番号だとここで気づいた。プロジェクト番号について調べると、Wiki などがヒットしたが見方がわからず。(こういう系の情報って Wiki ができるくらい情報出てくるものなんだな... って思った)

https://russianships.info/eng/support/
https://en.wikipedia.org/wiki/List_of_ships_of_Russia_by_project_number

あと普通に「russia ПД-72」でググると、現地っぽいブログ?まとめサイト?もヒットした。

http://militaryrussia.ru/blog/index-1072.html

「пр.13560 / ПД-72」で、大きな浮いてる構造物についてつらつら書いてあった。13560 っぽいので、さっきのwikiで確認すると、

https://russianships.info/eng/support/project_13560.htm

Large floating dock」「Project 13560」「PD-72」とあるので、プロジェクト番号は 13560 で、名称は PD-72 で間違いなさそうだ。

フラグは、プロジェクト番号と名称をロシア語で書いて、

Diver25{13560_ПД-72}

となる。

❌ worker (499pt / 12 solves) [easy]

"object" の問題で示された構造物で仕事をしていた1964年生まれのある人物は、Akhtubinskに居住しているとされる。
この人物が1987年~2009年にかけて勤務していた組織のOGRNを答えよ。
Flag形式: Diver25{1234567890123}

object の続きとなる問題。今度は、ПД-72 で勤務していた人について調べる...!?
アプローチが全然思いつかなかったので飛ばしました...

その時可能性がありそうだなとか思ってたのは、ロシア系 SNS の調査するんかなと思ったのですが、今考えると何かしらの公的資料とか、正式な記録がないかを探すってのが素直だったかもしれないと思いました。

❌ radar (481pt / 45 solves) [easy]

画像 / Image:
https://drive.google.com/file/d/1hHoRFkG3ZpiQvgBN5wN9BMIkiF5WSIB1/view?usp=sharing
画像に写っているものは、福建省に存在する、中国人民解放軍東部戦区のレーダー施設であると考えられる。
公式な情報は明らかにされていないものの、オンライン上で中国の軍事を分析している人々がこの基地を運用する部隊と分隊の番号を特定しているらしい。
もちろん、オンライン上の情報だけを鵜呑みにするわけにはいかないが、ひとまず検討する価値はあるだろう。
その情報を探り当て、教えてほしい。
Flag形式: Diver25{部隊番号_分隊番号}(例えば12345部隊の56分隊のとき、Diver25{12345_56} となる)

↓にあるレーダー施設を使っている部隊を特定するというタスク。

https://maps.app.goo.gl/umWsUgtb238XALDZA

戦区とか周辺知識が全くなくて、時間かかりそうだったのでスキップしたら再びやることなく終わりました 😇

❌ report

難易度 medium の問題を全て正解するとこの問題に挑戦する権利を得らる、記述式の問題です。

解けてない問題があるので挑戦権を得られませんでした...

❌ unknown_aircraft (300pt / 1 solves)

挑戦権がないので問題すら知らない...
公式の解説を期待しています 😘

感想

今回初めての OSINT CTF 参加でしたが、いくつか悔しい問題はあったものの、全体的には思ったよりも解けていたり、過去問で解けなかった問題と似た問題も解けていたりしたので個人的には満足です。最終的な順位も 22 位と割と高めなで、初参加にしては上々な戦績だと思います。

6 月 7 日の昼 12 時から 8 日の昼 12 時までの 24 時間の開催でしたが、ずっと寝ずに問題解いていたので体力的にはだいぶギリギリでした。最後らへんめちゃくちゃ眠かった... やる前は開催時間短いなと思いましたが、終わってみるとこれくらいの時間が稼働限界だと思いました。

他に今回感じたこととして、

  • 複数人でやるとめちゃくちゃやりやすい
  • LLM 便利
  • 想定外への対応が難しい

を感じました。

複数人について

今回は二人のチームで参加したのですが、急に誘ったのもあり予定の都合で相方は二日目からの参戦となっていました。それまでは一人で問題を解いていた わけでしたが、見当がつかない問題や飛ばしてる問題はマジで手も足も出ない状態で止まっていたのに、相方が来てからは、それらをサッと片付けてくれました。視点や発想が異なる人がいることで、新しい方法を思いつきやすかったりミスに気づきやすくなる上に、単純に同じ時間で取り組める問題が増えるので、人数が増えることの恩恵を強く感じました。

また、Writeup 書いてる時だったり、後から考え直してみるともっといいアプローチを思いついたりもするので、一度冷静になって考えるのも重要 だと感じました(言うは易し)。複数人いれば並行して人数分のアプローチが試せるので、人数 == アプローチの数 となって人数重要だと思いました。

LLM について

今回はいろんな箇所で複数の種類の LLM を使いましたが、かなり助けられる場面もあり、メンバー 0.8 人分くらいの仕事はしてたんじゃないかと思います。難点としては、指示しないと動いてくれない のがクリティカルですが、多言語につよつよ広い分野の基礎知識を持っており、画像や音声も扱えるマルチモーダルという点で、めちゃくちゃ柔軟で高級な Google 検索みたいな感じがあり、とても便利でした。OSINT してくれる Devin がいたらまた感想が変わるかもしれないです。

とはいえ、LLM だけで一発で解ける問題は、音声から品川駅を当てる next_train くらいしかなかった と思います。今回は日本語の音声だったので LLM なくても解ける問題だったかもしれないですが、全然知らない言語・国の音声だった場合は LLM ないとだいぶ厳しくなるように思いました。もし LLM 抜きのアプローチを考えるとすると、言語を特定して、書き起こしツールを探して、翻訳して、というパイプラインになるのでしょうか。最近の LLM はそれらの処理を一括でやってくれるようになっただけとも考えられるかもしれません。今回の CTF では海外からの参加も多いので、そういう参加者たちが日本語の音声にどう対応したのかはとても気になります。

他に LLM の恩恵を感じた部分はやはり外国語が関わる領域でした。特に海外のデータを検索する internmentcompany 系の問題では、YouTube 閲覧をスキップしたり、事前調査を任せたりと、初動のハードルを大きく下げてくれました。普段は日本語だけできればいいなと感じてたのですが、こういう時に多言語に対応した LLM がいるとすごく助かると思いました。

これからは LLM もさらに便利になるので、LLM の存在が前提となるような難易度の問題が増えたり、今まででは難しかったタスクのハードルを下げてくれる気がします。
今回は、最近の LLM が単体で OSINT CTF の問題にどれだけ太刀打ちできるのか知りたいというモチベーションもあったのですが、汎用的な DeepResearch を単純に行う程度では、人間が介入する捜査に及ばない のを実感しました。しかし、ワークフローの一部を担えていたという事実もあるので、プロンプトや与えるツールを改善するだけでも、人間の調査に近いことができるようなエージェントが生まれるかもしれないということも同時に感じました。

想定外への対応について

今回、アプローチがわからない問題をいくつか飛ばしてしまっていましたが、このような想定していないことを求められた際にうまく対応できるかの能力が重要 になると感じました。知っているツールを使う問題や似たような傾向の問題を解くものは、方法さえわればあとは作業するだけ ですが、現実では全く未知の、知らない分野の問題に直面することのほうが多いと思います。そのような時に、どのように多角的に情報を収集できるか、より汎用的な思考方法や考え方が必要になると思いました。そのようなケースを減らすためにパターンを知るというのも一つの手ですが...

最後に

今回初参加でしたがいろんな問題を解くことができて、とても楽しかったです。DIVER OSINT CTF 2025 の運営の方々、チームを組んでくれた @tkgstrator さんに感謝!

GitHubで編集を提案

Discussion