DIVER OSINT CTF 2024 Writeup
- CTF
- Security
- OSINT
DIVER OSINT CTFにチームWani Hackaseで参加し、3位を獲得しました。深夜2時にXでこのCTFを知り急遽参加したため、全問をほぼ1人で解いていました。個人的にOSINTは大好きなので、こういったCTFがあることはとても嬉しいです。
The final result of DIVER OSINT CTF. 1st: KAKITSUBATA (11251 pts) 2nd: 25時、ディスコードで。 (9751 pts) 3rd: Wani Hackase (8290 pts) 4th: Gai (7798 pts) 5th: La Casa de Papel (7785 pts) Congratulations! 🎉
[misc] number
「外交官ナンバー 49」で検索し、見つけたこちらのサイトからクウェートと特定しました。駐日クウェート国大使館の電話番号がフラグです。
[misc] label
追跡番号、バーコード、横長のQRコードが怪しいです。QRコードの情報量が多そうなので「横長 QR」で検索すると、rMQRと呼ばれる形式であることがわかりました。スマホにrMQRリーダーをインストールし、QRコードを読み取ると配送先住所が得られます。
[misc] wumpus
画面に表示されているURLにアクセスしても、当然サーバーに参加していないので何も得られません。URLの一部にサーバーIDが含まれていると推測し、サーバーIDでGoogle検索すると参加画面にアクセスできました。
[misc] timestamp
「3月12日 H-6爆撃機」と検索するとこちらのPDFがヒットします。
CubePDF ImagePickerでPDF内の画像を取り出してみると、PDF上ではトリミングされている部分に撮影日時が隠れていました。
[misc] howmany
最初の手がかりは1枚目のマンホールの番号しかありません。適当に検索してみると、左の3つの番号でマンホールが管理されていることがわかります。
しかし、東京都水道局のサイトには具体的な位置の求め方は書かれていません。「下水道台帳」というページでマンホールの地図を見ることができますが、マンホールの番号から位置を割り出す機能はありません。
更に検索すると、こちらの個人サイトに行き当たりました。このサイトを制作された方はどうやら独自で番号と位置の対応を見出したようです。
ここで1
とI
を見間違えて時間を溶かしつつも、最終的にはマンホールが新宿駅東口周辺にあることがわかりました。あとはGoogleマップ、下水道台帳、レンタサイクルターミナルの情報を照らし合わせると、問題のレンタサイクルターミナルが「ドコモ・バイクシェア D6-01.新宿区役所本庁舎」であると特定できます。
続いて、レンタサイクルターミナルの返却可能台数を調べます。「バイクシェア オープンデータ」で検索するとこちらのページがヒットします。
このリンクをたどるとバイクシェアターミナルの最新情報がJSON形式で得られます。このウェブサイトでは過去の情報は公開されていませんが、archive.isで検索してみると05/30 23:46 (JST)のスナップショットが見つかりました。
[military] osplay1
GoogleやXで検索すると、こちらの投稿がヒットします。
墜落により乗員全員が殉職した在日米軍のオスプレイは「ガンダム22」というコールサインだったらしい。
We pause to mourn, remember, and pray for our fallen teammates, and grieve with the families, loved ones, friends and fellow service members of these heroes. We are exceedingly grateful for our Japanese Allies and neighbors for their commitment to search and rescue, and recovery.
墜落したCV-22Bオスプレイ。コールサイン「ガンダム22」は間違いないみたいだけど、シリアルナンバーが違う可能性がある。嘉手納ウォッチャーの情報待ち。
2機は岩国に戻ったようなので、事故機はGUNDAM22(12-0065)でほぼ確定。
[military] osplay2
こちらは検索してもなかなかヒットせず苦労しました。「feb 15 memorial service」で検索すると横田基地のページがヒットするのですが、その記事はなぜか削除されていました。そこで改めて「feb 15 memorial service yokota」で検索すると、こちらの写真が見つかります。
あとはEXIFから日時がわかり、背景の太陽と「chilli’s」等の建物から位置が特定できます。「OpenStreetMapのWay番号で答えよ」の意味がわからず戸惑いましたが、OpenStreetMapの画面上で適当にボタンを押していたらWay番号が得られました。
[military] osplay3
osplay1で特定した機体登録番号で検索すると、いくつかの写真共有サイトがヒットします。地道に1つづつ確認していくと、ちょうど11/15の夜に撮影されたこの写真が見つかります。
オスプレイって駐機する際も固定翼モードにできるんですね。知りませんでした。
写真共有サイトに登録されたメタデータから、この空港が「Kraków John Paul II Balice Int’l - EPKK」であることがわかります。背景の管制塔や格納庫とGoogleマップの航空写真を見比べることで、駐機位置の座標が特定できます。
ここから更に駐機位置の高度を調べる必要があります。「EPKK chart」で検索すると、こちらのサイトがヒットします。
Aerodrome Chartを開くと、先ほど特定した駐機位置に「MILITARY APRON 3 ELEV 774」と書かれています。774ftが答えです。
[military] satellite
少し調べると、問題の衛星が「万里鏡1号」であることがわかります。ChatGPTに「特定の日に北朝鮮が打ち上げた衛星の現在位置を知るにはどうすればよいでしょうか?」と質問すると、NORADやCelesTrakを使って衛星の軌道を追跡することができると教えてくれました。
しかし、CelesTrakで提供されているのは衛星の現在の位置情報であり、特定の日時の位置情報を取得する方法はわかりませんでした。そこで改めてChatGPTに「過去の位置を知る方法はありますか?」と聞くと、Pythonで計算できると教えてくれました。提示されたコードを少し修正し、導き出された答えを半信半疑で提出してみると正解でした。
from skyfield.api import load
# TLEデータを読み込み
satellite = load.tle_file("58400.txt")[0]
ts = load.timescale()
t = ts.utc(2024, 6, 7, 5, 1, 7)
# 衛星の位置を計算
geocentric = satellite.at(t)
subpoint = geocentric.subpoint()
print(
f"Latitude: {subpoint.latitude.degrees}, Longitude: {subpoint.longitude.degrees}, Elevation: {subpoint.elevation.km} km"
)
[introduction] 246
看板から、撮影場所が県道246号の始点または終点であることがわかります。背景の吊り橋も特徴的です。車のナンバープレートが「下関」であることに気づけばすぐ解けます。私は気づかず岡山周辺で時間を溶かしました。
[introduction] office
.docxファイルが与えられたらまずは拡張子をzipにして展開するのが定石ですが、今回配布されたのは.odtファイルでした。調べてみると.odtファイルも同じくzip形式であることがわかったため、展開して適当に中身を眺めるとフラグが見つかりました。
[introduction] chain
画像内に手がかりが少なく、始めはどう手を付ければよいかわからず戸惑いました。鳥貴族の店舗検索ページで「4F」と検索し、ヒットした店舗をストリートビューでしらみつぶしに探すと見つかりました。
[introduction] dream
Google Lensで画像全体を検索するとヒットしました。
[introduction] serial
動画に登録記号「JA222A」がしっかり写っています。登録記号/レジ、製造番号/シリアルの言葉の使い分けがよくわからないのですが、今回は製造番号が正解でした。
[introduction] ad_directiare
メールアドレスをGHuntで調べると、Google Mapsのレビューとしてうな重の投稿が見つかります。Googleアカウントに紐づいた公開カレンダーにはイースターエッグ(?)が隠されていました。
[geo] imagetrack
グラスに店名らしきものが書かれていますが、こちらは調べてみると郷土料理屋ではありませんでした。EXIFを確認すると位置情報があるので、その近くの郷土料理屋を検索しました。
[geo] chiban
場所は「サンディ 7号店」で検索すればわかるかと思いきや、意外と見つかりませんでした。奥の車に「岡田歯科医院」と書かれているので「岡田歯科医院 サンディ」で検索すると以下のような検索結果が見つかり、場所が特定できます。
サンディ 双葉店(その他スーパー)周辺の病院/薬局 NAVITIME
1 岡田歯科医院: 30m
場所がわかったので地番を調べます。なかなか見つからず困りましたが、最終的に「地番 オープンデータ」で調べると「登記所備付地図データ」という名前でデータが公開されていることがわかり、こちらのサイトに辿り着きました。
[geo] championships
Google Lensで調べると、この場所が台湾の光華商場であることがわかります。Google Lensでこの入口が引きの画角で撮られた写真を見つけ、それを手がかりにストリートビューで周辺を回ると25.04492, 121.53173
あたりで撮影されていると特定できます。
ストリートビューにはちょうど2010年10月に撮影された写真があり、入り口付近にある広告には「GIGABYTE Fight」の文字が見えます。これを検索すると、この大会が「The GIGABYTE Open Overclocking Championship (GO OC) 2010」であることがわかり、優勝者の名前も見つかります。
[geo] power
JR西日本の特急列車が走っているのがわかります。JR西のウェブサイトを見ると、この車両を使っているのは大阪-敦賀間を走る特急サンダーバードであることがわかります。風景はJR京都線っぽい気がしますが、それ以上は特定できませんでした。
[geo] island
“四方ぎり島”で検索すると、この島が南極にあることがわかり、座標が手に入ります。「南極 地形図」で検索すると以下のWebページがヒットします。
リンク先の地理院地図で該当する座標を調べ、地図の種類を切り替えながら確認すると、1:25000の地形図に標高が詳しく記載されていました。
[geo] public_service
中央にある「Citi Field Parking」の看板から、この場所がニューヨークのCiti Field周辺であることがわかります。画像左下の地図を手がかりに周辺を探すと、撮影場所が40.7481, -73.8541
と特定できます。
ここから「46th avenue 111th street new york complaint november 2004」などのワードでGoogle検索をしましたが、それ以上の手がかりは見つけられませんでした。
[crypto] leak
GoogleやXの検索で見つかります。
[history] promoter
画像全体をGoogle Lensに入れても情報は得られませんが、中央の特徴的なドームのような建物にフォーカスしてGoogle Lensで調べると「入鹿池」であることがわかります。あとはGoogle検索でわかります。
[history] paddy
地図に写っている国道108号線をたどると、この場所が38.49, 141.22
付近であることがわかります。ここから石巻市の歴史を調べたのですが、答えにはたどり着けませんでした。
[transportation] youtuber
ニュース記事からこのYouTuberが新鳥栖駅を経由したこと、再アップロードされた動画からこのYouTuberが乗車したのがさくら572号であることがわかります。列車番号はGoogle検索ですぐに見つかりした。
[transportation] accident
この問題はチームメイトの @southball が解いてくれました。画像からこの場所が台湾であることがわかります。Google検索するとこのニュース記事が見つかります。
時刻を秒単位で特定する必要があるため、タイムスタンプ付きのドライブレコーダーの映像が残っているか、あるいは事故調査報告書のようなものがあるのではないかというメタ読みをしつつ調べます。日本の運輸安全委員会や米国のNTSBに相当する台湾の国家運輸安全調査委員会 (TTSB)のウェブサイトを中国語で見ると、上記の事故の調査報告書が見つかりました。
そちらには事故車両の停車時刻や座標が正確に記載されていたのですが、どうもフラグが正解になりません。TTSBの事故調査報告書をもう少し調べてみると別の事故が見つかり、そちらが正解でした。バスのラッピングもこちらのほうが似ていますね。
[transportation] italy
航空機の位置を調べるサイトはFlightRadar24やFlightAware、ADS-B Exchangeが有名です。これらのサイトは主に航空機が発する位置情報などの電波を情報源としており、世界中のアンテナで受信された情報を集約して提供しています。私も自宅にアンテナを設置してFlightRadar24とFlightAwareに情報を提供しています。
これらのサイトで2023年10月27日の新潟付近を確認すると、このヘリコプターの保有者と新潟大学を通過した際の高度がわかります。FlightRadar24やFlightAwareは有料プランが必要ですが、ADS-B Exchangeは無料で利用できます。
余談ですが、FlightRadar24やFlightAwareでは自主規制により一部のプライベートジェットや軍用機などが表示されないことがあります。ADS-B Exchangeにはそのような規制がないようです。
[transportation] container
「勝矢祭」ののぼりから、この場所が亀戸周辺であることがわかります。電柱の質屋の広告にある地図から亀戸駅南側であることがわかり、「〇〇橋南詰」という交差点名と背景から撮影場所が35.6933, 139.8261
であると特定できます。
しかし、この問題では正確な撮影場所はあまり重要ではありません。コンテナをよく見ると、識別番号のようなものが記載されていることが確認できます。コンテナの追跡ができるサイトを使ってこの番号を検索すると、オレンジのコンテナは5/22~5/24、青のコンテナは4/19~4/22頃にトラックで日本を移動していたことがわかります。また、青のコンテナは5/22時点ではまだ海の上を移動中であるため、撮影日は4/19~4/22であると推測できます。
(青のコンテナを追跡できるWebサイトはCTF開催中にメンテナンスが行われていましたが、運営から案内があったようにチケットで問い合わせると追跡結果を教えてもらえます。)
地面が濡れていることから撮影直前に雨が降っていたと考えられます。東京の過去のライブカメラ映像を確認すると、雨が降っていたのは4/21 15:00頃と4/22 朝であることがわかります。これらの候補を試すと、4/22 午前が正解でした。
[investigation_request] mapper
画像中央の「ベストグランド」の看板から、この場所が35.4120, 136.7566
であることがわかります。しかし撮影日時については、木に葉がついていないので冬であることくらいしかわかりません。まさか影の向きや長さから時間を当てるのかと思いましたが、問題文をよく読むと「彼が撮ってアップロードした写真」と書かれています。
インターネットのどこかにこの画像がアップロードされていると考え、Google画像検索をしてみましたが見つかりません。XやInstagramで岐阜駅を検索してもこの画像はありません。ここでまた行き詰まりましたが、改めて問題文を読むと、タイトルが「mapper」になっています。OpenStreetMapにこの画像がアップロードされているのではないかと考え、「openstreetmap 画像」で検索すると以下のページが見つかります。
このページからリンクされているいくつかの画像アップロードサイトを探すと、この投稿が見つかりました。
[investigation_request] uploader
先程のMapillaryの投稿者は「mori_mune24」という名前で、プロフィールは「I love X」となっています。XでこのIDを確認するとアカウントが見つかります。 しかし、Xのアカウントには猫の動画はアップロードされていません。同名のInstagramのアカウントも見つかりますが、こちらには全く投稿がありません。
Xの投稿を見ていくと、TikTok上の猫動画のURLをポストしているのを発見できます。実はTikTokアプリでは、共有ボタンを押した際に発行されるURLは共有操作を行ったユーザーごとに異なるものが生成されます。このURLから投稿にアクセスすると、共有操作を行ったユーザーのフォローを推奨する画面が表示され、共有操作を行ったユーザーのアカウントがバレてしまうという怖い仕様があります。
(余談ですが、StackOverflowにも同様の仕様があります。こちらは共有時に発行されるURLにユーザーIDが含まれているため、URLを共有すると自分のアカウントが特定されてしまいます。YouTubeやInstagramでも共有操作ごとに異なるURLが発行されますが、こちらはユーザーがアカウントを特定することはできません。)
これを利用し、スマートフォンにTikTokアプリをインストールしてURLにアクセスするとアカウントが特定できます。このアカウントには猫動画がアップロードされています。
秒単位の投稿日時はTikTokの画面上では確認できませんが、「tiktok date extractor」と検索すると、投稿のURLから秒単位の投稿日時を特定できるWebサイトが見つかります。おそらく投稿IDに日時情報が含まれているのだと思います。Twitter (X)にも同様の仕組みがあり、こちらは投稿IDからミリ秒単位の投稿日時を特定することができます。
[investigation_request] venue
Xの投稿から、このイベントに関するGoogle Documentが見つかります。文章そのものには会場の情報は記載されていませんが、文章につけられたコメントを読むと会場の情報が文章から削除されていることがわかります。このコメントがつけられた対象の文に、会場のURLが残っています。