DIVER OSINT CTF Writeup
はじめに
6 月 8 日 〜 9 日に開催された DIVER OSINT CTF に参加しました。
自分は 4 月の CPCTF で初めて OSINT 問題に出会った初心者なので力試し感覚で一人で参加しましたが、問題との相性が良かったのか 4 位を取ることができました。やった〜。

Writeup
解いた順です。
問題文はここから見られます。
Championships (geo)
入口の扉に 光華商場
と書かれているので建物はすぐにわかります。
貼られていた広告の写真を探すためにストリートビューで 2010 年 10 月まで遡ります。
そのまま建物の周りを見ていると、2010台北国际花卉博览会
と 技嘉GO OC 2010全球超頻總決賽
の広告がたくさん貼られていることに気づきます。
優勝者にはニックネームがあると問題にあるので、技嘉GO OC 2010全球超頻總決賽
の優勝者を調べ、フラグを得ます。
GeoGuessr での視点が役に立ちました。写真の入口はこの奥にあったようです。
office (introduction)
file mudai.odt
を実行すると zip ファイルであることがわかります。
unzip
してフラグを得ます。
dream (introduction)
画像を Google 画像検索にかけ、フラグを得ます。
serial (introduction)
2 本目の動画を見ると、機体に JA222A
と書かれていることがわかります。
機体番号で検索して、フラグを得ます。
キャラクターに癒やされる問題ですね。
246 (introduction)
県道 246 号線の看板があるので、どの県か調べます。
写っている車のナンバープレートを拡大しますが、地名が読めません。字の形はなんとか分かるので、Wikipedia にある地名一覧を見て探します。
下関であることがわかり、奥に見えるのが関門海峡であると考えます。
Google Earth で橋の位置を基準に場所を探し、フラグを得ます。
ad_directiare (introduction)
名刺に Gmail のアドレスがあるので、GHunt にかけます。
Google マップのレビューにフラグが書かれています。
osprey1 (military)
Twitter で オスプレイ コールサイン
と調べ、フラグを得ます。
osprey2 (military)
Google で osprey memorial
と調べると、一番上に出てくる記事に
A half-hour before sunset, approximately 600 people, mostly airmen in uniform, gathered for a brief retreat ceremony on the athletic field outside Yokota’s Samurai Fitness Center.
と書かれています。この日の日没は 17 時 22 分らしいので、これで間違いないと考えます。
あとは OpenStreetMap の Query features で Samurai Fitness Center の近くにある運動場に検索をかけ、フラグを得ます。
Way 番号を知らなかったので、かなり時間をかけてしまいました。
number (misc)
外交官ナンバーの特徴的な車が写っています。
調べると外交官ナンバーの先頭 2 桁は国を示し、49 はクウェートであることがわかります。
駐日クウェート大使館のホームページでフラグを得ます。
promoter (history)
Google 画像検索で写っている池が愛知県の入鹿池であることがわかります。
入鹿池の Wikipedia のページで 発起
と検索すると、発起人が 江崎善左衛門了也
、父親が 江崎善左衛門宗度
であることがわかります。
また、Twitter より、宗度は 1627 年に亡くなったことがわかります。
江崎善左衛門宗度墓。小牧市にある土豪、江崎善左衛門宗度の墓。江崎善左衛門は「小牧・長久手の戦い」の際に小幡城に向かう徳川家康を小牧山から勝川村まで先導したとされる。 pic.twitter.com/E7E6YHDBEX
— 真庭ふしぎ@風来人 (@fusigi_plants) June 23, 2020
最後に 江崎善左衛門宗度 1627
と検索して、フラグを得ます。
imagetrack (geo)
得られる画像を ExifTool にかけ、座標を得ます。
ストリートビューで建物を確認し、フラグを得ます。
leak (crypto)
時事問題ですね。
Google で DMM 流出先
と検索して、フラグを得ます。
timestamp (misc)
画像が写ったプレスリリースの PDF を探します。
PDF から画像を取り出すと、隠れていたフラグを得られます。
youtuber (transportation)
この事件はちょっとしたニュースになったので覚えていました。
あちこちに転載されている動画を見ると、乗り継いた列車が さくら572 新大阪行き であること、次の駅が博多 であることがわかります。
この情報をもとに検索をかけ、フラグを得ます。
italy (transportation)
Twitter で イタリア ヘリコプター
と検索すると、次のツイートが出てきます。
23/10/24
— えあり (@AriesATC) October 27, 2023
Yao Airport
AlidauniaLeonardo AW169
I-LIDI
イタリアのヘリコプター運航会社AlidauniaのAW169水平安定板の折り返し方が興味深い pic.twitter.com/2IpD0CA3bb
このヘリコプターのことだろうと考え、AW169
や I-LIDI
と検索すると、次のツイートが出てきます。
2023/10/27 KIJ/RJSN
— 倉島 (@neet_KY) October 27, 2023
Alidaunia[D4/LID]I-LIDI Leonardo AW169
イタリアの航空会社「アリダウニア」が所有するAW169が新潟に飛来。急な出来事だった為降りには間に合いませんでしたが、ほぼクリアなショットと情報量の多すぎる格納の様子が撮れたのでヨシ!
Benvenuti a Niigata! pic.twitter.com/lOtTKBPANs
間違いなさそうです。
この情報をもとに Flightradar24 や FlightAware を確認しますが、無課金では見ることができません。
根気よく探していると ADS-B Exchange というサイトを見つけ、左側のメニューから過去のデータを見ることができることに気づきます。
そのまま日付を合わせ、フラグを得ます。
container (transportation)
フラグを得る方法が分からないので、Google で ctf container tracking
と検索し、他のコンテストの Writeup を探します。
いくつか記事を見ると、どうやら track-trace というサイトでコンテナの経路を調べることができるようです。
コンテナ側面の番号を入力すると、オレンジ色のコンテナは 5 月 22 日頃に日本にあり、それ以前の経路が不明なこと、青色のコンテナは 4 月 19 日から 22 日までに日本にあることがわかります。
ここで、オレンジ色のコンテナと共にのぼりが写っている勝矢祭が 5 月 5 日に行われたことから、写真が撮られたのは 4 月 19 日から 22 日の間であると判断します。
最後に、地面が濡れていることから、東京の過去の天気を調べ、フラグ候補を 2 つに絞ります。
island (geo)
Google で "四方ぎり島"
と調べると、3 件の PDF が見つかります。
これらを調べると、どうやら南極にある島のようです。
Google Earth の航空写真を見てみますが、島の形が全くわかりません。埋まってしまっているのでしょうか。
仕方なく Google で antarctica map
と調べると、国土地理院のページが見つかります。
1/25,000 の地図をダウンロードし、フラグを得ます。
chiban (geo)
奥に見える歯科医院の名前と、うっすら見える電話番号で検索し、住所を見つけます。
あとは地番を探せば良いのですが、道路の地番とそれ以外(住宅や施設など)の地番が異なるものだと思いこんでしまっていたため、道路 地番
と検索し続けてしまい、かなり時間をかけてしまいます。
(ブルーマップというものを取り寄せないと見れないといったことが書かれた記事が大量に出てきます。)
最終的には、地番 検索
と調べてヒットしたサイトでフラグを得ます。
label (misc)
FROM 欄に書かれている住所のビルを確認してみますが、フラグに繋がりそうな情報は得られません。
また、トラッキングコードを調べてみますが、このコードを使っている運送会社は見つかりません。
残るはバーコードと QR コードです。中央の QR コードのようなものをトリミングして、デンソーのアプリで読み取ると配送先の住所が出てきます。
この住所を検索し、フラグを得ます。
chain (introduction)
鳥貴族のホームページの店舗検索を開くと、一番上に出てくる店舗の階表記が 地下1階
になっています。
そのため、検索欄に 4階
と入力して、出てきた店舗を一つずつストリートビューで確認します。
しかし、23 件全て確認しても対象の看板はありません。
見落としたのだろうと思い 2 周目の確認を始めたところで、画像にある 4F
の表記を見て、ようやく表記揺れに気づきます。
クエリを 4F
に変更し、フラグを得ます。
satellite (military)
当時のニュースを検索し、衛星の名前が 万里鏡1号
であることを見つけます。
ChatGPT に人工衛星の過去の位置を調べる方法を聞くと、TLE データを使うと教えてくれます。
少し調べると、TLE データは定期的に更新されることがわかります。問題文がデータの時刻に言及しているのはこのことだと思い、当時の TLE データを探します。
すると、Space-Track.org というサイトを見つけます。
このサイトの Query Builder で検索し、目的の TLE データを得ます。
これをもとに ChatGPT に次のコードを書いてもらい、実行します。
from skyfield.api import load, EarthSatellite
from datetime import datetime
# TLEデータの入力
line1 = "1 58400U 23179A 24158.19566690 .00000871 00000-0 41535-4 0 9999"
line2 = "2 58400 97.4052 45.2326 0002221 305.1745 54.9283 15.21704003 30052"
# 衛星の初期化
satellite = EarthSatellite(line1, line2, 'ISS (ZARYA)', load.timescale())
# 計算したい時刻の指定
year = 2024
month = 6
day = 7
hour = 5
minute = 1
second = 7
# 衛星の位置計算
ts = load.timescale()
t = ts.utc(year, month, day, hour, minute, second)
geocentric = satellite.at(t)
# 緯度、経度、高度の計算
subpoint = geocentric.subpoint()
latitude = subpoint.latitude.degrees
longitude = subpoint.longitude.degrees
altitude = subpoint.elevation.km
# 結果の表示
print(f"緯度 (度): {latitude:.6f}°")
print(f"経度 (度): {longitude:.6f}°")
print(f"高度: {altitude:.2f} km")
Google マップで座標を開くと、アメリカのテキサス州であることがわかります。
近くの基地を調べ、フラグを得ます。
construction (geo)
渡された座標は中国のもののようです。当然ながら、Google マップには何も表示されていません。
中国の地図で思い浮かんだ Baidu の地図を開きますが、これにも表示されていません。
行き詰まったので Google で osint china map
と調べると、次のページが出てきます。
地图类
にあるテンセントの地図を開き、フラグを得ます。
accident (transportation)
渡された画像は台湾のもので、白と緑のバスが写っています。
問題文にある 似ている
という表現が曖昧で、色、車種など様々なことを考えてしまいます。
国を台湾に絞って良いかも分からないので、ひとまず Google で tour bus accident 2023
と調べます。
出てくる画像を見ていると、似た色のバスが写った次の記事が見つかります。
この事故は台湾で起きていたため、問題はこのことを指していると考えます。 更に調べると、次の記事が見つかります。
記事内の動画に含まれたカメラの映像から、停車した時刻を得ます。
また、映像に表示されている文字を検索すると、次のページが見つかります。
ありがたいことに座標が書かれているので、Google マップで開き、停車地点を推測してフラグを得ます。
フラグを提出したのが日付が変わるタイミングだったので、寝ることにします。
paddy (history)
横になって Kindle を開いたら 6 時になってしまっていました。もう少し順位を上げられそうだったので続けることにします。
国道 108 号線と川、線路の位置から、画像の地図は宮城県の石巻であることを見つけます。
北に通っている川が 旧北上川
だったので、その名前から過去に工事が行われていないか調べます。
実際に大規模な工事が行われたらしく、その主導者の名前を入力してみましたが不正解のようです。
ここで、地図の地域を見ると他の地域とは異なり 五工区
や 二工区
などの特徴的な地名であることに気づきます。
これをもとに、Google で 石巻 河南 水田
と調べると、もともとこの地域には 広渕沼
という沼があったことがわかります。
また、この PDF には広渕沼の干拓記念碑の画像が載っています。
ヒントにあった Monument speaks.
はこれを指していると考え、この記念碑を探します。
しかし、この記念碑が最寄りの佳景山駅近くにあることはわかりますが、Google マップや Ingress の Intel Map (このような記念碑はポータルになっていがち)を使っても情報は得られません。
結局最後までヒントの意味はわからないままでした。
記念碑は諦めて広渕沼について調べていると、次の PDF が見つかります。
どうやら 宮城県広渕沼沿革史
という本があるようです。
これをきっかけに、国立図書館デジタルコレクションの存在を思い出し、広渕沼 郡司
で検索します。
一番上に出てくる本から、フラグを得ます。
wumpas (misc)
渡された画像に写る URL の末尾が {Guild ID}/{Channel ID}
になっていることは知っていましたが、どうすればサーバに入れるかわかりません。
Discord の API を叩いたり ID の Snowflake を調べたりしてみますが、これといった情報は手に入りません。
行き詰まったので Google で osint discord invite
と調べます。
すると、Discord Servers というページが見つかり、これに Guild ID を入力するとサーバが見つかります。画像のもので間違いないようです。
サーバに入り、投稿されている QR コードを読み取り、フラグを得ます。
あまり縁が無いサービスだったので時間をかけてしまいました。
public_service (geo)
この問題は 8 日に一度手をつけましたが、どうすればよいかわからずに放置していました。
まず、左下の小さな地図を見て、画像がニューヨーク州クイーンズ区のものであることを見つけます。
次に、クイーンズ区で交差点に関する問題を報告する方法を ChatGPT に聞くと、311
というサービスを使うと教えてくれます。
この情報をもとに、Google で nyc 311 history
と調べると、2010 年から現在までのデータが公開されていることに気づきます。
このサイト内を検索すると、2004 年の問い合わせを集めたデータセットが見つかります。
ページ内のクエリ機能を使い、フラグを得ます。
howmany (misc)
1 番のマンホールにはいくつか番号が書かれています。
Google で 東京 マンホール 番号
と調べると、次のページが見つかります。
ここに番号を入力すると、1 番のマンホールが歌舞伎町にあることがわかります。
範囲内で location.png と同じ角度の道を探すと、新宿区役所南の道であり、赤い自転車を扱うドコモ・バイクシェアのスタンドがあることを見つけます。
(道が全て範囲内であると思いこんでいたため、見つけるのに時間がかかりました。)
また、周囲をストリートビューで見ていると、ピンの位置の他に、区役所西側の通りにもスタンドがあることに気づきます。 (2021 年の画像なので、現在は撤去されているかもしれません。)
そのため、フラグは区役所にあるスタンド全ての返却可能台数の合計ではなく、ピンの位置のスタンドのみの返却可能台数であると考えます。
これが大きな誤解でした。
ピンの位置のスタンドのみを調べるには映像や画像を探すしかないと考え、ウェブカメラや YouTube、Twitch、Twitter を探しますが、見つかりません。
諦めて、スタンド全ての返却可能台数の合計を調べます。
バイクシェアのスタンドの情報が公開されていないか調べると、GBFS
というものを見つけ、ドコモ・バイクシェアが公開していることを知ります。
しかし、得られるのは現在のデータであり、過去のものは見つかりません。
そのため、魚拓を探すと、archive.today で問題文の時間と一致する時間のデータが見つかります。
station_information.json
から得られる station_id
をもとに、フラグを得ます。
おわりに
楽しい CTF で良い思い出になりました。
運営の皆さん、ありがとうございました。
他にもいくつか OSINT CTF があるようなので、参加してみたいと思います。