プログラム系統備忘録ブログ

記事中のコードは自己責任の下でご自由にどうぞ。

TsukuCTF 2023 write-up

TsukuCTF 2023へ、一人チームrotationで参加しました。そのwrite-up記事です。

2023/12/20(水) 21時頃追記: Writeup賞をいただけたことを加筆しました。

2023/12/25(月) 22時頃追記: 運営の皆様による全問題解説がTsukuCTF2023 Writeupsで公開されています。

コンテスト概要

2023/12/09(土) 12:20 +09:00 - 2023/12/10(日) 18:00 +09:00 の29時間40分開催でした、珍しい期間です!他ルールはRulesページから引用します:

TsukuCTF 2023 について
  TsukuCTF 2023 はオンラインにて開催されます (競技 URL: https://tsukuctf.sechack365.com/ )。
  開催期間は 2023/12/09 12:20(JST) ~ 2023/12/10 18:00(JST) の 29h40m です。
  ジャンルは OSINT, Misc などを予定しています。
  運営からの連絡は CTFd の Notifications 機能および以下のサービスにて通知を行います。
    公式 Discord (URL: https://discord.gg/yyEk4SYsVM )
    公式 X(Twitter) (URL: https://twitter.com/tsukuctf )
  運営への質問等は公式 Discord の ❓-ask-for-admin チャンネルでチケットを作成してください。Discord が利用できない場合は、Twitter のダイレクトメッセージをご利用ください。ただし、問題の解法に関する質問などにはお答えいたしません。
  チームで参加する場合はアカウントを共有するのではなく、Team 機能をご利用ください。
  チーム上限は 98 人とし、猫や犬などはチームメンバーに含むものとします。
  フラグは何度でも入力することができます。ただし一部の問題には回数制限が設けられており、その場合は問題文にその旨が記載されています。
  誤ったフラグを入力することによる減点はありません。
  問題の点数は解かれた人数に応じて減少します(一部を除く)。
  問題サーバへ大量アクセスすることでフラグを入手できる問題はありません(一部を除く)。必要である場合は問題文にその旨が記載されています。
  有償のツールや環境でしか解くことができない問題はありません。
  CTF の開催期間終了後の WriteUp の公開を推奨しています。
  TsukuCTF は国立研究開発法人情報通信研究機構が実施する、若手セキュリティイノベーター育成プログラム SecHack365 の修了生イベントに際して開催されています。

フラグ形式
  フラグは全て TsukuCTF23{} という形式をとります。例えば答えとなる文字列が THIS_IS_FLAG の場合、フラグは TsukuCTF23{THIS_IS_FLAG} となります。
  フラグに使用可能な文字種は数字、アルファベット、記号、ひらがな、カタカナ、漢字などとします。表示不可能な文字は基本的に含まれません。具体的な文字に関しての質問がある場合は、公式 Discord の ❓-ask-for-admin チャンネルよりご連絡ください。
  座標を特定する問題におけるフラグ形式は問題文に記載のある通り、 TsukuCTF23{緯度_経度} です。ただし、緯度および経度は十進法で小数点以下五桁目を切り捨てたものとします。例えば、日本中央標準時子午線最北端の塔の座標は緯度 35.693098 、経度 135.003078 付近なので、フラグは TsukuCTF23{35.6930_135.0030} となります。また、数メートル程度の誤差が許容されています。なお、一部の問題では違なる形式で出題されることがあります。
  フラグにおける固有名詞は各公式サイト、座標は Google マップを参考に正答を作成しています。他の場所から情報を取得する場合はご注意ください。
  複数のフラグが答えとして設定されている場合があります。
  昨年度開催された TsukuCTF 2021 のフラグ形式は TsukuCTF{} 、TsukuCTF 2022 のフラグ形式は TsukuCTF22{} でしたのでお間違えの無いようご注意ください。

賞品
  競技終了後に以下に記載するタイトルでの賞品の贈呈が予定されています。
    CTF つよつよで賞
    WriteUp 賞
  対象は日本国内で賞品を受け取れる参加者に限ります。
  これら賞品の獲得条件は予告なしで変更される可能性があります。

CTF つよつよで賞
  終順位が 1 位から 5 位までのチームにささやかな賞品を贈呈します。
  技終了後 24h 以内に連絡がない場合は、繰り上げでの賞品贈呈を行います。繰り上げが発生した場合は、前述した公式 Discord および公式 Twitter において通知を行います。また、賞品の辞退が発生した場合も同様とします。
  数人からなるチームにおいては、代表者 1 名に発送致します(ただし賞品の内容は人数によって変動する場合があります)。

WriteUp 賞
  競技終了後 48h 以内にハッシュタグ #TsukuCTF をつけてツイートされた WriteUp の中で、運営の評価が高かった 3 名程度にささやかな賞品を贈呈します。ツイートされたアカウントに運営が公式 Twitter よりダイレクトメッセージでの連絡を行うため、許可設定をお願いいたします。
  連絡後 24h 以内にお返事がいただけない場合やダイレクトメッセージが許可されていない場合、可能な限り運営より連絡を試みますが、受賞が取り消される場合があります。また、賞品の辞退が発生した場合の繰り上げはありません。
  扱う問題数、記述媒体、著者の属性などに対する運営による評価の差異はありません。例えば正答数が 1 問である WriteUp でも受賞対象となります。
  複数人で記述された WriteUp においては、代表者 1 名に発送致します。
  クリティカルな非想定解やユニークな解法をお待ちしています。

禁止事項
  スコアサーバなど許可されていないサーバへの攻撃およびそれに準ずる行為
  問題サーバへの過度な負荷を与える行為
  1 人が複数のアカウントを作成する行為
  他ユーザへの嫌がらせ行為や競技を妨害する行為
  本 CTF の開催期間中にフラグまたはフラグ獲得に関連する情報を公開する行為
  その他、本 CTF の運営を妨げる行為

(この下に英語版表記もありますが省略します)

CTF の開催期間終了後の WriteUp の公開を推奨がありがたいです。私も意気揚々と本記事を書いています。また、write-upを執筆および公開される方々が、他のCTFよりも大勢いる気もします。

結果

正の得点を得ている342チーム中、4486 pointsで77位でした。

順位と得点

緑背景: 解けた問題

環境

OSINT問題が多いコンテストだったので、Google Chromeの画像検索機能が大活躍しました。一部、WindowsのWSL2(Ubuntu 22.04)なども使いました。

Windows

c:\>ver

Microsoft Windows [Version 10.0.19045.3758]

c:\>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         2
  kali-linux             Stopped         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2

c:\>

他ソフト

  • Google Chrome Version 120.0.6099.71 (Official Build) (64-bit)
  • Wireshark Version 4.2.0 (v4.2.0-0-g54eedfc63953).
  • IDA Version 8.3.230608 Windows x64 (64-bit address size) (なお、Free版IDA version 8.2からはx86バイナリもクラウドベースの逆コンパイルができます。version 7頃から引き続き、x64バイナリも同様に逆コンパイルができます。)

WSL2(Ubuntu 22.04)

$ cat /proc/version
Linux version 5.15.133.1-microsoft-standard-WSL2 (root@1c602f52c2e4) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37) #1 SMP Thu Oct 5 21:02:42 UTC 2023
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ python3 --version
Python 3.10.12
$ g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ make --version
GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$

解けた問題

本CTFでは、問題説明文が日本語と英語で提供されました。本ブログでは日本語版の問題文を掲載します。

最終的な問題一覧ではOSINTジャンルは途中に記載されていますが、問題数が多いので本記事ではOSINTジャンルを最後にまとめて記述します。また、正解チーム数が多い問題から順に記載します。そのため100点問題について、問題一覧の並び順とは異なる順序になっています。

[tsukushi] welcome (290 team solved, 100 points)

Please join our Discord!

コンテスト開始直後に、Discordに以下の書き込みがありました:

shio — Today at 12:20 PM
@everyone

TsukuCTF 2023が開始しました!
2023/12/10 18:00 (JST) に終了します!
皆さん、楽しんでください!

TsukuCTF 2023 has started!
Ends on 2023/12/10 18:00 (JST)!
Have a good hack, everyone!

https://tsukuctf.sechack365.com/
TsukuCTF23{TsukuCTF_is_back_again_in_2023!}

フラグを入手できました: TsukuCTF23{TsukuCTF_is_back_again_in_2023!}

[web, easy] basic (274 team solved, 100 points)

保護されていない通信ではパスワードはまる見えダゾ!
e.g. パスワードが Passw0rd! の場合、フラグは TsukuCTF23{Passw0rd!} となります。"

配布ファイルとして、basic.pcapがありました。問題文等からBasic認証を送信していそうだと想像しました。Wiresharkでbasic.pcapを開いてhttpでフィルタリングすると、5個の通信がヒットしました。

  • 1番目の通信はリクエスト
  • 2番目の通信は対応するレスポンス、ただし401 Unauthorizedなので認証情報が誤っていそう
  • 3番目の通信は改めてリクエスト
  • 4番目の通信は対応するレスポンス、ここで200 OKなので、3番目の通信のリクエストの認証情報は正しそう
  • 5番目の通信はファビコン取得用

3番目の通信のリクエストにあるAuthorizarionヘッダー内容から、認証情報がadmin:2929b0u4と分かりました:

WiresharkはBasic認証内容をデコードしてくれます

Basic認証はユーザー名とパスワードをコロン:でつなぐものなので、パスワードは2929b0u4と分かります。あとは問題文に記載されているフラグ形式で提出すると正解できました: TsukuCTF23{2929b0u4}

[misc, easy] what_os (174 team solved, 201 points)

とある研究所から、昔にシェル操作を行った紙が送られてきた来たんだが、 なんのOSでシェルを操作しているか気になってな。 バージョンの情報などは必要ないから、OSの名前だけを教えてくれないか?

にしても、データとかではなく紙で送られて来たんだ。一体何年前のOSなんだ。。。

送られてきた紙をダウンロードして確認してほしい。

配布ファイルとして、tty.txtがありました:

$ file tty.txt
tty.txt: ASCII text
$ cat tty.txt
login: root
root
# ls -al
total    8
 41 sdrwr-  7 root     70 Jan  1 00:00:00 .
 41 sdrwr-  7 root     70 Jan  1 00:00:00 ..
 43 sdrwr-  2 root    630 Jan  1 00:00:00 bin
 42 sdrwr-  2 root    250 Jan  1 00:00:00 dev
104 sdrwr-  2 root    110 Jan  1 00:00:00 etc
114 sdrwrw  2 root    140 Jan  1 00:00:00 tmp
 41 sdrwr-  9 root    100 Jan  1 00:00:00 usr
# chdir etc
# ls -al
total   34
104 sdrwr-  2 root    110 Jan  1 00:00:00 .
 41 sdrwr-  7 root     70 Jan  1 00:00:00 ..
106 lxrwr-  1 bin    5778 Jan  1 00:00:00 as2
105 sxrwr-  1 bin     446 Jan  1 00:00:00 getty
107 sxrwr-  1 sys    2662 Jan  1 00:00:00 glob
108 sxrwr-  1 sys    1192 Jan  1 00:00:00 init
109 sxrwr-  1 sys     186 Jan  1 00:00:00 msh
110 s-rw--  1 sys     272 Jan  1 00:00:00 passwd
111 s-rwr-  1 root    512 Jan  1 00:00:00 std0
112 s-rwr-  1 bin    2082 Jan  1 00:00:00 suftab
113 s-rwr-  1 sys      88 Jan  1 00:00:00 uids
# ed uids
88
1,7p
root:0
sys:1
bin:3
adm:3
jfo:4
ken:6
dmr:7
q
# echo "who is dmr and ken?"
who is dmr and ken?
# chdir /
# chdir usr
# ls -al
total   10
 41 sdrwr-  9 root    100 Jan  1 00:00:00 .
 41 sdrwr-  9 root    100 Jan  1 00:00:00 ..
 42 sdrwr-  2 root     80 Jan  1 00:00:00 boot
 49 sdrwr-  2 root     60 Jan  1 00:00:00 fort
 54 sdrwr-  2 root     70 Jan  1 00:00:00 jack
 57 sdrwr-  5 ken     120 Jan  1 00:00:00 ken
 59 sdrwr-  2 root    110 Jan  1 00:00:00 lib
 83 sdrwr-  5 root     60 Jan  1 00:00:00 src
 68 sdrwr-  2 root    160 Jan  1 00:00:00 sys
208 sxrwrw  1 root     54 Jan  1 00:00:00 x
# chdir sys
# ls -al
total  325
 68 sdrwr-  2 root    160 Jan  1 00:00:00 .
 41 sdrwr-  9 root    100 Jan  1 00:00:00 ..
 70 sxrwr-  1 root   2192 Jan  1 00:00:00 a.out
 71 l-rwr-  1 root  16448 Jan  1 00:00:00 core
 72 s-rwr-  1 sys    1928 Jan  1 00:00:00 maki.s
 69 lxrwrw  1 root  12636 Jan  1 00:00:00 u0.s
 81 lxrwrw  1 root  18901 Jan  1 00:00:00 u1.s
 80 lxrwrw  1 root  19053 Jan  1 00:00:00 u2.s
 79 lxrwrw  1 root   7037 Jan  1 00:00:00 u3.s
 78 lxrwrw  1 root  13240 Jan  1 00:00:00 u4.s
 77 lxrwrw  1 root   9451 Jan  1 00:00:00 u5.s
 76 lxrwrw  1 root   9819 Jan  1 00:00:00 u6.s
 75 lxrwrw  1 root  16293 Jan  1 00:00:00 u7.s
 74 lxrwrw  1 root  17257 Jan  1 00:00:00 u8.s
 73 lxrwrw  1 root  10784 Jan  1 00:00:00 u9.s
 82 sxrwrw  1 root   1422 Jan  1 00:00:00 ux.s
# echo "OS source codes"
OS source codes
# cal
Year? 1971








                                  1971



            Jan                     Feb                     Mar
    S  M Tu  W Th  F  S     S  M Tu  W Th  F  S     S  M Tu  W Th  F  S
                   1  2        1  2  3  4  5  6        1  2  3  4  5  6
    3  4  5  6  7  8  9     7  8  9 10 11 12 13     7  8  9 10 11 12 13
   10 11 12 13 14 15 16    14 15 16 17 18 19 20    14 15 16 17 18 19 20
   17 18 19 20 21 22 23    21 22 23 24 25 26 27    21 22 23 24 25 26 27
   24 25 26 27 28 29 30    28                      28 29 30 31
   31



            Apr                     May                     Jun
    S  M Tu  W Th  F  S     S  M Tu  W Th  F  S     S  M Tu  W Th  F  S
                1  2  3                       1           1  2  3  4  5
    4  5  6  7  8  9 10     2  3  4  5  6  7  8     6  7  8  9 10 11 12
$

calコマンド実行結果が1971年のものだったり、dmr, kenという見慣れないuidがあったり、edといういにしえ(?)のコマンドを使っていたりしています。

"/etc/uids" "ken" "dmr"でGoogle検索すると、上の方にchown(1) - Unix First Edition Manual Pageがヒットしました。

また、/usr/sys/maki.sでGoogle検索すると、unix-v1/fs/Readme at master · jserv/unix-v1がヒットしました。

どうにも初代Unixのようです。ここで問われている内容を読み返すとOSの名前だけとのことだったのでTsukuCTF23{unix}を提出すると正解でした。

[misc, medium] build_error (50 team solved, 476 points)

怪盗シンボルより、以下の謎とき挑戦状が届いた。

怪盗シンボルだ!

メールに3つのファイルを添付した。
この3つのファイルを同じディレクトリに置き、makeとシェルに入力し実行するとビルドが走るようになっている。

ビルドを行い、標準出力からフラグを入手するのだ!

追記:ソースコードは秘密
怪盗シンボルはせっかちなので、ビルドできるかチェックしているか不安だ。。。 取りあえずチャレンジしてみよう。

FlagフォーマットはTsukuCTF23{n桁の整数}になります。

配布ファイルとして3つのファイルがありました:

$ file *
Makefile: makefile script, ASCII text
main.o:   ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
one.o:    ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ cat Makefile
.PHONY: all

all:main.o one.o
        $(CC) main.o one.o -no-pie

$

とりあえず問題文のとおりにビルドを試しましたが失敗しました:

$ make
cc main.o one.o -no-pie
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0x8b): undefined reference to `a'
/usr/bin/ld: main.c:(.text+0x92): undefined reference to `b'
collect2: error: ld returned 1 exit status
make: *** [Makefile:4: all] Error 1
$

シンボルのリンクに失敗しているようです。なんとかして各オブジェクトファイルの内容を確認する必要がありそうです。

どうやってオブジェクトファイル内容を確認しようか少し悩みました。とりあえず「読み込めたらラッキー」精神でIDAに投げ込みました。問題なく解析してくれました!

IDAでオブジェクトファイルも読み込めました

main.oをIDAで調べると、main1個だけの内容のようです。逆コンパイル結果は以下の内容でした:

int __fastcall main(int argc, const char **argv, const char **envp)
{
  int i; // [rsp+4h] [rbp-2Ch]
  __int64 v5; // [rsp+8h] [rbp-28h]
  __int64 v6; // [rsp+10h] [rbp-20h]
  __int64 v7; // [rsp+18h] [rbp-18h]
  __int64 v8; // [rsp+20h] [rbp-10h]

  v5 = 12LL;
  v6 = 11LL;
  v7 = 75LL;
  one_init(argc, argv, envp);
  for ( i = 0; v6 > i; ++i )
  {
    if ( v5 > i )
      ++v7;
    if ( v7 < i )
      ++v6;
    ++v5;
  }
  v8 = v6 + v5 + v7;
  if ( v8 == b + a + c )
    printf("flag is %ld\n", v8);
  else
    puts("please retry");
  return 0;
}

ここで、one_init関数と、abc変数は外部シンボルです。おそらく正しくリンクされるとそれらのシンボルが解決されるのでしょう。

同様に、one.oをIDAで調べると、one_init関数1個だけの内容のようです。逆コンパイル結果は以下の内容でした:

__int64 one_init()
{
  __int64 result; // rax
  int i; // [rsp+0h] [rbp-4h]

  a = 12LL;
  b = 11LL;
  c = 75LL;
  for ( i = 0; ; ++i )
  {
    result = b;
    if ( i >= (unsigned __int64)b )
      break;
    if ( i < (unsigned __int64)a )
      ++c;
    if ( c < (unsigned __int64)i )
      ++b;
    ++a;
  }
  return result;
}

これらのソースコードを手動で組み合わせてコンパイルし、実行することにしました。以下のソースを書きました:

#include <stdio.h>

long a, b, c;

void one_init()
{
  int i; // [rsp+0h] [rbp-4h]

  a = 12LL;
  b = 11LL;
  c = 75LL;
  for ( i = 0; ; ++i )
  {
    if ( i >= b )
      break;
    if ( i < a )
      ++c;
    if ( c < i )
      ++b;
    ++a;
  }
}

int main(int argc, const char **argv, const char **envp)
{
  one_init();
  printf("flag is %ld\n", a+b+c);
}

コンパイルして実行しました:

$ gcc solve.c
$ ./a.out
flag is 120
$

問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{120}

[osint, easy] eruption (258 team solved, 100 points)

つくしくんは旅行に行ったときに噴火を見ました。噴火の瞬間を実際に見たのは初めてでしたが、見た日付を覚えていません。
つくしくんが噴火を見た日付を写真の撮影日から特定して教えてください。
撮影場所が日本なのでタイムゾーンはJSTです。フラグの形式は TsukuCTF23{YYYY/MM/DD} です。

配布ファイルとして画像1枚がありました。Google Chromeでその画像を開き、右クリックメニューのSearch image with Googleを選択しました:

JANOG49 in 鹿児島 に現地参加しました!|株式会社ブロードバンドタワーがヒットしました。火山は桜島とのことです。黒煙の様子がよく似ているので、同じタイミングで撮影したのかなと想像しました。当該記事に日時:2022年1月26日(水)~28日(金)とあるため、3日分を問題文に記載されているフラグ形式で提出してみると、28日が正解でした: TsukuCTF23{2022/01/28}

[osint, easy] location_for_what (240 team solved, 100 points)

とある場所を友達と探索していると、「ここ、何かの映画の聖地だった気がするけど、名前忘れちゃった......」とのこと。
シュッと特定して教えてあげよう!

Flagの形式は TsukuCTF23{映画のタイトル} です。

配布ファイルとして画像1枚がありました。Google画像検索してみました:

言の葉の庭という単語がよくヒットしました。その単語そのものが映画名とは知らなかったのでしばらく別の映画名を探したりしていましたが、最終的にその単語そのものが映画名と無事分かりました。問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{言の葉の庭}

[osint, easy] castle (217 team solved, 100 points)

この前、お城に行ってこの写真を取ってきたんだ!
どこにあるかわかるかい?

フラグのフォーマットは、TsukuCTF23{緯度_軽度} です。 小数点は第三桁まで有効とします。

配布ファイルとして画像1枚がありました:

お城の壁に特徴的な壁画(?)があるので、Google画像検索で壁画周辺を検索しました:

姫路「太陽公園」がインスタ映え抜群!トリックアートや世界遺産と撮影しよう【兵庫】 |じゃらんニュースがヒットしました。姫路の太陽公園というところで、お城の名前は白鳥城というらしいです。

姫路 白鳥城でGoogle検索すると、城のエリア:太陽公園がヒットし、一番下に住所が記載されていいました。

Googleマップで調べると野生たぬき - Google マップあたりのようです。問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{34.886_134.630}

[osint, easy] airport (205 team solved, 100 points)

つくしくんは、旅の思い出を振り返っていましたが、この写真はどこの空港かわからなくなりました。
ここはどこの空港か教えてくれませんか?
Flagフォーマットは TsukuCTF23{空港の3レターコード(IATA)} です。

配布ファイルとして画像1枚がありました:

最初のうちは、白い車の前面にあるCTK-101や、奥に見える車(?)の側面に書かれているBL-29でGoogle検索していましたが全然見つからず絶望していました。祈りながらGoogle画像検索で範囲を調整しました:

山や町並みの雰囲気がよく似た記事【搭乗記】関西の短距離区間_JAL2321 : 大阪伊丹(ITM) ⇒ コウノトリ但馬(TJH)がヒットしました。伊丹空港らしいです。問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{ITM}

Google画像検索は凄いです!

[osint, easy] green_bridge (180 team solved, 180 points)

この写真が撮影されたのはどこですか...?
Flagフォーマットは TsukuCTF23{緯度_経度} です。
端数は少数第4位を四捨五入して小数点以下第3位の精度で回答してください。

配布ファイルとして画像1枚がありました(配布画像は大きなサイズだったので縮小しています):

緑の橋が森へ溶け込んでいるため、Google画像検索でも橋そのものを調べることは難しそうでした。考えを変えて建物の範囲で調べてみました:

栃木の旅(2)もみじ谷大吊橋、尚仁沢湧水、山縣有朋記念館 - オーロラ特急    ノスタルジック旅日記がヒットしました。緑の橋も、幸せのピンクポストもぴったりで、まさにこの場所だと思いました。

意気揚々と森林の駅/もみじ谷大吊橋 - Google マップの座標TsukuCTF23{36.955_139.875}を提出しましたが違いました。しばらく悩んだ後、「撮影対象はそことして、撮影場所は少しずれた位置にあるのでは?」と思いつきました。Googleマップのストリートビューで周辺の道路を辿っていると、那須塩原市, 栃木県 - Google マップがそれらしい位置のようです。問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{36.956_139.880}

[osint, easy] perfume (175 team solved, 198 points)

とある施設でいろいろな香水を見かけたが、施設の場所が思い出せない。
この施設の場所を調べ、教えてほしい。

フラグはTsukuCTF23{緯度_経度}であり、小数点第三桁まで有効である。

「問題タイトルのperfomeって?」と思ったので調べてみると、香水などの意味を持つ英単語のようです。配布ファイルとして画像1枚がありました(配布画像は大きなサイズだったので縮小しています):

なるほど香水関係の画像です。なんとなく博物館のような場所と思いました。Google画像検索に投げて、香水部分で検索しました:

別府の「大分香りの博物館」は、知的好奇心を刺激するユニークなミュージアム!がヒットしました。香水の瓶の並びが同じなので、おそらく大分香りの博物館なのだろうと考えました。公式ページを探すとアクセス - 大分香りの博物館が見つかり、連絡先箇所に住所が書かれていました。Googleマップで座標を調べました(大分香りの博物館 - Google マップ)。問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{33.311_131.488}

[osint, easy] mab (166 team solved, 228 points)

mab.main.jpが使用しているレンタルサーバサービスを特定し、そのWebサイトのドメイン名を答えてください。Flagフォーマットは TsukuCTF23{ドメイン名}です。

配布ファイルはありません。https://mab.main.jp/は存在することを確認しました。とりあえずDNS関係を調べようと考えて、digコマンドで正引きしました:

$ dig mab.main.jp

; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> mab.main.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58266
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;mab.main.jp.                   IN      A

;; ANSWER SECTION:
mab.main.jp.            0       IN      A       157.7.107.89

;; Query time: 20 msec
;; SERVER: 172.23.64.1#53(172.23.64.1) (UDP)
;; WHEN: Sat Dec 09 14:27:19 JST 2023
;; MSG SIZE  rcvd: 56

$

ドメインに対応したIPアドレスがわかったので、逆引きしました:

$ dig -x 157.7.107.89

; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> -x 157.7.107.89
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1454
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;89.107.7.157.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
89.107.7.157.in-addr.arpa. 0    IN      PTR     157-7-107-89.virt.lolipop.jp.

;; Query time: 29 msec
;; SERVER: 172.23.64.1#53(172.23.64.1) (UDP)
;; WHEN: Sat Dec 09 14:27:25 JST 2023
;; MSG SIZE  rcvd: 110

$

157-7-107-89.virt.lolipop.jpと同一のサーバーを使用していそうなことが分かります。ロリポップサーバーらしく見えたので思ったものを提出してみると正解でした: TsukuCTF23{lolipop.jp}

[osint, easy] tsukushi_estate (165 team solved, 232 points)

つくし君が写真に写っているビルにオフィスを構えたいらしいのだけど、築年数が少し心配......
つくし君の代わりに調査してください!

Flagの形式は TsukuCTF23{築年_月} です。
例えば、2022年3月に出来たビルであれば、 TsukuCTF23{2022_03} になります。

配布ファイルとして画像1枚がありました(配布画像は大きなサイズだったので縮小しています):

つくし不動産でGoogle検索すると、公式サイトの松阪市の賃貸・売買なら合同会社つくし不動産がヒットしました。サイト内に売買物件検索があります。

問題文のビルばかり頭にあったため、売ビル・売倉庫・売工場・その他を探しに行っていました。調査時点で検索できた三重県内4件すべてを見ましたが、配布ファイルのような看板は見当たりませんでした。試しにその4件の築年月を提出してみましたがすべて不正解でした。

困ったので公式サイトのことは一旦忘れて、つくし不動産 ビルでGoogle検索しました:

5番目に、配布ファイルらしい看板のあるビルの画像がヒットしました!【アットホーム】伊勢SIビル 1階~5階部分(提供元:(同)つくし不動産)|伊勢市の貸事務所[6978084503]でした。そこに築年月が1983年3月とあったので、問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{1983_03}

[osint, medium] travel_with_tsukushi (149 team solved, 281 points)

旅が好きなつくしくんは、空港の写真からそれがどこの空港かすぐにわかります。
つくしくんからの挑戦状!
これがどこの空港かわかるかな?
Flagフォーマットは TsukuCTF23{空港の3レターコード(IATA)} です。

配布ファイルとして画像1枚がありました(配布画像は大きなサイズだったので縮小しています):

空港関係2問目です!この空港は日本国外な予感がしました。とりあえずGoogle画像検索すると、一番手前の飛行機はLCCエア・アラビアなことは分かりました。「運行している国が少なければ特定できるかも」と思って調べましたが、エア・アラビア - Wikipediaによると2014年2月時点で、エア・アラビアは中東、北アフリカ、アジア、ヨーロッパにある90の空港に就航とのことでした。全列挙を諦めました。

どうしようか考えながら、Google画像検索の対象範囲を建物付近で調整していました:

クアラルンプール空港 | 中東からARMYとBARMYのブログがヒットし、雰囲気の似た建物が見つかりました!ブログ記事タイトルのクアラルンプール空港らしいかもと思い、空港の3レターコード(IATA)一覧・検索 | エアラインガイドJPでレターコードを調べ、問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{KUL}

Google画像検索が凄いです!

[osint, medium] kiZOU (135 team solved, 321 points)

ここは日本で一番のリゾート地!少し歩くと目の前に素敵な像が見えたから写真を撮ったつもりだったんだけど、見返したら端っこしか写ってない!困ったなぁ、この像についてもっと知りたかったんだけどなぁ。僕の代わりにこの像について調べてくれないか?
フラグ形式は TsukuCTF23{像を寄贈した人物の名前} です。

配布ファイルとして画像1枚がありました(配布画像は大きなサイズだったので縮小しています):

ここで画像をよく見ると、像の少し上にAU style NAHAという店舗名があることに気付きました:

店舗名でGoogle検索してau Style NAHA | auショップ検索 | auを見つけて、店舗の住所が沖縄県那覇市久茂地1-1-1 パレット久茂地と分かりました。

Googleマップのストリートビューで問題の像の全体が見えるかと考えて、探しました。てっきり「通りに面した向き」から撮影したものと思っていたのでしばらくさまよっていました。店舗右斜めの国際通り - Google マップに像を見つけました!狛犬っぽい像ですが、沖縄なのでシーサー像だと考えました。

久茂地パレット シーサーでGoogle検索すると、パレット久茂地シーサー - なんでも沖縄ブログに以下の記述を見つけました:

パレット久茂地に、立派なシーサーがあります。
ただ、イベント等が開かれる広場にあるわけではなく、県庁前交番側の出入口にあります。
島常賀(しま じょうが)さんというシーサーの名工がいたそうで、その人の作品を元に造られたのか、本人の作品なのかは不明です。

試しにTsukuCTF23{島常賀}を提出してみましたが不正解でした。制作者様と寄贈者様は異なるようです。久茂地パレット シーサー 寄贈でGoogle検索するとXユーザーのkinjoさん: 「パレット久茂地前のシーサー。 島常賀氏の作品を喜多敏勝氏が鋳造した作品です❗ 1991年那覇市政70周年に上原清善氏が寄贈されたシーサーです。 #沖縄 #シーサー #島常賀 #シーサー愛好家 https://t.co/CAwQ3ZWp4I」 / Xを見つけました。問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{上原清善}

なお最初は、配布ファイル画像左上の方にホテル名らしいものが映り込んでいることに気付いたので、そちらの線で調べようとしていました:

ただ"HOTEL ROCO"などでGoogle検索しても別のホテル名ばかりヒットしたので諦めていました。本記事執筆時点で改めて"HOTEL ROCOR"でGoogle検索すると、検索候補にhotel rocore naha 沖縄が出てきました。こちらから調べる筋もあったかもしれません。

[osint, easy] CtrlAltPrtSc (87 team solved, 427 points)

仕事中にCtrl + Alt + PrtScでウィンドウのスクリーンショットを撮ったよ。

つくし君がサボって使用していたサービスの名前を答えよ。 フラグはTsukuCTF23{サービスの名前}の形式です。

配布ファイルとして画像1枚がありました:

どこからどう見ても電卓のスクリーンショットです。混乱しました。ただよく見ると、電卓ウィンドウの上下左右の枠に、背後のウィンドウの内容も映り込んでいます。上枠左の方を見るとYoutubeらしいアイコンや文字列に感じたので、試しに問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{YOUTUBE}

数分で解けたので確かに難易度easyなのかもしれませんが、ちょっとびっくりした問題です。

[osint, easy] laser (83 team solved, 433 points)

光源の座標を正確に教えてください。
フラグフォーマットは、TsukuCTF23{緯度_経度}です。 小数点以下5位を切り捨てて、小数点以下4桁で答えてください。

配布ファイルとして画像1枚がありました(配布画像は大きなサイズだったので縮小しています):

あまりにも見慣れない光景で、UFOか何かなのかとすら思いました。とりあえずGoogle画像検索してみました:

Twitterアカウントがヒットしました。その方のメディア一覧を探していると、Xユーザーのうらさん: 「阪神百貨店が空に向かってビームうってる……… https://t.co/3ngWDiGmir」 / Xというツイートがありました。阪神百貨店付近らしいです。

阪神百貨店 ビームでGoogle検索すると阪神百貨店上空に謎のビーム「阪神優勝ビーム?」「なんでや!阪神関係ないやろ!」 - Togetterを発見し、その中にXユーザーのさ やさん: 「これは御堂筋の光の饗宴イベントのプログラムの1つで、村野藤吾さんの梅田吸気塔からのランドマークレーザーになります。 11/3からスタートでタイミングが良すぎて紛らわしいですが阪神とは無関係なのでご注意を…!(念のため補足) https://t.co/9WoMIL8ixh」 / Xというツイートを発見しました:

梅田吸気塔という広場らしい場所から発射されているらしいです。Googleマップで梅田吸気塔で検索して、出てきたはずの座標TsukuCTF23{34.7016_135.4964}を提出してみたのですが不正解でした。(実は検索後にズーム等を行っていたらしく、そこで座標が少しズレてしまっていたようです。検索直後の座標は正解と同じでした。)

さ __ く __ やさんのツイート画像を見るに、広場内部の高い建造物ではなく、少し脇の棒から発射されているようでした。Google Chromeのウィンドウサイズを極限まで小さくした状態で、それらしい位置を探しました:

問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{34.7016_135.4991}

[osint, easy] Yuki (75 team solved, 446 points)

雪、無音、窓辺にて。

フラグのフォーマットは、TsukuCTF23{緯度_経度}です。
緯度経度は小数第四位を切り捨てとします(精度に注意)。

配布ファイルとして画像1枚がありました(配布画像は大きなサイズだったので縮小しています):

雪景色の検索は非常に辛そうな予感がして絶望していました。とはいえとりあえずGoogle画像検索で、範囲を調整してみました:

『青く美しい氷像に感動『2023千歳・支笏湖氷濤まつり』と定山渓ビューホテル宿泊記』支笏湖(北海道)の旅行記・ブログ by たろたろさん【フォートラベル】がヒットしました。窓から見える雪景色。箇所の画像が、窓の縦枠といい、手すりの高さといい、奥に見える橋といい、まさにぴったりに見えます!Google画像検索は凄い!

そういうわけで撮影場所は定山渓温泉 定山渓ビューホテルらしいです。Googleマップでホテル名を入力して座標を調べ、問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{42.969_141.167}

[osint, easy] free_rider (62 team solved, 463 points)

https://www.fnn.jp/articles/-/608001
私はこのユーチューバーが本当に許せません!
この動画を見たいので、元のYouTubeのURLを教えてください。
また、一番上の画像(「非難が殺到」を含む)の再生位置で指定してください。
フラグフォーマットは、TsukuCTF23{https://www.youtube.com/watch?v=**REDACTED**&t=**REDACTED**s}

配布ファイルはありません。問題文にあるURLを見ると、新幹線無賃乗車な人のニュース記事でした。問題文で指定されている一番上の画像をGoogle画像検索すると、Togetterがヒットしました(件の人の顔を載せたくないですし、そのTogetterも載せたくないので、この表現に留めます)。Togetter中にYoutube動画のURLがあり、https://www.youtube.com/watch?v=Dg_TKW3sS1Uだと分かりました。「動画のアクセス数に貢献したくないな~~~」と思いながらも問題を解くためだと思ってアクセスすると、この動画は、YouTube コミュニティ ガイドラインへの違反により削除されましたとのことでした、安心!

そういうわけで動画が削除されているので問題画像の位置が分かりません。困ったのでYoutube動画のURLそのものでGoogle検索しました:

キプロス出身YouTuber、キセル乗車やホテルで食い逃げしながら日本旅行 | スラド ITがヒットしました。タレコミ内容のweb, Archiveのリンクを開いてみましたが、Cookie関連のダイアログが表示され、なにかボタンを押してもAn error occurred while saving your choice. Please try again.エラーで動画を見られませんでした。困ったのでスラド内容を見返していると、avaScriptごっちゃごちゃなので表示に時間かかるのなら、このURLで直接動画ファイルに飛ぶのでどうぞ。というコメントで動画への直リンクURLが掲載されていました。そこから動画をダウンロードして、ローカルで適当に眺めていると、2:56時点に非難が殺到箇所の画像がありました。Youtubeのtパラメーターは秒単位で指定するので、t=176sとなります。

あとは動画URLと再生時間を合わせて、問題文に記載されているフラグ形式で提出してみると正解でした: TsukuCTF23{https://www.youtube.com/watch?v=Dg_TKW3sS1U&t=176s}

ある程度進められたけど解けなかった問題

解けなかった以上、配布画像や問題文等を細かく記述してもしょうがないと思うので、簡単に記述します。解法の詳細は解けたチーム様のwrite-up記事をご参照ください。

[osint, easy] big_statue (122 team solved, 354 points)

Google画像検索の文字認識で、像の上の中国語らしい旗の内容が榴莲王 利陞らしいことは分かりました:

ただその文字列やdurian big statue at streetなどでGoogle検索しても、見つけられませんでした。最終的に、画像の右中央に小さく移っている旗の下の方のロゴをmspaintで描いて画像検索もしてみましたが、幾何学模様ばかりヒットしてしまいました:

ずっとドリアン像は周辺全体が外皮だと思っていたのですが、他の人をwrite-up記事を見るとなんと背面は中身が見えている状況だったようです。「像全体が緑色の外皮のもの」ばかり探していたので、もしかしたら正解の画像を見ていたのに見落としてしまっていたかもしれません。先入観は怖いです……。

[osint, easy] TrainWindow (104 team solved, 394 points)

車窓 見える 島でGoogle検索すると東海道新幹線 - 【知ってなるほど!~新幹線の車窓~Vol.4】 海に浮かぶ島って、不思議な魅力がありますよね。... | Facebookを見つけ、その中の東海道新幹線の車窓からも、いくつか島が見えます。まず、熱海駅の前後で見える初島。熱海の沖に浮かぶ小さな島で、静岡県唯一の有人島です。という記述や画像が目に止まりました。島の平らっぽさ(?)が似ているように思いました。初島 車窓でGoogle画像検索すると『2010年海の日 初島・熱海(初島編)』熱海(静岡県)の旅行記・ブログ by JUNOさん【フォートラベル】を見つけました。島の右側に、横長の白い建物があるあたり、おそらく写真の島は初島です!

と、ここまではわかったのですが、撮影場所が分からずに時間切れになりました。写真中央付近の建物にTTCの文字があることは分かっていましたが、Google検索しても「なんだかよく分からない!別の文字かもしれないしこの方向性は諦めよう!」と即座に挫折していました。おそらくここが最大の敗因です……。

[osint, easy] 3636 (76 team solved, 444 points)

"ed.jp" "-3636"でGoogle検索して、とうみょう子ども園 | 会津若松市の教育・保育は見つけていて、Googleマップのストリートビューで周辺を調べてはいました。ただ、「この手の建物の位置を表す看板は、きっと大通りにある大きなもので、車に乗っている人のためのものだろう」と思い込んでおり、大通り付近を探索して諦めていました。「人が見る用途の小さめの看板」という可能性をまったく考えていなかったのが敗因です……。

[osint, medium] flower_bed (42 team solved, 484 points)

問題文の通り、隠れているもののQRコードは見えました:

何かQRコードの向きがよくわからないことになっていますが、とりあえず映っている分だけでも誤り訂正能力で復元できないか試そうとしました。GitHub - waidotto/strong-qr-decoder: 強力なQRコードデコーダを使いました(当該ツールはPython2のコードです。Python3に対応させるために、print文をprint関数へひたすら手動で変換していました。Python2を入れるか、2to3だったかの機械変換を試したほうが良かったですね……)。また、画像をアフィン変換して矩形に近い状態に変形し、補助線を引いて手動認識しやすくしていました:

手入力したQRコードを復号しようとしました:

$ cat manual_qr_code.txt
#######_?????????????_#######
#_____#_?????????????_#_____#
#_###_#_?????????????_#_###_#
#_###_#_?????????????_#_###_#
#_###_#_?????????????_#_###_#
#_____#_?????????????_#_____#
#######_?????????????_#######
???????????????????##________
???????????????????#_##___##_
??????????????????#____#__##_
?????????????????_##__#_##__?
????????????????__##___#_#_#?
??????????????#_#_#__#######?
??????????????###___#___#_#??
?????????????###___####__##??
????????????__###_#_____##???
???????????_#_##__##_##___???
??????????#_###__##_##____???
?????????_#_____##_#__##_????
????????_###__#___#____#?????
?????____#_#_##_#_##_###?????
________##_____##__#____?????
#######_#_#_#_#_#_#_#_#??????
#_____#___#_#_##__##__#??????
#_###_#__###_####_#_#_#??????
#_###_#_##_#_##__##_#_???????
#_###_#_#___#_#__###__???????
#_____#_#_##_#__##___????????
#######___#__###_###_????????
$ python3 sqrd.py --verbose manual_qr_code.txt

型番:   3 (29 x 29)
(中略)
[ OK ] 位置検出パターン
[ OK ] 分離パターン
[ NG ] タイミングパターン
[ NG ] 位置合わせパターン

[ OK ] 常暗モジュール
形式情報(横):                   ???????11000110
形式情報(縦):                   0111001????????
[ OK ] 縦横の形式情報の整合性
形式情報(合成):         011100111000110
形式情報(マスク解除):   110110111010100
[ NG ] 形式情報の誤り訂正

誤り訂正レベル: 11      (Q)
マスクパターン: 3       [ (x + y) mod 3 = 0 ]
(中略)
(最大)誤り訂正数: 9

RSブロック 0
不明モジュールを含むブロック数が(最大)誤り訂正数を超えています

RSブロック 1
不明モジュールを含むブロック数が(最大)誤り訂正数を超えています

最終的なデータバイト列: <map object at 0x7f897f112b60> (34バイト)
最終的なデータビット列: 00000000000000000000000000000000000000001101110001111110000000000000000000000000110000001101110011101010000001000000010000000000000000000000000000000000000000000000000000000000110000000100010000000000000000000000000000000000100101011111000100011110010100010000000000000000

モード指示子:   0000 (終端パターン)


$

欠損部分が多すぎるようで復号できませんでした!

また、QRコードを手打ちする前に、QRコード周辺に英語などが書かれていることには気付いていましたが、その方向からは詰めきれませんでした……。

[osint, easy] fiction (32 team solved, 491 points)

配布ファイルを見た瞬間叫びました。「これゲーム画像だ」と!

Google画像検索するとVALORANT:新マップ「サンセット」の紹介トレーラーが公開。ロサンゼルスが舞台の2サイトマップ、EP7 ACT2で登場 | VALORANT News.jpがヒットしました。VALORANTというゲームの、ロサンゼルスをモチーフとしたステージsunset中のスクリーンショットのようです。

VALORANT sunset LAでGoogle検索すると【VALORANT初心者攻略指南】新マップ「サンセット」——夕焼けのロサンゼルスで中央エリアを軸に試合が展開する10個目のマップ | eSports World(eスポーツワールド)がヒットしました。アートに関しては、まさにライアットのオフィス周辺がインスピレーションの元になっています。らしいので、ライアット本社周辺をGoogleマップで探そうとしましたが、あまりにも無謀な挑戦に思えました。

その後、なんやかんや調べているとSunset/Quotes | Valorant Wiki | Fandomへたどり着き、Wiki内のどこかにあったスクリーンショットや動画を眺めているとSUNSET // Official Map Trailer - VALORANT - YouTubeがありました。動画を眺めていると4:32時点で座標が現れました!

ただ、34°2'C" N 118°12'YT" Wの秒箇所がアルファベット表記であり、それは現実の表記ではありません。valorant Coordinates "sunset"でGoogle検索するとWhat Is Sunset Map Location In Valorant? - GINX TVがヒットして、The exact coordinates of the map's location are 34.029571, -118.211540とありました。意気揚々とTsukuCTF23{34.0295_-118.2115}を提出してみましたが不正解でした。そのまま分からずじまいでした……。

Writeup賞

本ブログ記事をWriteup賞に選んでいただきました。ありがとうございます!

感想

  • Google画像検索は凄いです!もはやこれ無しではOSINTジャンルを全くできる気がしません!
  • OSINTジャンルは、色々な可能性や方向性、着眼点から考えることが重要なのかなと思いました。通常のCTF以上に、複数人チームで参加するメリットが大きそうです。実際、難しいOSINTジャンル問題は、取っ掛かりも何も掴めませんでした。
  • とりあえずOSINT問題は全問眺めました。問題の中には、鯉の洗いの画像や、鶏天うどんの画像もありました。ご飯時の前にそれらの画像検索結果を見まくっていると、とてもお腹が空きました!