TsukuCTF2023に参加しました
12月8日某所にて
「明日、一緒にTsukuCTF出ない?」
と訊かれた段階では僕らも混ざるつもりでした。何かしらんけど行き違いで友人らと合流できず……。
というわけで、今回が(実質的には)初のチーム参加で、コンピュータサイエンスの博士であらせられるsyonbori先生とチームを組ませていただきました*1。大感謝です!
チーム名は「誕生日のやつを祝うの会」です。
名前の由来は、僕らの所属する秘密結社「誕生日のやつを祝うの会だったものだったがひざにコロナを受けてしまってな」を略記しました。嘘です。本当はTsukuCTF2023が開催される2日間が誰かの誕生日だからです。
さて、戦績は以下のとおり。
得点は10,973ptsで、順位は17位でした。
このうち、僕の回答分は6,592ポイント、解いた問題はWelcomeとOSINTだけ。web、misc、rev、cryptoは開幕5秒で諦めました。非エンジニアの僕には絶対解けないと即断即決。syonbori先生にweb、misc、rev、cryptを押し付けて、僕はOSINTに専念です。
Welcome問題に答えてから、全問題に目を通す時間。ダウンロードできるファイルはとりあえず全部ダウンロード。「解く解かないは後から考えよう」「とりあえず、脳内バックグラウンド処理に突っ込んでおこう」の精神でした。以下、正解した問題の時系列順に、何を思って何をしたか、ざっくり書いていきます。
1日目
OSINT: airport
画像ファイルを落としたらまずはEXIF。何もなし。次に画像を一目見て、ANAのレシプロ機。運行ルートをこれで絞れるにしても、数が多そうなので他の情報を見ることにした。滑走路上の掲示物「32」と「14」から伊丹空港と分かり、ボンバルディアのレシプロ機が運航していることも確認できた。終了。
OSINT: eruption
画像ファイルを落としたらまずはEXIF、その2。終了。
ファーストブラッドでした!*2
OSIINT: kiZOU
ガラスへの映り込みから、ホテルの名前を発見。像のある場所を特定。
あとは施設名と「寄贈者」などのフレーズで検索して終了。
OSINT: travel_with_tsukushi
一目見てマレーシアの航空会社の飛行機が2機いるので、KLを想起。試して終了。
中略
以降はlaser、tsukushi_no_kuni、perfume、TrainWindow、castle、green_bridge、tsukushi_estate、big_statue、Yukiに正解しました。正解した順番ではありますが、悪く言えば気まぐれに、よく言えばバックグラウンド処理するので、トライはバラバラな順番で行いました。
正解を重ねる一方、不正解も大量に重ねました。free_riderはフラグ末尾の「s」(秒)忘れで不正解。location_for_whatは「Flag{言の葉の庭}」と回答して不正解。grass_courtでは水沢を調べるもののテニスコートの古さを理由に損切りして試行せず不正解。
何というか、ねぇ、そこ、もうちょっと丁寧に仕事しようよ、自分*3。
夕飯を終え、団欒を終え、だんだんと眠くなってくる時間帯。
何となく寝る前の思い出づくりにファーストブラッドを獲得したいと思い、udon_2023やsunsetに取り組んでみる。が、手がかりが得られないか、思いついてもスマートフォンで調べるのが億劫でペンディング。そうこうしているうちに正解者が出たので断念……というのも悔しいので、まだ正解者のいないkoiに取組み始めた。
OSINT: koi
鯉料理の店は全国でもそんなに多くはないだろうと思いつつも、地域を絞らないことには難しいだろうなぁーっと思って、手がかりを考える。
まず、薬味(ネギ、レモン、大葉)による食べ方で絞れないかな?と思ってみたものの、検索キーワードが面倒臭いことになりそうなのでペンディング。
お皿が「〇〇焼」なんじゃないかと思って調べてみると「飛び鉋」という技法で、小鹿田焼と知る。これで地域が絞れたものと思って調べていき、同じ皿を使っている店を見つけるも正解に至らず。仕方ないので付近の鯉料理屋を片っ端からチェック。
そんな矢先、ついに正解者が出現。
もうすぐ日付も変わったし寝るかーっと思ったけれども、フラグが間違っ設定されていたとアナウンス。投稿履歴から正解判定!というわけで暫定15位。
ここでチャレンジ1日目(?)終了。おやすみなさい。
2日目
作戦会議
9時頃、チームメイトであるsyonbori先生と、放置する問題を示し合わせ。
いやまぁ、実際問題振り返ってみると、この時点で「やる」「やらない」って宣言した問題をすべて無視して取り組んでいた。さーせん。ここで追加メンバーyoshinabuさんが合流。
しかし、家のことやら何やらあって12時まで絶賛放置。
OSINT: river
12時、勝利を祈願する肉udon_2023を食べながら片手間で再開。1日目に愛知県と思い込んで調べていたけれども、一旦忘れることにして丁寧にGoogle Lens。不動産情報からあっさり終了。
OSINT: flower_bed
QRコードの周りに書いてある文字列から、fukuokaかshizuokaだろうと判断。海外の方のブログから、福岡県の県営天神中央公園と特定。写り込んでいるQRコードを答えと思って取り組んでみるも不正解。てっきりリダイレクトの問題だと思い、
「リダイレクト前ってなんやねん」
「リダイレクト前って、何も分からん」
と思っていたけれども、ふとチームメイトのyoshinabuさんが「この2つのQR、図柄が違うんじゃない?」と指摘。たしかに見比べてみると異なる図柄。
この指摘をヒントに、この公園内の掲示板でQRコードを探す方針に転換。一致するものを探して発見。QRコードの内容は「http://~」だけど、アクセスすると「https://~」にリダイレクトされるので、そういうことかと納得。
OSINT: sunset
調子に乗ったので、hard問題に挑戦しようと決心。ちょこちょこ浮気していたudon_2023に煮詰まっていたのでsunsetに本腰を入れると決心。
問題文にあるshioさんのTwitterアカウントを見て、まずは内容に「海」を含むツイートを検索。TsukuCTF運営メンバーで話して海に行ったのだろうと判断して、ツイート日+行先の日の入り時刻を調べて回答。不正解。
考えてみると、それくらいだったらmediumくらいかも。あれ?ヤバいんでね?と気づいて、そこから慎重に作業。
というわけで、さらにbioを見てセキュリティ系イベントを検索。新潟に行っていたことを知り、「佐渡島に沈む夕日だ」と気づく。まずは新潟入りするときに前泊しているか調べたものの、そもそも問題文に「イベント後」とあるので夕日が見られるとしたら9/10以降と判断。次にイベント終了後に後泊しているかを調べ、後泊していないと確認して日付を確定。そこで短絡的に当該日の新潟市の日の入り時刻を調べてTsukuCTF23{2023/09/10_18:01}
と回答。不正解。
佐渡島に沈む夕日であるなら、佐渡島の陸の分だけ日の入り時刻からズレる。18:01日の入りで、撮影時刻を答えろだからその数分前か。そこを読まないといけないと反省。
ひとまず、撮影場所を再度確認し、日和山浜海水浴場は間違いなさそうだと確認。
次に入れるフラグはTsukuCTF23{2023/09/10_17:59}かな、外れたらチームメンバーで絨毯爆撃しよう、と思った*4。
しかし、ここまで来たから自分の手で正解したい気がしてきて、佐渡島に沈む夕日について報告しているブログを調べる。佐渡島に沈む夕日を、細かい撮影時刻も添えて書いているブログを発見。2013年6月23日日曜日 (JST)の新潟市の日の入り19:10、そのブログでは「19:04頃」というコメントとともにこれで太陽の下が佐渡に掛かっている状態の写真、「19:07頃」というコメントともに太陽がすっぽりと日の入りするところの写真が掲載されていた。
水平線に沈むまで3分、佐渡島に隠れる。sunset.jpgは、佐渡島に掛かっているように見える。日の入りから「-6分」する必要があると判断。
日の入りである
TsukuCTF23{2023/09/10_18:01}
から6分遡って
TsukuCTF23{2023/09/10_17:55}
=前後1分許容されるから 17:54~17:56撮影として回答。正解。
脳汁ドバドバ感。
そして燃え尽きる。
OSINT: broken display
左奥の陸橋から2階以上、日能研と山が近くにあり、ディスプレイへの映り込みからロクシタンがある施設と判断。結構数があるので放置していた。
1日目に長崎県、鹿児島県と踏んで調べたけれども得るものなく、岡山県、広島県を調べても手がかりなし。ふと、広島県の「宮島」から、ディスプレイの表示が「〇〇宮」だと気づき、〇〇宮で捜索。終了。
OSINT: fiction
Google lensでヴァロラントのステージsunsetと知ったので、とりあえずsunsetのステージ紹介トレーラーを見る。するとステージ名と一緒に「北緯」「西経」っぽい表示があるのに気づく。ググると他のヴァロラントステージもこれが緯度経度っぽい。
(ここで緯度経度を見ると、モチーフになったロサンゼルスだと分かる。ロサンゼルスのストリートビューを眺めて心が折れる。難易度がeasyだと思い出して方針転換)
北緯西経でググると、海外のヴァロラントファンサイトが北緯西経を細かい数字で書いている。これを緯度経度に計算し直すとフラグになった。
家族の晩ご飯を用意しなければならないため、終了まで残り15分で離脱。お疲れ様でした。
解けなかった問題の振り返り
以下、それなりに取り組んだけれども正解に至れなかった問題の振り返りをします。
OSINT: hunter
Gmailの送信アドレス欄に全部突っ込んだら存在確認してくれるんじゃね?→してくれない。
メールアドレスの存在確認サイトでワイルドカードが使えない?→使えない。
運試ししたろ!(10回)→→→→→→→→→→→→諦めた。
twin
ChatGPT先生に相談。
「これ、なんてサイトですか?」
「';--have i been pwned?ですね」
「わーい、ありがとう!!……本当か!?」
ChatGPT先生に相談、その2。
「これ、なんてサイトですか?」
「Instagramですね」
「わーい、ありがとう!!……嘘じゃん!?」
諦めた。
OSINT: udon_2023
見た目から讃岐うどん系だと判断。うどんの形状、ネギ・ショウガ・天かすがセルフである様子から、香川県かな?と思って、香川県の有名店・隠れた名店を調べていく。丼が一致する店を見つけた瞬間に勝利を確信。しかし、外れ。
五大うどんをざっくり調査。やっぱり見た目から讃岐うどん系だと確信してそれ以上は調べず。讃岐うどん系で三大都市圏の店を調べる方針に転換。同じ丼を使っている店が多数あることが分かり絶望。
まずはTsukuCTF運営スタッフのいそうな三大都市圏の店を調べる。膨大な店舗数で、同じような盛り付け、同じ丼っぽい画像、ネギ・ショウガ・天かすセルフ店はすぐに見当たらず。この路線ではないと判断*5。
写真を眺めて「鶏天っていうか、これ、唐揚げではないか?」と思って「唐揚げうどん」で捜索。何も得られず。かなり粘ったけれども最終的に諦めた。
感想
人生初参加のCTFは今年3月のpicoCTF 2023 Competition、その頃まだハリネズミ本も迷路本も読んでなかったんですよね。で、実はまだ読み終えてないんですが、臆することなくTsukuCTFに出場しました。防衛省CTFでボコボコにされたことを全く反省していません。
結果、OSINT以外は解けませんでしたが、OSINTは結構解けたんじゃないかと思います。そう思う一方、適切な情報源に至っていたにもかかわらず、不注意から正解まで持ち込めなかった問題も多々あり、深く反省しています。おそらく治らない・治せないので、何か補助ツールを入れます。
以上、反省したことを忘れないよう、初めてWriteupを書きました。Writeupっていうか、解法を書かずに中略を挟んでいるので実質的に参加記か。
ちなみに、本当に誕生日でした。家族からはあまり祝ってもらえませんでしたが、CTFを楽しんだ思い出深い誕生日になったと思います。
という文字列を TsukuCTF2023に参加した - しょんぼり技術メモ からコピペしてきました。冗談みたいにコピペしてますけれども、僕も本当に誕生日でした。
誕生日、おめでとうございました。
矢立ての初め
mmr346名義でブログを始めた。
「mmr346」と私の本名と紐づけられる人もいるので、開設していなかったのか。
何か、こう、思いついたので勢いで。