SWIMMER OSINT CTF 2026に、チームfull_weak_engineerで参加しました。そのwrite-up記事です。
DIVER OSINT CTF 2025の時と同様に、今回も脆弱エンジニアの方々と一緒に参加させていただきました!
- コンテスト概要
- 結果
- 問題の出題構成
- チームとして解けた問題
- [tgt_rain, easy] rain_01_social (554 team solves, 100 points)
- [tgt_rain, medium] rain_02_region (154 team solves, 316 points)
- [tgt_rain, medium] rain_03_source1 (177 team solves, 256 points)
- [tgt_rain, easy] rain_04_source2 (414 team solves, 100 points)
- [tgt_debeyohiru, medium] debeyohiru_04_meal (198 team solves, 194 points)
- [ops_swimmer, hard] ops_swimmer (75 team solves, 457 points)
- 感想
コンテスト概要
2026/01/17(土) 12:10 +09:00 - 01/18(日) 00:10 +09:00の12時間開催でした。他ルールはRulesページに、日本語と英語の二言語で詳細に記述されていました。その中の最初の部分を引用します:
概要・ルール - 開催時間は 2026/01/17 (土) 12:10 (JST) - 01/18 (日) 0:10 (JST)(12 時間)です。 - 日本時間では、深夜ではなく昼のスタートです。ご注意ください。 - 1 チームあたり 6 名まで 参加可能です。 - オンライン上で開催されます。 - ルールに同意し、ブリーフィング(チュートリアル)を終えるとすべての問題が表示されます。 - 解答順序は自由です。ただし、問題によっては別の問題で得た情報を使用するものもあります。 - 各問題の点数は、参加者全体の正答数によって変動するものがあります。 - 原則として、すべて無償のツールや Web サイトから得られる情報で解答可能 です。ただし、有償のツールの使用を禁止するものではありません。 - CTF 競技中のすべての連絡は Discord で実施されます。 必ず Discord サーバに参加してください。 チームと連絡が取れない場合、スコアが無効になることがあります。 - ルールや禁止事項への違反行為が確認された場合、該当するプレイヤーやチームは失格(BAN)や減点などの処分を受けます。 - CTF サーバ (CTFd) へのユーザ登録を以て、すべてのルールおよび規約に同意したものと見なします。
また事前に、本コンテストSWIMMER OSINT CTFの位置付けが全体的に入門者向けであることが告知されていました:
DIVER OSINT CTFとSWIMMER OSINT CTFの比較です。
— DIVER OSINT CTF (@DIVER_OSINT_CTF) 2025年10月18日
Here is a comparison of DIVER OSINT CTF and SWIMMER OSINT CTF.#SWIMMER_OSINT_CTF pic.twitter.com/0XImvnB5VP
その関係もあってか、About Flagページでフラグの提出方法が説明されていたり、フラグ提出時にフラグフォーマットに沿っているかが最初に検証されたりと、懇切丁寧な運営でした:
今回からフラグフォーマットが間違っていたら提出回数制限を消費せずにエラーになるようにしました!https://t.co/9MluLFNxJI#SWIMMER_OSINT_CTF pic.twitter.com/10whTtfy0B
— りゅうせい (@ryusei_ishika) 2026年1月17日
加えて、ヒントが全体共有されることも案内されていました:
"未来"から#hints が3回共有されるようです。 #hints will be shared from "the future" three times - 1:00 pm JST / 4:00 am UTC - 5:00 pm JST / 8:00 am UTC - 10:00 pm JST / 1:00 pm UTC
結果
正の得点を得ている687チーム中、全問正解できて9位でした!


コンテスト終了後に発行できるCertificateです:

問題の出題構成
本コンテストの特筆すべき点だと思うので、問題の出題順序を説明します。本コンテストの問題の出現順は次のようになっていました。この情報は事前告知はなしで、本番中に分かる内容のはずです。
- コンテスト開始直後は
briefingジャンルの00_agreement問題のみが出現している状況です。 00_agreement問題に正解すると01_flag_format問題が出現します。以降同様に、briefingジャンルの問題を1問正解するごとに、次の問題が出現します。07_research_order問題に正解すると、tgt_rainジャンル、tgt_debeyohiruジャンル、tgt_lilicaジャンル、research_2025ジャンルの全問題が出現します。- おそらく、他ジャンルの問題をすべて正解すると、最後の
ops_swimmerジャンルの問題が出現します。
briefingジャンルの内容は、【協力者】として調査するにあたって認識すべき点を、問題形式で出題するものでした。今回のコンテスト設定では、一切の行為を行わず観察に徹することや調査をしていることに感づかれてはならないため、特に指示されない限りは、あらゆる連絡を一切行わないことの明言や、AIを使用しても構わない。ただし、出力された情報は提出前に自分で精査するといった心構えを説明しており、懇切丁寧な内容でした。
briefingジャンル最後の07_research_order問題で、調査すべき3名の情報や2025~2026年ごろにおける実社会の状況を調査する指示や、改めてのブリーフィング内容の再確認がありました。
チームとして解けた問題
本コンテストでは、日本語と英語の両方で問題文が提供されていました。本記事では日本語版の問題文のみを引用します。また、問題一覧では点数順に並んでいますが、本記事では番号順に記述します。
briefing後、私は最初にtgt_rainジャンルに取り組み、その後はチーム未正解の問題を確認していきました。
[tgt_rain, easy] rain_01_social (554 team solves, 100 points)
rain は2026年時点でXのアカウントを所持していたようです。
我々は、この人物の投稿のスクリーンショットを入手しました。
スクリーンショットからアカウントを特定し、このアカウントのID(スクリーンネーム)を解答してください。
例えば、@gov_online が対象のアカウントの場合、Flag は SWIMMER{@gov_online} となります。
配布ファイルとして、次の画像がありました:

まずは発言内容"これわりと近所だったから見に行ったな"で検索してみましたが、どうにもヒットしませんでした:

文章では検索できないのか、またはTwitterサービス全体として不安定なタイミングだったのでその影響だったのかは分かりません。
次は、引用元の書き込みを探しました。引用元書き込みが先月と日が浅いこともあり、引用元アカウントの発言を上から辿れば発見できました。ポストのエンゲージメントを表示すると、引用一覧の一番上に対象のアカウントを発見できました: https://x.com/bruto_rain/status/1995806649903448141

SWIMMER{@bruto_rain}を提出してみると正解でした。
[tgt_rain, medium] rain_02_region (154 team solves, 316 points)
medium rain は自身のブログに趣味の投稿を行っていたようです。 投稿に用いられている写真のほとんどがこの人物の撮影したものではないフェイクのようですが、1枚だけ、実際にこの人物が撮影したと考えられる写真が存在します。 その写真を特定し、撮影地を地図上で解答してください。
https://x.com/bruto_rain のプロフィールに https://brutorain.wordpress.com が記載されていました。そのサイトでは次の記事がありました:

なお、サイト中の各種画像には この画像は OSINT CTF (競技) のために用意されたものです などの注意書きが添えられていました。
最初のうちは「電車の画像は借り物の可能性が高そうなので、最近の記事が怪しい?」「"真実"系の2つの記事の写真は古めかしいので、高校生撮影とは思えない」「最新の記事が日常を記録するのも大事だ。新しいカメラの練習も兼ねて。なのでその画像?」と思っていました。そのため最新の記事にある東京駅の座標を提出しましたがIncorrectになりました。
念のため wget -r -w 1 https://brutorain.wordpress.com/ でサイト内容をクローリングして各種画像のメタ情報に位置座標があるか調べましたが、全然なさそうでした。
30分ほど悩んでも全然分からなかったので、この問題をいったん飛ばして他の問題を見ることにしました。すると、"真実"系の記事2つは偽記事で、東京駅の画像はAIで作成された画像とありました!そのため、本問題で探すべき範囲は、投稿記事最初の6個の電車系統の記事のようです。
各種記事の電車画像をよく見ると、文字の字形がおかしい画像があることに気付きました:

生成AI製の画像に思いました。これが問題文で言うフェイクのようでした。生成AI製らしいかどうか、各種記事の電車画像を確認しました。手元メモです:
- フェイクでは無さそうなやつ
- keihan-2 (看板含めて文字が鮮明。ただ電光掲示板が壊れてる?)
- yokosuka (intercityやPrince Hotel含めて文字が鮮明。ただ手前の赤い列車はパンタグラフに電線が通っていない?)
- 判断材料分からず
- tokai-2
- フェイクっぽいやつ(文字が潰れているなど)
- hankyu-1 (文字潰れ)
- hiroshima-1 (電車前方行先表示の文字潰れ)
- hokkaido (雪で埋もれすぎ && もしもこれなら特定不可能)
- kansai (電車前方に行先表示が無い。乗客がいるし、通常あるはず)
- kyushu (電車左側の文字潰れ)
- kyushu2 (列車前の数字潰れ)
- oimachi (看板等の文字潰れ)
- okayama (文字潰れ)
- sannnomiya-1 (文字潰れ)
- setouchi (奥の橋の橋桁(?)が一部消えている)
- sotobo (文字潰れ)
- suigun (電車全面JRロゴ下の文字列が、Rではなさそう。かつJRの後に4文字以上ありそうで、それは非実在そう)
- tobu_line (駅名の英語表示の文字潰れ)
- tohoku-1 (小牛田下の「宮城?駅」などの文字潰れ)
本問題に取り組んでいるうちに13時を過ぎ、運営から1回目のヒントが提示されました。その中に本問題のヒントも含まれていました:
rainは関東周辺に住んでいると自称していますが、これは事実ではないようです。 「遠征」と称して投稿している写真に、彼が実際に撮影したものが含まれているかもしれません。
yokosukaは関東周辺であるため、ヒントによるとフェイクらしいです。そのためkeihan-2側の写真が実際に撮影された写真と考えました:

電車に表示されている文字列等を使って京阪 ワンマン 路線 牧方市でGoogle検索すると、京阪交野線 - Wikipediaが見つかりました。Wikipedia記事中のワンマン運転時での「枚方市↑↓私市」表記が写真に当てはまるように見えるため、京阪交野線のどこかの駅と考えました。全8駅なので個別に調べてきました。
星ヶ丘駅を調べると【鉄道駅探訪】「星ヶ丘駅」(京阪電気鉄道・交野線) : 人生ゆるゆる途中下車サイトを見つけました。ホームの屋根の模様や、言語化が難しいのですがホームの雰囲気が写真と似ているように感じたので、提出してみることにしました。
Google Mapsで星ヶ丘駅の座標を調べて、本コンテストサイトの提出画面で駅の大部分をカバーできる真ん中の座標(34.80746648879391, 135.66007940066783)で提出すると正解でした:

[tgt_rain, medium] rain_03_source1 (177 team solves, 256 points)
rain は、目を引くタイトルの記事を書くことで閲覧数が多くなると考えたようです。
この人物はこれをきっかけとして偽情報の作成・流布にのめり込んでしまったと考えられます。
この人物が一番最初に投稿した偽記事では、ある画像に全く関係ないキャプションが付けられています。 本来の出典を探し、この画像がどこの市区町村にまつわる資料に掲載されたものか解答してください。
都道府県名を含む必要はありません。
例えば、平塚市 の資料に掲載されていた場合、Flagは SWIMMER{平塚市} となります。
一番最初の偽記事は気付いてしまった!! – bruto_rainのブログのようでした。当該記事には次の画像がありました:

工事中ノ濾過池(其一)が右から左に書かれていることから、古い写真のようでした。最初は濾過池を固有名詞と思いましたが、どうやら浄水場に関係する一般用語のようでした。
工事中ノ濾過池(其一)でGoogle検索してもヒットなしでした。画像検索するとトップ - 東京都水道歴史館デジタルアーカイブシステムのサイトが見つかったので色々調べましたが、問題の写真らしいものは無さそうでした。
詰まったので上記内容をチームへ共有すると、他の方が解いてくださいました!豊橋市水道誌 - Minna de Honkoku V3に工事中の濾過池(其一)として掲載されていたとのことです!たしかにその表記でGoogle検索するとヒットしました!
旧仮名遣い(?)から現代仮名遣いにするなら、工事中のろ過池(その1)になりそうと思っていたことが敗因でした。表記ゆれは難しいです……。
[tgt_rain, easy] rain_04_source2 (414 team solves, 100 points)
rain が2番目に作成した偽記事には、「rainが未公開の情報を見つけた」ということが書かれているようです。しかし、これは虚偽だと思われます。
この人物の嘘を暴くには、正確な出典を探す必要があります。
この画像の出典となる古い書籍は電子化されており、詳細が参照できるはずです。
その資料のデジタルオブジェクト識別子(DOI)を解答してください。
例えば、答えが 12.34567/890123 の場合、Flagは SWIMMER{12.34567/890123} となります。
2番目の偽記事は誰も知らない真実を発見 – bruto_rainのブログのようでした。当該記事には次の画像がありました:

Googleで画像検索すると第2章 本議事堂の完成|本の万華鏡 第28回 国会議事堂ができるまで|国立国会図書館が見つかりました。どうやら問題画像は一等 正面及背面圖 渡邊福三氏案のようです。
国関連の文脈というわけで、国が電子化していそうと考えました。URLを削って国立国会図書館にアクセスして正面及背面圖で検索すると議院建築意匠設計競技図集 - 国立国会図書館デジタルコレクションがヒットしました。しかしそのページでは資料内容を閲覧できないようでした。
Googleで"議院建築意匠設計競技図集"検索すると、別のページの議院建築意匠設計競技図集 | NDLサーチ | 国立国会図書館や議院建築意匠設計競技図集 - 国立国会図書館デジタルコレクションがヒットしました。こちらはサイト上で資料内容を閲覧できて、コマ番号7のページに問題画像がありました。これで出典がわかりました。
あとは、デジタルオブジェクト識別子(DOI)がどのように決まるかを調べると、国立国会図書館におけるDOI付与 | 国立国会図書館のページが見つかりました。ページの流し読みでは国立国会図書館で付与するDOIは、国立国会図書館のプレフィックス‘10.11501’に、国立国会図書館が独自にデジタル資料に付与している永続的識別子をサフィックスとして組み合わせた形です記述だけが見つかり、永続的識別子の参照方法が未記載に見えていました。しかしよく読むと、画像中に国立国会図書館デジタルコレクションの永続的識別子から "info:ndljp/pid/" を除いたものの記述が見つかりました。今回の出典資料のURLはhttps://dl.ndl.go.jp/pid/967480であるため、DOIは10.11501/967480になりそうでした。試しにhttps://doi.org/10.11501/967480へアクセスすると今回の文献へ自動リダイレクトされるため、正しいことを確認できました。
SWIMMER{10.11501/967480}を提出してみると正解でした。
[tgt_debeyohiru, medium] debeyohiru_04_meal (198 team solves, 194 points)
debeyohiru はある料理が好物で、よく食べているようです。 直近では2026年1月10日の夕食にその料理を食べたことが確認されています。 この人物がこの日の夕食に食べたメニューを特定し、店舗のメニューに記載された名前で解答してください。
例えば、マクドナルドでビッグマックを食べたことが特定できた場合、Flagは SWIMMER{ビッグマック} になります。 メニュー名の表記は店舗のメニューの 日本語 表記に準拠してください。
debeyohiruアカウントは、他の問題で他の方が特定済みでした。アカウントが次の投稿をしていました:
早めの夕食
— Debeyohiru (@debeyohiru.bsky.social) 2025-12-28T08:04:43.072Z
今宵も来たぞ。今日は単品でいいや
— Debeyohiru (@debeyohiru.bsky.social) 2026-01-10T11:11:01.712Z
写真の投稿のうち、今宵も来たぞ。今日は単品でいいや書き込みが2026年1月10日の投稿です。早めの夕食書き込み側の2025年12月28日の画像は、ポムの樹の特製デミソースのダブルチーズオムライスであることをチームの方が特定済みでした。しかしSWIMMER{特製デミソースのダブルチーズオムライス}側ではincorrectになったとのことで、2026年1月10日側は別の料理を食べたようでした。
「特定できるとしたら、別のどこかに情報があるはず」と考えて、まずは2025年12月28日の画像で画像検索して、レビュー等しているかを調べました。しかし投稿画像と同一の画像は全然見当たりませんでした。
別の問題で当該人物のプロフィールページ https://furaigo5.github.io/profile/ を発見しており、そこには渋谷を拠点に活動しているとありました。渋谷にあるポムの樹の店舗は渋谷スペイン坂店のようでした。Google Mapsで当該店舗にコメント等している可能性を考えて調べてみると、見つかりました! https://maps.app.goo.gl/mJaJJGCw6A7kcu3k7

この情報をチームへ共有すると、ものの2分でメニューを特定して正解いただきました!SWIMMER{豚肉とリンゴのホタテトマトクリームオムライス}だったようです。
[ops_swimmer, hard] ops_swimmer (75 team solves, 457 points)
2025年のある日、rain, debeyohiru, lilica が初めて3人で集まったようです。 この日以降、この集団は活動を徐々に活発化させました。
それはいつ・どこだったのでしょうか?
以下の情報を教えてください。
- 日付(YYYY/MM/DD 形式)
- 集合時刻(HHmm 形式。日本時間で24時間表記)
- 場所(チェーン店名と店舗名)
例えば、2025年の10月1日の20時00分(日本時間)に、マクドナルド 新宿西口店で集合している場合、 Flagは SWIMMER{2025/10/01_2000_マクドナルド新宿西口店} となります。
店舗名は 公式サイト の日本語表記に準拠します。ただし、スペース ( ) が含まれている場合、それを省いてください。
チームの方から、次の情報が怪しいとの共有がありました:
- Ghuntで見つけた
debeyohiruのカレンダー情報から、日付は2025/12/30、集合時刻は1830らしいこと rainの品川区や大井町駅の写真 https://x.com/bruto_rain/status/2005982246499742052 , https://x.com/bruto_rain/status/2006604801514057878lilicaの、友だちにあったときの写真 https://x.com/twilight_lilica/status/2007451888996724926
残りは集合場所の店舗名が必要です。ここでlilicaの写真をよく見ると、コップにDenny'sロゴがあることに気付きました:

Googleで大井町 デニーズを検索すると、デニーズ 大井町駅前店 | 店舗情報 | デニーズが見つかりました。
これらの情報を合わせて、SWIMMER{2025/12/30_1830_デニーズ大井町駅前店}で正解でした!
感想
- 面白かったです!また、各種導入が本当に丁寧で、まさに入門者に向いていると思います!
- そして今回もチームの皆様の凄さを思い知りました!また、自分一人では全然分からなかったり見落としたりしても、チームではカバーしあえるのがやはり良いものです!
- 本記事で記述している問題では、
rain_03_source1問題がまさに該当します。Google検索ではひらがなカタカナは区別されるんですね……! - 本記事では記載していませんが写真から撮影日を特定する問題では、遠く不鮮明なロゴ画像が重要でした。ロゴ部分を切り取って画像検索しても全然見つからなかったので私は諦めてしまいましたが、他の方にロゴを特定して正解いただきました!
- 同じく本記事では記載していませんが画像のメタ情報を使う問題では、Wordpressからの直接ダウンロードやwgetでのダウンロードでは加工済みの画像のみを入手できて、EXIF情報付きの元画像を入手できないようでした。他の方はうまく元画像を入手して、メタ情報から正解いただきました!
- 本記事で記述している問題では、
- 生成AIによる画像が、ぱっと見だと真正に見えてしまいます……。
rain_02_region問題では字形の正確さや鮮明さで生成AIらしいかを現在では判別できました。ただ今後の技術発展で文字も正確に描画されると、なおのこと見分けることが難しくなりそうです。 - 17時頃という夕食前の時間帯に
debeyohiru_04_meal問題に取り組んでいました。おいしそうなオムライス画像を大量に見ていると、お腹が空きました!