👾

DIVER OSINT CTF 2025 参加記

に公開

はじめに

LinuxClubのLaikaです。先日、OSINT分野に特化したCTF大会「DIVER OSINT CTF 2025」にソロで参加しました。OSINTに特化したCTFは今回が初めてでしたが、予想以上に善戦できたと感じています。

この記事では、「DIVER OSINT CTF 2025」で出題された問題に対し、私がどのように分析を進めたかをまとめました。Writeupとは異なり、寄り道なども含めて、解答中の思考をできる限りそのまま文字にするようにしています。また、解ききれなかった問題についても触れていますのでご了承ください。

Introduction

Introductionは、OSINT CTF初心者向けの問題です。OSINTでよく用いられるツールの使い方や、基本的な調査フローを学ぶことができます。

bx (100pt)

東京の夜景を撮影したと思われる画像。右側に青い「BX」のロゴと、「文化シャッター」の文字。画像左側に十字架と「カトリック上野教...」の看板が確認できる。
この写真で見える "BX" という看板の座標を答えなさい。

画像を確認すると以下のような特徴が見られます。

  • 青い 「BX」 のロゴ
  • 「文化シャッター」 の文字
  • 十字架と、「カトリック上野教...」 と読める教会名

十字架の施設は「カトリック上野教会」と仮定してGoogleマップで検索したところ、東京都台東区に該当する教会を発見しました。また、その教会のすぐ隣に「文化シャッター」「BX」の看板が確認できたため、この場所で確定です。

以上より、建物の座標35.71826384741912, 139.78092604951465が答えとなります。


document (100pt)

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

まず、「yokosuka base shuttle」と検索をしてみると、一番上に在日米海軍司令部
のWebサイトがヒットしました。

このページ内にあるCFAY Bus Scheduleというリンクをクリックすると、バスの時刻表が記載されたpdfファイルが開きます。

次に、Acrobat ReaderなどのツールでこのPDFファイルのメタデータを確認します。すると、ファイルの作成者として特定の人物の名前が記載されており、作成日時も2023年8月29日と問題の条件と一致することが確認できました。

よって、FlagはDiver25{<人物の名前>}です。


finding_my_way (100pt)

34.735639, 138.994950 にある 建造物 の、OpenStreetMapにおけるWay(ウェイ)番号を答えよ。
Flag形式: Diver25{123456789}

この問題で初めてOpenStreetMapの存在を知りました。とりあえず開いてみます。

左上の検索ボックスに座標34.735639, 138.994950を入力します。すると、静岡県賀茂郡河津町付近のある建物にピンが立ちました。

ここまでは順調でしたが、この先の使い方が分からず手が止まりました。試しにピンが立っていた建物を右クリックすると「地物を検索」という項目があったので、それをクリックしてみました。

すると、地物の一覧が表示され、その項目にマウスカーソルを合わせると、マップ上で該当する地物がハイライトされます。どうやらOpenStreetMapでは、世界中の建造物や道路などに一意の番号が振られているようです。すごいですね。

この建物の番号(Way番号)は568613762でした。よって、flagはDiver25{568613762}となります。


flight_from (100pt)

Flightradar24上で、あるヘリコプターの地図上での経路とトランスポンダ情報を表示したスクリーンショット。登録番号JA845Hのドクターヘリが、OKO発到着地未定という情報が表示されている。また、地図上では立川飛行場を出発し、八王子付近を周回している。
このヘリコプターが出発した飛行場のICAOコード(4レターコード)で答えよ。
Flag形式: Diver25{RJTT}

画像の左に表示された情報を見てみると、OKO(TOKYO) を出発し、どこか別の場所に向かっているドクターヘリであることがわかります。

OKOがどこなのかわからなかったので「OKO 空港」で調べてみると、横田基地であることがわかりました。空港には3文字のIATAコードと4文字のICAOコードの2種類があり、横田基地のICAOコードはRJTYのようです。

しかし、よく見ると異常な点に気づきます。このヘリは確かに東京の多摩地域から出発しているものの、衛星画像をよく見ると立川飛行場から出発しています。立川飛行場にはIATAコードは割り振られておらず、ICAOコードはRJTCです。

この時点で二択に絞れているため確実に解けますが、「立川飛行場にはIATAコードが割り振られていない」 という点を考慮し、Flightradarがバグって別のIATAコードを振ってしまったんだろうと仮定して立川飛行場のICAOコードを入力したところ、一発で正解することができました。

よってFlagはDiver25{RJTC}となります。

八王子の大学に通う身としては非常に有利な問題でした。


hidden_service (100pt)

添付ファイルを確認して、Flagを獲得してください!
See the attached file and capture the flag!
Flag形式 / Flag Format: Diver25{xxxxxxxxxxxxxxxxx}
添付ファイルの画像には、青いくしゃくしゃの紙に文字が書かれている。1行目に「THE FLAG IS HIDDEN IN THE UNDERGROUND WORLD!!」2行目に「diverahbwzfukwflslim73j7qtthfkesqvfh42obqk4cxrxwtajk7myd.onion」という文字列が書かれている。

.onionで終わるアドレスはOnion Serviceと呼ばれ、Tor Browserなどを用いてアクセスする必要があるそうです。
Tor Project公式解説より

面倒なのでGeminiに文字起こしを依頼したものの、gqを間違える、1lに間違える等が多発したため、結局自分で打つことになりました。

diverahbwzfukwflslim73j7qtthfkesqvfh42obqk4cxrxwtajk7myd.onion

Tor Browserで上のアドレスを入力するとFlagDiver25{w3lc0m3_70_d4rkw3b!}が表示されました。


night_accident (100pt)

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

動画からぱっと見で確認できたのは以下の情報です。

  1. 日本ではない
  2. 左側通行
  3. 2台のバスが停車している(バス停?)
  4. バス会社の名前は「SBS Transit」
  5. 路線番号は、それぞれ「52」と「58」

SBS TransitをGoogle検索してみると、シンガポールの企業であることがわかります。また、シンガポールは左側通行なので、この時点で国は確定です。

次に、SBS TransitのWebサイトから、路線番号「52」と「58」が両方停車するバス停を探していきます。

52と58の経路表を比較します。52はBishan Intを出発し、Blk 155、Opp Bishan Stn、Opp Blk 213とバス停を経由しています。対して、58はBishan Intを出発し、Blk 115、Opp Bishan Stn、Blk 210とバス停を経由しています。

この路線図から、2つの路線は「Bishan Int」、「Blk 115」、「Opp Bishan Stn」で重なっていることがわかります。

もう一度映像を見ると、どう見ても終着点にあるような大きなバス停ではありませんし、近くに駅(stn)も見当たりません。なので、おそらくBlk115のバス停と思われます。

Google Mapでストリートビューを確認すると、白黒の縁石、中央分離帯つきのT字路、右側にうっすら見えるアーチ状のゲートなどの特徴が一致しています。なので、この位置の座標1.348250758679444, 103.84853497050239が答えです。



ship (100pt)

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

はじめに、船体に書かれた文字を特定します。文字が見づらいので、GIMPで明るさとコントラストを調整しました。

すると、東京海洋大学のロゴとともに「TKI-1401」の文字と「7JVV」の文字が読み取れました。

次に、「東京海洋大学 7JVV」などのキーワードで検索を行うと、この船が東京海洋大学の練習船 「神鷹丸」 であることがわかります。

また、Wikipediaによると、IMO番号は船が破壊されるまで変更されることはなく、一意に定まるそうです。よって、FlagはDiver25{神鷹丸_9767675}となります。


louvre (176pt)

ルーブル美術館の公共Wi-Fiアクセスポイントのうち、以下の条件を満たすもののベンダーを答えよ。
情報は2025年2月28日に収集されており、オンライン上で確認できる。
ベンダーはBSSIDに準拠して判定せよ。
Flag形式: Diver25{Company Name} (例: Apple Inc.の場合、Diver25{Apple Inc.} となる。)

BSSIDとは、各無線機器に一意に設定されたIDで、通常はMACアドレスと一致します。一般的に「SSID」とよばれるものはESSIDで、こちらは英数字です。ダメもとでルーヴル美術館のWebサイトを検索しましたが、当然BSSIDは載ってるわけありません。

正直どこから手を付ければいいか全く分からなかったため、「世界各地のWi-fiアクセスポイントのBSSIDをまとめているWebサイト」といったキーワードでWeb検索しました。すると、WiGLEというWebサイトがあることを知りました。

住所で検索できるので、ルーヴル美術館の座標をWiGLEで確認します。

問題文の条件に基づき、観測日時を「2025年」で絞り込みます。すると、Louvre_WiFi_Gratuitという公共Wi-Fiと思われるSSIDが多数表示され、そのBSSIDプレフィックスが50:60:28であることがわかります。

プレフィックスのベンダーを調べると、Xirrus Inc. であるため、flagはDiver25{Xirrus Inc.}となります。


p2t (Unsolved)

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

まず、安直に「ハシブトガラス」と答えてみますが、当然不正解。

次に、P2Tを「Picture to Text」だと仮定して、OCRの誤認識(例えば「シ」が「ツ」に見えるなど)を疑いましたが、読み取れた文字列は「ハシブトガラス」で間違いありませんでした。

ここで、「これは写真が撮られた場所を特定し、ストリートビューなどで隣の掲示物を確認するタイプの問題ではないか?」と思考を切り替えます。

写真の右側に写っている「時に 立山 われ ボソ いま」の文字がヒントと思われるため、とりあえず「立山 ハシブトガラス」で探しましたが、何も見つけることができず解けませんでした。

コンテスト終了後に知ったことですが、「立山 ハシブトガラス」と検索したときに施設名が書かれたPDFが2番目に表示されていたにも関わらず、私はこれを見逃しました。悔しい


geo

Geoは地理についての問題で、衛星画像や写真などから位置を特定する問題が多いです。

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

見た限りではロシア語らしい文字が書かれており、左下のgov.spb.ruはおそらく「サンクトペテルブルクの行政関連のurl」と思われます。

Geminiに文字起こししてもらうとТОКИО-СITYという文字が書かれています。

サンクトペテルブルク市のGoogle MapでТОКИО-СITYを片っ端から調べるとそれらしき場所がありました。

問題の画像から位置関係を割り出すと、59.943041370370075, 30.278500976677407付近が答えです。


Afghanistan (Unsolved)

動画 / 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画像検索にかけてみましたがヒットなし。そのほかにも日付指定検索、「AFP Afghanistan」などの検索条件で試してみたものの、時間内に解くことはできませんでした。


night_street (428pt)

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

まず、画像から手がかりを探します。左側の建物には特徴的な 「R」 のロゴ、右側の建物には 「...クリニック」 という文字が読み取れます。

当初、この「R」のロゴをロイヤルホストだと完全に思い込んでしまいました。実際にはリンガーハットでした。この勘違いのせいで大幅なタイムロスをしてしまいました。

Introductionで紹介されたOpenStreetMapを駆使する問題だと考え、OpenStreetMapを自動で検索するツール「Overpass Turbo」を試しました(この時、Geminiにクエリを作成してもらいました)。しかし、以下のクエリはすべて失敗しました。

  1. ロイヤルホストから半径100m以内の病院を検索
  • 結果:クエリが長すぎるとエラーが発生。
  1. 検索範囲を都道府県単位に絞り、47都道府県を順に検索
  • 結果:該当する場所は見つからず。
  1. 病院ではなく、施設名に「クリニック」を含むものを検索
  • 結果:同様に一件も見つからず。

ここでようやくロイヤルホストとリンガーハットを勘違いしていたことに気づきます。しかし、「リンガーハット」を条件に上記の検索をやり直しても、結局場所を特定することはできませんでした。

この時点でOverpass Turboでの特定を諦め、リンガーハットの公式サイトにある店舗一覧を元に一つずつ調べていくローラー作戦に切り替えました。幸い、以下のヒントで候補を絞り込むことができました。

  1. リンガーハットはフードコート内の店舗が多い
  2. 画像には中央分離帯があり、地図を見ればすぐに判別できる

地道にローラーした結果、リンガーハット 名古屋弥富通店が該当しました。


特定したリンガーハットの隣にある建物は 「弥富通クリニック」 でした。したがって、FlagはDiver25{弥富通クリニック}となります。


hole (449pt)

この穴があった場所はどこか。

まず、提供された画像をGoogle画像検索にかけたところ、BYDのプロモーション映像がヒットしました。映像の冒頭に「山西大同」というテロップが表示されたため、この場所は山西省大同市にある大同雲岡空港ではないかと推測しました。

しかしGoogle Mapで見ると誘導路がないうえに、端っこの斜めの道路がありません。このことから、BYDが嘘字幕をつけているのでは…? と疑ってしまいました。

仕方ないので、山西省の旅客空港を片っ端から調べてみますが、誘導路の形が一致するものはありません。

ここでもう一度映像をよく見ると、管制塔もなく航空機が止まっている様子もなく滑走路も荒いため、廃止された空港か、非常に小規模な飛行場の可能性を考えました。

もうしょうがないので大同市の衛星画像を眺めまくることにします。結果、大同市の南東に見つけることができました。


よって、答えの座標は39.40470840920346, 114.16324799825922です。


Talentopolis (479pt)

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

記事を英語に翻訳すると、このイベントは"San Juan neighborhood of Malabo"で開催されたことがわかります。少し検索していくと、Malaboは赤道ギニアの首都であり、San Juanという地区があることがわかりました。

Talentopolis Malaboで画像検索すると、別の記事がヒットし、より広い範囲をとった写真を見つけました。

再び画像を見ると、西洋風の特徴的な建物が左に写っており、ぱっと見だと正面の建物と形状が近いように見えます。団地でしょうか。

衛星画像を見るとそれっぽい建物が並んでるので、これのどれかでしょう。

ここで詰まりましたが、改めて記事を読むと、別の画像があることに気づきました(左下の"Ver la galería"(ギャラリーを見る)から)

これを見ると、緑色の屋根の建物が脇にあることがわかります。改めて衛星画像を見ると、この条件に合致するのは丸で囲った場所です。

よって、求めていた座標は3.7375817482618223, 8.796529812086545となります。


convenience - (462pt)

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

night_streetで使ったOverpass Turboを使うことにします。APIをいちいち書くのは面倒なので、やはりここでもGemini 2.5 Proを使って生成してもらいます。

プロンプト

Overpass Turboを用いて、以下の条件を満たすものをクエリしてください。

  1. 青森県内
  2. 公園、コンビニ、スーパーマーケットが互いに100m以内の距離にある

生成されたクエリ

/*
  タイトル: 青森県内で公園、コンビニ、スーパーが互いに100m以内にある場所
  説明:
  このクエリは、青森県内において、以下の3つの条件をすべて満たす「公園」「コンビニエンスストア」「スーパーマーケット」の組み合わせを検索します。
  1. 公園とコンビニの距離が100m以内
  2. コンビニとスーパーの距離が100m以内
  3. スーパーと公園の距離が100m以内

  これにより、「3施設が互いに100m以内に密集しているエリア」を見つけることができます。
*/
[out:json][timeout:120];

// Step 1: 検索エリア(青森県)を定義
area["ISO3166-2"="JP-02"]->.aomori;

// Step 2: 対象となる施設をあらかじめ取得しておく(クエリの効率化)
// 公園(leisure=park または leisure=recreation_ground)
(
  nwr["leisure"~"park|recreation_ground"](area.aomori);
)->.all_parks;
// コンビニ
(
  nwr["shop"="convenience"](area.aomori);
)->.all_convs;
// スーパーマーケット
(
  nwr["shop"="supermarket"](area.aomori);
)->.all_supers;


// Step 3: 条件を満たす施設を段階的に絞り込む

// 3-1: 公園から100m以内にあるコンビニを抽出
//      (d(公園, コンビニ) <= 100m)
nwr.all_convs(around.all_parks:100)->.convs_near_parks;

// 3-2: 上記コンビニから100m以内にあるスーパーを抽出
//      (d(コンビニ, スーパー) <= 100m)
nwr.all_supers(around.convs_near_parks:100)->.supers_near_convs_near_parks;

// 3-3: 上記スーパーが、元の公園からも100m以内にあることを確認し、最終的なスーパーを確定
//      (d(スーパー, 公園) <= 100m)
nwr.supers_near_convs_near_parks(around.all_parks:100)->.final_supers;


// Step 4: 最終的に条件を満たした3種の施設を逆引きして見つける

// 4-1: 確定したスーパー(.final_supers)から100m以内にある、条件を満たすコンビニを抽出
nwr.convs_near_parks(around.final_supers:100)->.final_convs;

// 4-2: 確定したコンビニ(.final_convs)とスーパー(.final_supers)の両方から100m以内にある公園を抽出
nwr.all_parks(around.final_convs:100)(around.final_supers:100)->.final_parks;


// Step 5: 見つかった全ての施設を地図上に表示
(
  .final_parks;
  .final_convs;
  .final_supers;
);
out geom;

これをOverpass Turboにコピペすると、条件に合致する場所が青森県内に複数プロットされます。そのうち最南端にある公園は 556701681です。

よって、FlagはDiver25{556701681}となります。


recon

recon問題は、単一のシナリオに基づいた、関連性の高い問題群です。各問題が密接に連携しているため、まず全ての問題に目を通して全体像を把握してから分析を始めます。

00_engineer (100pt)

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

01_asset (Unsolved)

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

02_recruit (Unsolved)

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

03_ceo (302pt)

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

04_internal (Unsolved)

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

05_designer (Unsolved)

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

06_leaked (Unsolved)

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

まず、落ちていた名札に書かれたkodai_snというハンドルネーム(?)を調べます。kodai_snでGoogle検索を行うと、Twitterのアカウントがヒットしました。

プロフィールに貼られたGitHub Pagesのリンクを覗くと、この方はMagneight Softwareという企業で働いているようです。

「Magneight Software」で検索すると、会社のトップページがヒットしました。

よって、00_engineerのflagはDiver25{https://magneight.com}です。

次に、kodai_snのツイートを眺めていきます。

3月1日のポスト

週明け、社内向けにgitとGitHubのハンズオンをやろうと思う。
パワフルなツールなのだから、エンジニアではないメンバーにも活用して欲しいと思っている。
https://speakerdeck.com/kodaisn/git-hands-on-old

Kodai.S(@kodai_sn) March 1, 2025

4月22日のポスト

リリースが一段落したので、gitハンズオンを我が社のCEOもやってくれたらしい。
社内のドキュメントをMarkdownに一本化するのも不可能ではないかもしれないな。

Kodai.S(@kodai_sn) April 22, 2025

Magneightの社長がGitハンズオンをやったようです。kodai-snのGitHubプロフィールを見ると、Fork練習用レポジトリがあり、そのフォーク者一覧にmizuki1206edelweissというアカウントがありました。
Magneightの企業情報を見ると、このmizukiという人物はおそらくCEOのMizuki Sekozakiです。ここで、GitHubのコミット履歴からメールアドレスを特定できるのでは…? と思いつきました。
試しに適当なレポジトリをCloneしコミット履歴を見ると、Gmailのアドレスがありました。

というわけで、03_CEOのFlagはDiver25{<REDACTED>@gmail.com}となります…

さらに、Gmailアドレスが分かればGoogle関連のサービスを洗い出せたりしないかなーと調べていくと、GHuntというツールがあることを知り、使い方を調べてこのアドレスを検索してみたところ、非公開設定が不十分なGoogleカレンダーが取得できてしまいました。 怖...

ただし、ここからの進展はほぼありませんでした。Googleカレンダーに大した情報は載っていなかったうえ、他に試したことも

  • デザインスタジオ近くの銭湯に行ってるから、もしかしたらこのデザインスタジオは実在のものでは? => そんなわけない
  • SpamhausのIPを確認 => ShodanでそのIPを確認する発想まで至らず撃沈
  • Sherlockを用いてユーザー名を確認 => なぜかInstagramのアカウントをスルー

と、散々な結果でした。しかし、CTF問として比較的わかりやすくしているとはいえ、名札を落としただけでこれほどまでに特定できてしまうという事実に戦慄しました。


transportation

transportationは交通関連の問題です。道路や鉄道、航空、船舶などに加えて、それらを支える無線通信の知識も必要になります。

next_train (100pt)

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

音声ファイルからは、JR東日本15番線久里浜行きというキーワードを聞き取ることができました。
JR東日本管内で15番線以上のホームを持つ駅は、ごくわずかな巨大ターミナル駅に限られます。また、久里浜行きという案内はJR横須賀線である可能性が高く、15番線からJR横須賀線が発着する巨大ターミナルは品川駅です。

よって、FlagはDiver25{品川駅}となります。
東日本出身者にとっては非常に有利な問題でした。


platform (136pt)

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

まず、画像から以下の特徴が目につきました。

  • 「12両」、「10両」、「6両」の表記
  • オレンジ色の乗り場案内
  • 「らいと」という店舗名
  • 田舎

オレンジ色の列車で、かつ12両編成と10両編成が混在しているのは中央線である可能性が非常に高いです。さらに、6両編成まで乗り入れていることを考慮すると、青梅線の区間である可能性が高いと判断しました。

そのため、Google Mapで青梅線の駅をすべて見ていき、近所に「らいと」という店舗があるかどうかローラー作戦で確認していくと、牛浜駅のすぐ近くに「らいと」という名前の店舗を発見しました。

よって、FlagはDiver25{牛浜駅}となります。
またしても東日本出身者の自分にとって非常に有利な問題でした。


36_years_ago (347pt)

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

まず、問題で問われているMode Sコードが何かわからなかったので調べると、航空機に搭載されるトランスポンダ(航空機の識別情報などを管制機関に送信する装置)で用いられる個別の識別コードであることが分かりました。

問題の動画を再生し確認すると、機体にJA4098という登録番号が確認できます。
この登録番号を検索すると、航空機の写真などがまとめられたWebサイトがヒットしました。詳しく確認すると、この機体が過去にN9768L
という別の登録番号を使用していた
という情報を発見しました(url)

続いて、過去の登録番号であるN9768Lで検索すると、海外の航空機データベースと思われるサイトに辿り着きました。

このサイトには、53316552という値が記載されていましたが、この値をそのままフラグとして提出しても不正解でした。

再度「Mode S Code」で検索すると、サジェストに「Convert」があったため調査を進めると、データベースに記載されているコードは8進数であることがわかりました。これを16進数に変換すると、AD9D6Aというコードが得られました。

よって、FlagはDiver25{AD9D6A}となります。


listen (473pt)

音声 / Audio:
この航空管制のやり取りが録音された空港のICAOコード(4レターコード)を答えよ。
Flag形式: Diver25{RJTT}

航空無線に関する法令遵守のため、問題の音声ファイルを共有することはできません。ご了承ください。

提供された音声はノイズが多く非常に聞き取りづらいですが、いくつかの重要なフレーズを断片的に聞き取ることができました。

  • Air Canada 248, You are number one.
  • Air Canada 248, clear to land runway 02.

エアカナダ248便について検索すると、この便がバンクーバー国際空港(CYVR) 発、エドモントン国際空港(CYEG) 着の定期便であることが判明しました。

次に、着陸地であるエドモントン国際空港の情報を確認すると、この空港には滑走路02が存在することが裏付けられました。

以上より、この音声はエドモントン国際空港で録音されたものだとわかります。

よって、flagはDiver25{CYEG}となります。


sanction (375pt)

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

「ANGARA IMO」のように検索し、対象のRORO船「ANGARA」のIMO番号が9124043であることを突き止めました(ここで、introduction問題でIMO番号について学んだのが活きました)。

次に、このIMO番号と問題文の日付を組み合わせて「ANGARA 9124043 25 October 2024」などのキーワードで検索したところ、外務省の資料がヒットし、本船が北朝鮮の羅津(Rajin)港に停泊していることが明記されていました。
この情報を基にGoogle マップで羅津港の衛星画像を確認し、停泊位置の座標を取得した結果、42.22707823620379, 130.28270862002265が答えとなります。


air2air (495pt)

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

提供された動画を確認すると、進行方向左側に航空機が見え、自機の翼端板に特徴的なロゴマークが確認できます。また、機内のモニターから「台北行き」であることが確認でき、台北到着まで残り1時間という情報も得られました。さらに、撮影している航空機の機体左側に影ができていました。

台北には桃園国際空港と松山空港の2つが存在します。動画から「台湾の東側から飛んできている」というヒントが得られたため、Wikipediaで就航路線を調査し、この情報と一致する航空会社を絞り込みました。その結果、翼端板のロゴがスターラックス航空のそれと一致することを発見しました。

スターラックス航空の公式ウェブサイトには、非常にわかりやすい路線図が掲載されていました。

ここで行き詰ったので、一旦ターゲットの機種を特定することにしました。スターラックス航空が保有する機材はA321neoA330neoA350-900の3種類です(機材一覧)

動画の翼端板の形状から、A330neoは先端が尖っていないため除外しました。残るはA321neoとA350-900です。

「機種名 landing window view」などのキーワードで画像を検索し、フラップやスポイラーの配置を比較した結果、A350-900の配置が動画と酷似していることに気づきました。したがって、ターゲットの機体はA350であると判断しました。

A350は比較的大人数を運べる機材であるため、ドル箱路線の映像である可能性が高いと考えました。また、南西方向に向かう機体の左側に影ができているということは、太陽が北西にあることを意味し、これは夕方の時間帯です。これらの情報に基づき、スターラックス航空のA350使用路線のうち、夕方に台北に到着する可能性のあるものを以下のように絞り込みました。

  • 成田発 台北行き:
    • SJX801 16時50分着
    • SJX803 19時着
  • 大阪(関空)発 台北行き:
    • SJX821 15時20分着
    • SJX823 17時5分着

ここまでくれば、Flightradar24の有料プランがあれば一発で特定できます。しかし「無課金でも特定できる」という運営側からの案内があったため、手動で機体の特定をしようと試みました。しかし、最終的には限界が来たため、有料プランに課金し、3月11日のフライト履歴を詳細に確認しました。

その結果、SJX803便がスカイマーク8026便の真横を追い抜いていることを確認し、これが問題の航空機であると判断しました。

よってFlagはDiver25{SKY8026_JA73NY}となります。

余談ですが、Flightradar24ではなくADS-B ExchangeというWebサイトを用いると、過去のリプレイを無料で再生できるようです。俺の35ドル…


military

軍事関連の問題が出題されますが、正直言ってムリゲーです。今まで経験してきたこととあまりにも常識やツールが違いすぎて手も足も出ませんでした。

object (Unsolved)

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

まず、プロジェクト番号が何かわからなかったので調査を行ったところ、ロシア軍が構造物などに付与している一意の番号があるんだそうです。流出しまくってますけど、この軍隊の情報統制は大丈夫なんでしょうか。

指定された座標をGoogleマップで確認しましたが、地図上には何も表示されませんでした。しかし、2025年の衛星写真に切り替えると、何やら怪しげな建造物が存在することが確認できます。

この場所は「Olenya Guba(オレニヤ・グバ)」と呼ばれる入り江で、ロシア軍の基地があるようです。しかし、この地域は先日大規模な爆撃があったばかりで情報が錯綜していました。

次に、Twitterで「Olenya Guba」と検索するとこのツイート
ヒットしました。このツイートによると、この建造物には原子力潜水艦Лошарик(ロシャリク) が潜んでいるようです。そこで、ロシャリクのプロジェクト番号をFlagとして試しましたが、残念ながら通りませんでした。

このことから、求められているのは潜水艦本体ではなく、潜水艦を隠しているドックそのもののプロジェクト番号と名称を調べなければいけないようです。

それっぽいものは見つけたものの空振りでしたので、ここで調査をあきらめました。

OSINTにおけるSNSの威力を再認識しましたが、同時に言語の壁や、SNSで他人がすでに調査済みの情報だけをあたるのでは限界があることにも気づけました。また、ド素人である私が公開情報から軍事機密にアクセスできてしまえたことは正直非常に怖いと感じました。


hardware

実際のハードウェアについての文書を探していく問題が中心です。

phone (441pt)

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

画像を確認すると、このガラケーがSHARP製SH-01Jという端末であることがわかります。

この端末のサポート情報をたどると、携帯電話の比吸収率(SAR)についてというページがありましたが、ここには特に目立った情報はありませんでした。

次に、EMI試験は技適認証で確認されているのではないかと思いつきました。なので、そういった公的認証の公開資料をあたってみることにします。

そこで、「SH-01J 技適」などのキーワードで検索したところ、モバイル製品の技術情報を扱うブログ記事が見つかりました。

技適だけでなくFCC認証の資料をあたるという選択肢がありそうです。ここで、FCCの認証ID「APYHRO00240」で検索すると、関連文書の一覧がヒットしました。

上から順番に確認していくと、EMI TEST REPORTという文書が見つかり、

  • 三重にあるUM JAPANという企業で試験が行われたこと
  • 端末のシリアルは004401/11/583099/0であること
    が確認できました。

よって、FlagはDiver25{004401/11/583099/0}となります。


history

History問題は偽情報の精査にも使える非常に重要なジャンルです。しかし、公文書アーカイブという選択肢がすっぽ抜けていたため、完答することはできませんでした。

bridge (263pt)

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

まず、動画内に映る特徴的な建物を手がかりに場所を特定します。長薫寺という現代風の寺院の建物、naughtiesという建物などから、この場所は豊肥本線・竜田口駅周辺だとわかります。


次に、Google Mapで近辺を調べると、この橋が第二白川橋梁という名前であることがわかりました。また、さらに「第二白川橋梁 水害」などのキーワードで検索すると、この橋が1953年に水害で破壊されたとする資料がヒットします。

ここからは気合で「第二白川橋梁」「第2白川橋梁 水害」などで検索しまくると、熊本県下における近代橋梁の発展史に関する研究という論文がヒットし、そこに以下のような記述がありました。引用します。

豊肥本線の竜田口駅(熊本市)付近に架かる第二白川橋梁は、それまでの橋梁が1953(昭 和28)年の白川水害で流失したため、現在のトラス橋に架け替えられたものである(写真一 2.10参照)。この橋長72m(支間島62.4m)の単線下路式プラット・トラス橋は、1913(大 正2)年に製作された大阪城東線の澱川橋梁を転用して、1954(昭和29)年に災害後の復旧のた め架設された68)。

よって、flagはDiver25{澱川橋梁}となります。


感想

今回、初めてOSINT専門のCTFに参加して何よりもまず感じたのは、「恐怖」です。
『スマホを落としただけなのに』という推理小説がありましたが、それを彷彿とさせるように「名札を落としただけ」でこれほど多くの情報が特定できてしまうことに恐ろしさを感じました。普段、意識して見に行かないだけで、インターネット上にはいかに膨大な情報が公開されてしまっているかを痛感しました。

中にはロシア軍の機密情報と思しきものまでごく普通に転がっており、自身のSNSアカウントの全削除を本気で検討するほど、プライバシーと情報の機密性について深く考えさせられる機会になりました。

また、Writeupを書いたのも今回が初めてですが、あまりにも長ったらしく書いてしまったと反省しています。参加記という形をとりたかったため単なる解答解説にならないようにしたつもりですが、非常に読みづらい文章になってしまいました。

改めて、このような貴重な機会を提供してくださったDIVER OSINT CTF主催者の皆様に、心より感謝申し上げます。ありがとうございました。

Linux Club - 東京工科大学

Discussion