2024-06-13 (Updated on 2024-07-19)

DIVER OSINT CTF Writeup

はじめに

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

scoreboard
DIVER OSINT CTF
https://ctfd.diverctf.org/

Writeup

解いた順です。

問題文はここから見られます。

DIVER OSINT CTF 問題
https://hackmd.io/@ef5WwIC2SEiIpHfPcrl2GA/SyQ4JSWS0

Championships (geo)

入口の扉に 光華商場 と書かれているので建物はすぐにわかります。
貼られていた広告の写真を探すためにストリートビューで 2010 年 10 月まで遡ります。
そのまま建物の周りを見ていると、2010台北国际花卉博览会技嘉GO OC 2010全球超頻總決賽 の広告がたくさん貼られていることに気づきます。

優勝者にはニックネームがあると問題にあるので、技嘉GO OC 2010全球超頻總決賽 の優勝者を調べ、フラグを得ます。
GeoGuessr での視点が役に立ちました。写真の入口はこの奥にあったようです。

技嘉GO OC 2010全球超頻總決賽 比賽成績揭曉
https://www.gigabyte.com/tw/Press/News/937

office (introduction)

file mudai.odt を実行すると zip ファイルであることがわかります。
unzip してフラグを得ます。

dream (introduction)

画像を Google 画像検索にかけ、フラグを得ます。

serial (introduction)

2 本目の動画を見ると、機体に JA222A と書かれていることがわかります。 機体番号で検索して、フラグを得ます。

機体記号「JA222A」航空機ガイド
https://flyteam.jp/registration/JA222A

キャラクターに癒やされる問題ですね。

246 (introduction)

県道 246 号線の看板があるので、どの県か調べます。
写っている車のナンバープレートを拡大しますが、地名が読めません。字の形はなんとか分かるので、Wikipedia にある地名一覧を見て探します。 下関であることがわかり、奥に見えるのが関門海峡であると考えます。
Google Earth で橋の位置を基準に場所を探し、フラグを得ます。

ad_directiare (introduction)

名刺に Gmail のアドレスがあるので、GHunt にかけます。
Google マップのレビューにフラグが書かれています。

osprey1 (military)

Twitter で オスプレイ コールサイン と調べ、フラグを得ます。

オスプレイ コールサイン - Search / X
https://x.com/search?q=%E3%82%AA%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%20%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%20until%3A2024-06-09_12%3A00%3A00_JST

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.

‘Profound bond’: Hundreds gather at Tokyo air base to remember fallen Osprey aircrew
https://www.stripes.com/branches/air_force/2024-02-15/osprey-crash-japan-yokota-service-13010379.html

と書かれています。この日の日没は 17 時 22 分らしいので、これで間違いないと考えます。
あとは OpenStreetMap の Query features で Samurai Fitness Center の近くにある運動場に検索をかけ、フラグを得ます。
Way 番号を知らなかったので、かなり時間をかけてしまいました。

Way: 810021666 | OpenStreetMap
https://www.openstreetmap.org/way/810021666

number (misc)

外交官ナンバーの特徴的な車が写っています。
調べると外交官ナンバーの先頭 2 桁は国を示し、49 はクウェートであることがわかります。

外交官車両ナンバー 一覧表つくってみたよ。外ナンバー、青ナンバー(ブルーナンバー) - ヨシジのブログ
https://warmheart0159.hatenablog.com/entry/2017/06/06/162406

駐日クウェート大使館のホームページでフラグを得ます。

駐日クウェート国大使館
https://www.kuwait-embassy.or.jp/

promoter (history)

Google 画像検索で写っている池が愛知県の入鹿池であることがわかります。
入鹿池の Wikipedia のページで 発起 と検索すると、発起人が 江崎善左衛門了也 、父親が 江崎善左衛門宗度 であることがわかります。
また、Twitter より、宗度は 1627 年に亡くなったことがわかります。

最後に 江崎善左衛門宗度 1627 と検索して、フラグを得ます。

入鹿池の築造と木津用水の開削
https://www.jstage.jst.go.jp/article/jjsidre1965/49/7/49_7_630/_pdf

imagetrack (geo)

得られる画像を ExifTool にかけ、座標を得ます。
ストリートビューで建物を確認し、フラグを得ます。

leak (crypto)

時事問題ですね。
Google で DMM 流出先 と検索して、フラグを得ます。

DMMビットコインの不正流出(2024/5/31)
https://note.com/valuesharing/n/ncfdf4ddfa0b6

timestamp (misc)

画像が写ったプレスリリースの PDF を探します。

中国軍機の動向について(Y-9,H-6 他)
https://www.mod.go.jp/js/pdf/2024/p20240312_01.pdf

PDF から画像を取り出すと、隠れていたフラグを得られます。

youtuber (transportation)

この事件はちょっとしたニュースになったので覚えていました。

日本で無賃乗車、動画公開したユーチューバーに批判殺到 「そんなつもりはなかった」と謝罪
https://www.bbc.com/japanese/67247960

あちこちに転載されている動画を見ると、乗り継いた列車が さくら572 新大阪行き であること、次の駅が博多 であることがわかります。
この情報をもとに検索をかけ、フラグを得ます。

新幹線 さくら572号 新大阪行 列車時刻表
https://timetable.jr-odekake.net/train-timetable/104121?date=20240217

italy (transportation)

Twitter で イタリア ヘリコプター と検索すると、次のツイートが出てきます。

このヘリコプターのことだろうと考え、AW169I-LIDI と検索すると、次のツイートが出てきます。

間違いなさそうです。

この情報をもとに Flightradar24 や FlightAware を確認しますが、無課金では見ることができません。
根気よく探していると ADS-B Exchange というサイトを見つけ、左側のメニューから過去のデータを見ることができることに気づきます。
そのまま日付を合わせ、フラグを得ます。

ADS-B Exchange
https://globe.adsbexchange.com/?icao=3007a7&lat=37.870&lon=138.943&zoom=15.9&showTrace=2023-10-27&timestamp=1698381947

container (transportation)

フラグを得る方法が分からないので、Google で ctf container tracking と検索し、他のコンテストの Writeup を探します。
いくつか記事を見ると、どうやら track-trace というサイトでコンテナの経路を調べることができるようです。

track-trace
https://www.track-trace.com/container

コンテナ側面の番号を入力すると、オレンジ色のコンテナは 5 月 22 日頃に日本にあり、それ以前の経路が不明なこと、青色のコンテナは 4 月 19 日から 22 日までに日本にあることがわかります。
ここで、オレンジ色のコンテナと共にのぼりが写っている勝矢祭が 5 月 5 日に行われたことから、写真が撮られたのは 4 月 19 日から 22 日の間であると判断します。
最後に、地面が濡れていることから、東京の過去の天気を調べ、フラグ候補を 2 つに絞ります。

東京都心(大手町)(東京都)の過去の天気 - tenki.jp
https://tenki.jp/past/2024/04/weather/3/16/47662/

island (geo)

Google で "四方ぎり島" と調べると、3 件の PDF が見つかります。
これらを調べると、どうやら南極にある島のようです。 Google Earth の航空写真を見てみますが、島の形が全くわかりません。埋まってしまっているのでしょうか。

仕方なく Google で antarctica map と調べると、国土地理院のページが見つかります。

Printing map image : Download Antarctica Map
https://www.gsi.go.jp/antarctic/download_index_03-e.html

1/25,000 の地図をダウンロードし、フラグを得ます。

chiban (geo)

奥に見える歯科医院の名前と、うっすら見える電話番号で検索し、住所を見つけます。
あとは地番を探せば良いのですが、道路の地番とそれ以外(住宅や施設など)の地番が異なるものだと思いこんでしまっていたため、道路 地番 と検索し続けてしまい、かなり時間をかけてしまいます。 (ブルーマップというものを取り寄せないと見れないといったことが書かれた記事が大量に出てきます。)
最終的には、地番 検索 と調べてヒットしたサイトでフラグを得ます。

地番検索くん
https://chiban-kensaku.com/

label (misc)

FROM 欄に書かれている住所のビルを確認してみますが、フラグに繋がりそうな情報は得られません。 また、トラッキングコードを調べてみますが、このコードを使っている運送会社は見つかりません。
残るはバーコードと QR コードです。中央の QR コードのようなものをトリミングして、デンソーのアプリで読み取ると配送先の住所が出てきます。
この住所を検索し、フラグを得ます。

chain (introduction)

鳥貴族のホームページの店舗検索を開くと、一番上に出てくる店舗の階表記が 地下1階 になっています。 そのため、検索欄に 4階 と入力して、出てきた店舗を一つずつストリートビューで確認します。 しかし、23 件全て確認しても対象の看板はありません。
見落としたのだろうと思い 2 周目の確認を始めたところで、画像にある 4F の表記を見て、ようやく表記揺れに気づきます。
クエリを 4F に変更し、フラグを得ます。

satellite (military)

当時のニュースを検索し、衛星の名前が 万里鏡1号 であることを見つけます。

万里鏡1号 - Wikipedia
https://ja.wikipedia.org/wiki/%E4%B8%87%E9%87%8C%E9%8F%A11%E5%8F%B7

ChatGPT に人工衛星の過去の位置を調べる方法を聞くと、TLE データを使うと教えてくれます。
少し調べると、TLE データは定期的に更新されることがわかります。問題文がデータの時刻に言及しているのはこのことだと思い、当時の TLE データを探します。
すると、Space-Track.org というサイトを見つけます。

Space-Track.org
https://www.space-track.org/auth/login

このサイトの 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 と調べると、次のページが出てきます。

OSINT开源情报与侦察工具
https://start.me/p/GE7JQb/osint

地图类 にあるテンセントの地図を開き、フラグを得ます。

腾讯地图
https://map.qq.com?tempSource=pcMap&l=ee69ac9306dbae0b94a93c814ea21abf

accident (transportation)

渡された画像は台湾のもので、白と緑のバスが写っています。 問題文にある 似ている という表現が曖昧で、色、車種など様々なことを考えてしまいます。
国を台湾に絞って良いかも分からないので、ひとまず Google で tour bus accident 2023 と調べます。 出てくる画像を見ていると、似た色のバスが写った次の記事が見つかります。

Tour bus collides with car on Taiwan's Highway 3
https://www.taiwannews.com.tw/news/5024642

この事故は台湾で起きていたため、問題はこのことを指していると考えます。 更に調べると、次の記事が見つかります。

國道遊覽車飆速4死 家屬現場招不到魂 事故車前喊「回家」才擲聖杯
https://www.chinatimes.com/realtimenews/20231023001024-260402?chdtv

記事内の動画に含まれたカメラの映像から、停車した時刻を得ます。
また、映像に表示されている文字を検索すると、次のページが見つかります。

國道3號 263K+760 斗六交流道到古坑(北)交流道 即時影像
https://www.1968services.tw/cam/n3-s-263k+760

ありがたいことに座標が書かれているので、Google マップで開き、停車地点を推測してフラグを得ます。

フラグを提出したのが日付が変わるタイミングだったので、寝ることにします。

paddy (history)

横になって Kindle を開いたら 6 時になってしまっていました。もう少し順位を上げられそうだったので続けることにします。

国道 108 号線と川、線路の位置から、画像の地図は宮城県の石巻であることを見つけます。
北に通っている川が 旧北上川 だったので、その名前から過去に工事が行われていないか調べます。 実際に大規模な工事が行われたらしく、その主導者の名前を入力してみましたが不正解のようです。

ここで、地図の地域を見ると他の地域とは異なり 五工区二工区 などの特徴的な地名であることに気づきます。
これをもとに、Google で 石巻 河南 水田 と調べると、もともとこの地域には 広渕沼 という沼があったことがわかります。

2.広渕沼の干拓 【「わたしたちの河南町」(平成11年3月31日発行)を抜粋】
https://www.pref.miyagi.jp/documents/9756/200388.pdf

また、この PDF には広渕沼の干拓記念碑の画像が載っています。 ヒントにあった Monument speaks. はこれを指していると考え、この記念碑を探します。 しかし、この記念碑が最寄りの佳景山駅近くにあることはわかりますが、Google マップや Ingress の Intel Map (このような記念碑はポータルになっていがち)を使っても情報は得られません。 結局最後までヒントの意味はわからないままでした。

記念碑は諦めて広渕沼について調べていると、次の PDF が見つかります。

土地改良歴史資料室 図書一覧(2019 年 7 月)
http://www.mlw.or.jp/wp/wp-content/uploads/2018/07/library_list_ver2.7.pdf

どうやら 宮城県広渕沼沿革史 という本があるようです。
これをきっかけに、国立図書館デジタルコレクションの存在を思い出し、広渕沼 郡司 で検索します。
一番上に出てくる本から、フラグを得ます。

検索結果 - 国立図書館デジタルコレクション
https://dl.ndl.go.jp/search/searchResult?pageNum=0&pageSize=20&sortKey=SCORE&fullText=true&includeVolumeNum=true&keyword=%E5%BA%83%E6%B8%95%E6%B2%BC+%E9%83%A1%E5%8F%B8&displayMode=list&accessRestrictions=internet&accessRestrictions=ooc&accessRestrictions=inlibrary

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 年の問い合わせを集めたデータセットが見つかります。

311 Service Requests for 2004
https://data.cityofnewyork.us/Social-Services/311-Service-Requests-for-2004/sqcr-6mww/about_data

ページ内のクエリ機能を使い、フラグを得ます。

howmany (misc)

1 番のマンホールにはいくつか番号が書かれています。
Google で 東京 マンホール 番号 と調べると、次のページが見つかります。

東京番ホールマップ
https://ekikaramanhole.whitebeach.org/ext/0A0A/

ここに番号を入力すると、1 番のマンホールが歌舞伎町にあることがわかります。
範囲内で location.png と同じ角度の道を探すと、新宿区役所南の道であり、赤い自転車を扱うドコモ・バイクシェアのスタンドがあることを見つけます。 (道が全て範囲内であると思いこんでいたため、見つけるのに時間がかかりました。)

また、周囲をストリートビューで見ていると、ピンの位置の他に、区役所西側の通りにもスタンドがあることに気づきます。 (2021 年の画像なので、現在は撤去されているかもしれません。)

そのため、フラグは区役所にあるスタンド全ての返却可能台数の合計ではなく、ピンの位置のスタンドのみの返却可能台数であると考えます。 これが大きな誤解でした。
ピンの位置のスタンドのみを調べるには映像や画像を探すしかないと考え、ウェブカメラや YouTube、Twitch、Twitter を探しますが、見つかりません。

諦めて、スタンド全ての返却可能台数の合計を調べます。
バイクシェアのスタンドの情報が公開されていないか調べると、GBFS というものを見つけ、ドコモ・バイクシェアが公開していることを知ります。

ドコモ・バイクシェア バイクシェア関連情報 / Bikeshare information of DOCOMO BIKESHARE, INC.
https://ckan.odpt.org/dataset/c_bikeshare_gbfs-d-nationwide-bikeshare

しかし、得られるのは現在のデータであり、過去のものは見つかりません。
そのため、魚拓を探すと、archive.today で問題文の時間と一致する時間のデータが見つかります。

archive.md/mGgLI
https://archive.md/mGgLI

station_information.json から得られる station_id をもとに、フラグを得ます。

おわりに

楽しい CTF で良い思い出になりました。
運営の皆さん、ありがとうございました。

他にもいくつか OSINT CTF があるようなので、参加してみたいと思います。