6/8 - 6/9という日程で開催された。日本のCTFプレイヤーが開催する、"real-world oriented" という触れ込みだったOSINTのCTFだ。チーム「25時、ディスコードで。」の「離れ離れの街を繋ぐ列車は行ってしまったね」として参加して2位。Satokiさん、pr0xyさん、rand0mさんといういつものBunkyoWesternsの面々に加えて、チームProject Sekaiよりsahuangさんとenscribeさん*1を迎えての参加だった。
OSINTカテゴリ専門となると、簡単すぎず理不尽すぎずという、ほどほどに難しく楽しいバランスの問題を構成するのは難しいだろうと思う。このCTFでは、militaryカテゴリやhistoryカテゴリを代表として、よく考えたり調査したりすれば十分に解けるような良い塩梅で情報が絞られた問題文および添付ファイルが提供されており、またツールを使うだけではなく、使うにしてもこれまで得られた情報とどう結びつけるか、得られた情報からさらにほかの情報を得るにはどうするか等を自分で考える必要のある問題が多く、楽しかった。
しかしながら、我々の全完を妨げたinvestigation_requestカテゴリでは、どうにも理不尽に感じられる面もあった。まずこのカテゴリはmapperという入口となる問題を解かねば次の2問には挑めず、またmapperはなんとかして(その問題名から連想して?)Mapillaryを掘り当てるのが解法であるところ、我々のチームは迷走してしまっていた。Metaに特有なFBMDという追跡に使われると推測されるバイト列が画像中に見つかったことから、FacebookやInstagramで写真の撮影地を中心に関係者や施設を長時間調査するとか*2、mapperというのはFoursquareやSwarmのようにマップに関連するツールのユーザを追跡する*3、あるいはGoogleマップで廃業とされている等から現在はすぐには閲覧できない店舗等の写真を掘り下げることを示唆しているのではないかと考え、撮影地周辺にレビューを投稿しているユーザのほかのレビューを参照して芋づる式に過去存在した施設の写真を確認するとか、想定解法からかなり外れたアプローチになってしまっていた*4*5。
CTF運営がmapperはeasyと簡単めの難易度であると推定しており、その情報も参加者へ与えられているところ、難しく考えてしまいシンプルなアプローチへ戻ってくることのできなかった我々が悪いのは重々承知の上で、easyという難易度にしては中途半端に思える誘導が、我々のチームにはrabbit holeとして機能してしまっていたことに不満を覚えた*6*7*8。いずれにせよ、今後CTFの運営チームによる公式writeupの公開等から出題の意図や想定していた手順がわかることを楽しみにしている。また、次回以降はさらに楽しい大会となることを期待したい。
(2024-06-17追記)公式writeupが公開されていた。「ネット上のどこかにあるのではないか、と考えます」というところまでは納得できるものの、やはりそれ以降のMapillaryにたどり着くまでの道筋で飛躍しているように感じる。問題名のmapperが一種のヒントであるというのも、「情報が見つからず困っていた」というシナリオを考えるとそれは誰がどこから手に入れた、何を意味する情報なのか疑問であるし、いっそ添付ファイル名に含まれる street のように余計な情報を付け足さない問題名とするか、あるいは問題名で示唆するよりも問題文でしっかりと何を意味しているのかを説明してほしかった。今後の難易度調整で改善を図るということだが、mediumやhardといったeasy以外の難易度表示がなされていたとしても納得できなかっただろうと思う。難易度設定以前の問題であり、今後の大会では問題名や問題文等の問題情報におけるシナリオの一貫性であったり、解法の合理性であったりといった点での改善を期待している。(追記終わり)
以下、このCTFで出題された問題のwriteupを書いていく。一部の問題は提出できる回数に制限があったにしても、CTFである以上、フラグを提出することで必ずそれが答えかどうかを確認できるようになっていた。情報に確証がなくともとりあえず提出してみる*9ということを繰り返しており、このように当てずっぽうでやってみるというのはCTFだからこそできることで、本来はそうでないことは強調したい。

- [misc 100] number (176 solves)
- [misc 352] label (62 solves)
- [misc 356] wumpus (61 solves)
- [misc 404] timestamp (50 solves)
- [military 489] satellite (18 solves) / 最後の一手はrand0mさんが決めた
- [geo 184] chiban (90 solves)
- [geo 440] championships (40 solves)
- [geo 479] island (24 solves)
- [crypto 500] Akeome (4 solves)
- [history 184] promoter (90 solves)
- [history 494] paddy (14 solves)
- [history 499] protest (8 solves)
- [transportation 496] container (12 solves)
[misc 100] number (176 solves)
この車両の持ち主に連絡を取りたい。電話番号を調べてもらえないだろうか。 Flag形式: Diver24{0123456789}
注意: 実際に電話を掛けてはならない。
中央に黒い車のある写真が与えられている。駐車場への案内や「赤坂九丁目~」と読める交番から撮影地がわかるだろうが、問題の目的を考えるとあまり重要ではなさそう。車に注目すると、次のようなナンバーだった。「外」から始まっているが外交官ナンバーだろうか。

対応する外国公館を探す。「外交官ナンバー 国別 一覧」というようなクエリで検索すると、非常に便利な一覧表がヒットした。では49から始まるのはどこか。「49 クエート. Kuwait」という記述があった。駐日クウェート国大使館の電話番号が正解であった。
Diver24{03-3455-0361}
[misc 352] label (62 solves)
この荷物の宛先として考えられる施設の郵便番号を教えてほしい。 例えば在日アメリカ大使館が答えの場合、Flagは Diver24{107-8420} となる。
ラベルの一部が破られて宛先が読めなくなっている荷物の写真が与えられる。ラベルの下部には次のようにQRコードやバーコードがある。バーコードは情報量が少なそうだし、そもそも画質の問題で読み取ることが難しそうだ。まず右下にある普通のQRコードを読んだが、これは左下の TRACKING の値だった。

ではもう一方の平べったいQRコードはどうか。まずこれがどのような二次元バーコードか知るべく、「横に長いQRコード」でググるとrMQRコードだとわかる*10。デンソーウェーブが直々に作っているQRコードリーダーアプリであるクルクルであれば、これを読むことができた。含まれていた情報は次の通り。
SHIPMENT ADDRESS: Baba-cho 14-1, Tsuruoka City, Yamagata, Japan
この住所でググると慶應義塾大学鶴岡タウンキャンパスのWebページがヒットする。郵便番号もこのページに書かれていた。
Diver24{997-0035}
[misc 356] wumpus (61 solves)
とあるDiscordサーバにFlagが投稿されたぞ! 本問に限って、ターゲットに接触を試みても大丈夫だ。
Discordでflagというサーバのgeneralチャンネルを閲覧している様子を撮影した写真が与えられる。WebブラウザでDiscordを使っているようだが、次のように写真にはURLバーも写り込んでいる。つまり、サーバのIDとチャンネルのIDも含まれている。

これをもとに 1244302408402735114 で検索してみると、Discord Serversという謎のサービスが見つかった。Join というボタンもあるが、押すとDiscordユーザでこのサービスへログインすることを求められる。

怖いので捨てアカウントを作成して Join ボタンを押すと、無事にこのサーバへ入ることができた。generalチャンネルに投稿されているQRコードを読み込むとフラグが得られた。

Diver24{Discord_1s_m0s7_u5efu1_t001}
このCTFではルールにおいて「問題に登場する個人や組織などへの接触」が禁止されていたけれども、この問題では問題文の通り特別に許可されていた。ではどのようにコンタクトしようか、DMではつまらないと思い、Discordサーバ上でコンタクトすることにした。メッセージの投稿や絵文字の新規付与等は権限が付与されていないようだったが、メッセージを対象にスレッドを作成することはできた。ついでに、招待リンクも作成できたのでほかのメンバーを呼んだ。やったあ。なお、権限はすぐに剥奪された。

[misc 404] timestamp (50 solves)
"53" と塗装されている航空機の写真が撮影された日時を答えよ。
https://twitter.com/jointstaffpa/status/1767515646286549226Flag形式: Diver24{YYYY-MM-DDThh:mm}
例えば2024年4月1日13時45分に撮影された場合、Diver24{2024-04-01T13:45} となる。
防衛省統合幕僚監部のポストへリンクが張られている。Xに上げられている写真には特に撮影日時がわかるような情報はないように思えるし、Xに上げられているということはサービス側でEXIF等は取り除かれているはずだ。
同じ写真が別のメディアで公開されていないだろうか。該当する写真をGoogle Lensで検索すると、プレスリリースのPDFがヒットした。この4ページ目にその画像があるものの、やはり日時の情報はない。
PDFに埋め込まれている画像を抽出してみる。なんと写真右下に撮影日時が埋め込まれていた。これが防衛省サイバーコンテスト*11や!!

Diver24{2024-03-12T15:33}
ここまで、Miscの4問のいずれもfirst bloodを取った。
[military 489] satellite (18 solves) / 最後の一手はrand0mさんが決めた
2023年11月、北朝鮮が偵察衛星を打ち上げた。2024-06-07T05:01:07Z時点で、この衛星から最も近い位置にあった軍用飛行場はどこか。 また、その時点の衛星の高度(単位:キロメートル)はいくつか。
Flag形式: Diver24{基地名_高度}
解答に際しては、 2024-06-06T04:41:45.620Z に発行されたデータを用いよ。
基地名はGoogle MapsやWikipediaで確認できる 現地語表記 で答えよ。また、高度は小数点以下を切り捨てた値を答えよ。 例えば、トルコのインジルリク空軍基地が最も近い位置で、その際の高度が613.65kmであった場合、flagは Diver24{İncirlik Hava Üssü_613} となる。
私が問題を確認した時点で、Satokiさんによって、北朝鮮が2023年11月に打ち上げた偵察衛星は万里鏡1号(Malligyong-1)であることがわかっていた。今回問題で問われているのは、6/7に人工衛星がどの位置にあったかであるということに注意する*12。「衛星トラッカー」のようなクエリでググると、人工衛星の動きをトラッキングしているWebサイトが色々見つかる。今回はSatellite Tracker 3Dを使うことにする。
「2024-06-07T05:01:07Z時点で」どこにいたかを見る必要がある。今回使うアプリでは、ページ下部のUIを操作することで過去のデータを得ることができる。頑張って合わせよう。

時刻を調整して万里鏡1号の位置を確認すると、ちょうどアメリカの真上にいたことがわかる*13。

GoogleマップやOpenStreetMap(military=airfield というようなクエリで検索していた)でこの周辺にある軍用飛行場を探していたところ、rand0mさんが先に見つけて通していた。
Diver24{Goodfellow Air Force Base_506}
[geo 184] chiban (90 solves)
画像の中央に写っている道路の地番は何か。 たとえば住所が 仙台市宮城野区二十人町 303-8 の場合、Flagは Diver24{303-8} となる。 また、地番には数字だけでなく漢字が含まれることもある。その場合は漢字表記のまま解答せよ。
日本の道を写した写真が与えられる。左上にサンディ7号店というスーパーらしき店舗が写っている。「スーパー サンディ "7号店"」というようなクエリで検索してやると、アルバイトの求人情報から茨木市の双葉店であることがわかった。もちろん、ここから撮影地が特定できる。

では、どうやって地番を調べればよいか。「道路 地番 調べ方 茨木市」でググって出てきた茨木市地図情報サイトをまず見てみるも、それっぽい情報がない。もう少し一般的に地番を調べる方法を探すべきだろうと考えて「地番 調べ方 無料」等で検索していたところ、MAPPLE法務局地図ビューアを見つけた。これで撮影地まで移動する。あった。「筆界未定地-6」らしい。

Diver24{筆界未定地-6}
[geo 440] championships (40 solves)
2010年10月、この場所には大会の広告が貼られていた。その大会の優勝者のニックネームを答えよ。
Flag形式: Diver24{優勝者のニックネーム}
台湾っぽい場所の写真が与えられる。私が問題を見た時点で、enscribeさんによって場所が特定されていた。

では、2010年10月にこの場所に貼られていた広告とはなんだろうか。Googleマップのストリートビューで過去の写真を探してみたところ、ここから少し離れた道路の写真はあったものの、ちゃんと広告が見られるようなものはなかなか見つからない。Xだったりニュースだったりを探してみたものの、この時期にここで撮影した写真が見つけられない*14。
別のアプローチを考える。Xで「台湾 チャンピオンシップ until:2010-11-30」と検索してこの時期に開催された大会がないか探したところ、気になるポストが見つかった。「台湾GigabyteのOCチャンピオンシップ」なるものがあるらしい。これをそのまま検索するとオーバークロック大会だとわかる。GigabyteのWebページを探すと2010年大会のプレスリリースが見つかり、優勝者がルーマニアのMatoseさんであるとわかった。
この大会の広告が貼られていたかどうかは知らないけれども、ダメ元で試してみると当たった。
Diver24{Matose}
[geo 479] island (24 solves)
「四方ぎり島」という名前の島における、最高地点の標高を整数(メートル)で答えよ。
Flag例 / Flag example: Diver24{3776}
添付ファイルはない。私が問題を確認した時点で、sahuangさんとpr0xyさんによってこれは南極の島であることがわかった。座標も南極地名委員会報告から 69°43'02" 38°58'23" とわかっていた。ふたりが海外のWebサイト等で確認したデータを試していたものの、通らなかったようだった。では、名前をつけた日本が持っているデータを見てみたいが、極地研や国土地理院から公開されていないだろうか。
「南極 測量」のようなクエリで検索してみると、国土地理院の南極観測についてのページや地理空間情報が公開されているページがヒットした。地理院地図も南極をサポートしているらしいということで、早速探して見つける。しかし、Diver24{13} は通らなかった*15。

元データをあたりたい。地図データ(PDF、TIFF形式)の1:25,000のものを確認していく。見つけた。

Diver24{18}
[crypto 500] Akeome (4 solves)
以下の人物が2017年に始めたyoutubeチャンネルを見つけてください。 Find youtube channels started in 2017 by the following persons.
https://bitcointalk.org/index.php?action=profile;u=44692
Flag例 / Flag example: Diver24{@RickAstleyYT}
CryptoはCryptoでも暗号通貨の方だ。私が問題を確認した時点でsahuangさん、Satokiさん、rand0mさんらによってかなり進捗が出ており、指定されたWebページに記載されているメールアドレスから裁判資料を見つけ、そこから別のメールアドレスを抜き出してGHuntにかける等の試みがなされていた。が、特に成果は得られていなかったようだ。rand0mさんがInternet Archiveからすべてのドキュメントをダウンロードして「YouTube」で検索してみるも、それも成果が得られなかったようだった。
私も調べようと、まずInternet Archiveのページから次のリンクをクリックし、まとめてPDFをダウンロードする。

さて、検索する文字列について、「YouTube」でなく「video」のような遠回しな表現であればどうだろうか。2件が見つかった。
$ grep -rl "video" . ./gov.uscourts.dcd.232431.101.1.pdf ./gov.uscourts.dcd.232431.185.0.pdf
前者にそれっぽいことが書かれている。

これが正解だった*16。
Diver24{@technologyofwinning8592}
この問題は我々がfirst bloodだった。
[history 184] promoter (90 solves)
画像に写っている池沼を開拓した発起人の父親の命日を答えよ。
Flag形式: Diver24{yyyy/MM/dd}
池の写真が与えられる。真ん中あたりに特徴的な建物が写っているけれども、これをGoogle Lensで検索すると入鹿池であるとわかる。

Wikipediaの記事も存在しており、この中に次のように父親の名前や亡くなった年を含む文章もある。
江崎 善左衛門 了也(えさき ぜんざえもん、文禄2年(1593年) - 延宝3年(1675年))は、春日井郡小牧村生まれの浪人。幼名新四郎。父江崎善左衛門宗度(享禄3年(1530年) - 寛永4年(1627年))、寛永元年(1624年)に善左衛門はその跡を継いだ
「"江崎善左衛門" "1627"」で検索してみると、資料が見つかった。「…寛永4年(1627)年11月13日に病没した」という記述があった。
Diver24{1627/11/13}
[history 494] paddy (14 solves)
この地域では地形の人工的な大規模改変が2回行われたという。郡司としてこれにかかわった人物の名は? 日本語表記で答えよ。
Flag形式: Diver24{人名}
地理院地図の一部である画像が与えられている。私が問題を確認した時点で、Satokiさんによって、おそらく国道108号線が画像下部に写っていることを手がかりに、その場所を特定していた。広淵沼干拓地について調べる問題らしく、干拓記念碑に何が書かれているか確認すればよさそうだというところまでわかっていた。
この流れを無視して、それっぽい資料がないか国立国会図書館デジタルコレクションで「広淵沼 郡司」と検索してみた。見つけた。このままではどれを答えればよいかわからないが、試しに山崎平太左衛門を投げてみたところ通ってしまった。

Diver24{山崎平太左衛門}
[history 499] protest (8 solves)
23歳の環境保全運動家の殺害場所となった道路の現在の路線番号は何か。
フラグ形式:Diver24{路線番号}
注意:殺害に関わる直接的な画像が表示される場合があります。
そもそもその環境保全運動家とは誰なのか。「"ecologist" "23" killed」で検索してみると、1979年6月3日、スペインはトゥデラで反核デモへ参加していたところ、治安警備隊によって23歳で殺害されたというGladys del Estal Ferreñoへ捧げるものとして作られた像のページがヒットした。この環境保全運動家を指しているものかはわからないが、ひとまず調査を進めることにした。
名前で検索してみると、まずEJAtlasという、環境紛争の起こった場所を地図にマッピングすることで可視化するサービスのページが見つかる。この場所は「殺害場所となった道路」なのだろうか。引き続き名前での検索を進める。この事件を取り扱った記事中で次のような記述を見つけた。このデモの状況について「…エブロ橋の隣の地面に座り込み…」という記述がある。
En ese momento, como relatan los testigos, la gente comenzó a retirarse hacia los autobuses. "El tráfico estaba atascado y en aquellas circunstancias, algunas personas, entre ellas Gladys, se sentaron en el suelo junto al puente del Ebro, para protestar de manera absolutamente pacífica contra aquel abuso". Fue entonces cuando un grupo de guardias civiles se dirigió hacia los manifestantes.
Googleマップでエブロ橋の場所を確認すると、ここはNA-8703という道路であるとわかる。

Diver24{NA-8703}
この問題は我々がfirst bloodだった。
[transportation 496] container (12 solves)
これらの画像の撮影日と時間帯(午前か午後か)を答えてください。
フラグ形式はDiver24{YYYY-MM-DD-[AP]M}です。たとえば、2024年6月9日午前ならば、Diver24{2024-06-09-AM}となります。
トラックを撮影した2枚の写真が与えられる。いずれもコンテナの番号がしっかり確認できるようになっている。


では、これらコンテナの番号から追跡はできないだろうか。「HLBU tracking」のようなクエリで検索してみると、まず前者のHapag-Lloyd社のコンテナを追跡できるページがヒットする。凡例では HLCU1234567 のような11ケタを入力せよとされているが、写真ではどこからどこまでをコンテナ番号とすればよいのだろうか。「コンテナ番号」でググって出てきたページによると、英字4ケタ+数字6ケタ+四角の枠で囲まれたチェックディジット1ケタということで、無事に HLBU1173129 がそれであるとわかる。ある程度動きはわかった。

もう一方のコンテナについてもAPLのトラッカーで APZU2108462 を入力して、動きを把握する。

一方は4月、もう一方は5月の日付が多く記載されており混乱するが、まあ早い方を見ればよいだろうと適当に考える。とりあえず4/22ということで Diver24{2024-04-22-PM} を試すが失敗。次に午前を試して通った。
Diver24{2024-04-22-AM}
*1:SekaiCTF 2023で出題されたゲームハック問であるAzusawa's Gacha Worldの解説記事は必読だ
*2:FBMDが付いているのは、現在はMetaがMapillaryを提供しているためというオチだった
*3:こちらが比較的正解に近いアプローチだったということになる
*4:金華橋通りや金町(こがねまちと読むらしい)について微妙に詳しくなった
*5:もうMapillaryを知らずに苦しむのはまっぴらりー
*6:問題名でそれとなく誘導をするのは意図が理解できず、(もっとも、作問者は誘導のつもりなくこういう問題名にしたのかもしれないが、問題文も含めて)誘導をするのであればヒントでツールを紹介する程度にはっきり誘導する、誘導しないのであればしないとはっきりしてほしい。途中で追加されたヒントも含めて遠回りだというのが私の感想となる
*7:ほか、easyとするのであれば、たとえばこれら低難易度帯の問題で使える(使わせる)ツールをCTFのルール等の別ページで明示しておくという手もあったのではないか
*8:なお、FBMDもまたrabbit holeとして機能してしまったわけだが、こちらはいわば天然物だし、real-world orientedなOSINT CTFであることを踏まえても現実でもあり得るだろうから不満はない。もし問題文中で偽情報や不必要な情報がわざと混ぜられていたとしても、それも(たとえば依頼者が勘違いのもと付け加えた情報が含まれるというように)シナリオによってはあり得るだろうから、愚痴は言いつつも納得しただろう。それの与える影響がポジティブにせよネガティブにせよ、問題名という本来はまったくもって本質ではない箇所に重要な情報が含まれていた、あるいは(作問者がタイトルを問題を解く鍵にしたつもりがないのであれば)かき乱されたということに納得できていない
*9:極端なブルートフォースはさすがにやっていない
*10:以前ニュースで見たことがあったと思い出した。破損したrMQRコードからのデータの復元をテーマとした問題はCTFでは出てくれるな
*11:「防衛省サイバーセキュリティコンテスト」でなく「防衛省サイバーコンテスト」なのがいつも気になっている
*12:最初問題文をよく読んでおらず、ミサイルの軌道を見てデータがないな~と思うなどしていた
*13:なお、当初問題文の「2024-06-06T04:41:45.620Z に発行されたデータを用いよ」が「2024-06-06T04:41:45.620Z 時点の衛星に関するデータを用いよ」という表現になっており、6/6にどこにいたかを答える問題なのだなと思ってしまっていた。その頃はスリランカやモルディブの近くに衛星がおり、またこのあたりにはちょうどイギリスからアメリカ軍に貸し出されているイギリス領インド洋地域のディエゴ・ガルシア島がある。もちろん軍用の空港もあるということからこれを答えたものの、弾かれ唸っていた。その時点のデータで予測される6/7の位置を答えよということなのだろうと考え直してなんとかなった
*15:実は、ここでチェックが入っている「1:50,000 南極地形図(標高版)」のチェックを外して1:25,000の地形図へ切り替えることでもわかったのだった…
*16:思いっきり「YouTube」と書かれているように見えるけれども、このあたりをコピーして適当なところにペーストしてみると、これは「voutube」であるとわかる。OCRでミスってるっぽい