📝

TsukuCTF 2022に参加しました

2022/10/23に公開

ひさしぶりに参加しました。OSINT以外のジャンルで正の点数を得ることができませんでしたが、いろいろ実験したり考えたりできたので十分楽しめました。

解けた問題

[Tsukushi]

  • Welcome (294pts)

[OSINT]

  • Attack of Tsukushi (100pts)
  • FlyMeToTheTsukushi (218pts)
  • sky (375pts)
  • station (382pts)
  • Whare (406pts)
  • Gorgeous Interior Bus (433pts)
  • Bringer_of_happpiness (446pts)
  • uTSUKUSHIi (499pts)

Welcome(294pts)

Discordの #-welcome-to-tsukuctf の説明欄にて公開されていました。

TsukuCTF22{Welcome_to_TsukuCTF_2022!!!!}

Attack of Tsukushi (100pts)

進撃の巨人は読んだことがないのですが、進撃の巨人のキャラなのは何となくわかりました。

「進撃の巨人 銅像」で調べると、 JR日田駅だということがわかりました。

TsukuCTF22{8770013}

FlyMeToTheTsukushi (218pts)

反射で「TAKENOYA」の字が確認できました。「竹乃屋 空港」で調べると、どうやら福岡空港しか空港内に出店していないみたいだったので、それが答えでした。

TsukuCTF22{FUKUOKA}

sky (375pts)

最初新幹線と勘違いしていたのですが、「centx」「wind」等の情報から、名古屋鉄道の車輌であることがわかりました。

内装・中央の車内図から、8両編成の特急だということがわかり、調べると、それはミュースカイであることがわかりました。

ミュースカイは、セントレアと名鉄名古屋を結ぶ特急です。

窓を確認したところ、真っ暗なので、撮影地点がトンネル内だと仮定しました。

すると、この区間でトンネルがあるのは、名鉄名古屋ー金山間しかないことがわかりました。

2択に絞れたので、全部試してみたところ、

TsukuCTF22{名鉄名古屋}

が答えでした。

station (382pts)

画像の左部分が何を示しているかが重要な問題でした。

路線図

画像の左上を見ると、「(多分"南"でしょう)北線 東豊線」という文字があり、すぐに「札幌市営地下鉄東西線」であることがわかりました。また、女性専用車両が12両目にあることからも、これが正しいと判断できました[1]

画像の左側の看板を「乗り換え案内」だと勘違いしていたので、

TsukuCTF{大通}

と誤答をしてしまいました。

いろいろ調査をしていると、左上の見切れている字が「西11丁目」に見えてきました。

調査を続けていると、左側の看板は、以下の画像のような物であることがわかったので、これが答えだという確信が持てました。

TsukuCTF22{西11丁目}

Where (406pts)

見るからに渋谷です。それがわからなくとも、画像内で一番高い建物に「SHIBUYA SCAMBLE SQUARE」の字が書いてあるので、渋谷だということがわかります。

西武デパート・丸井デパート(渋谷モディ)等の位置関係から、ここが渋谷パルコであるとわかりました。

ところで、この建物は何回か建て替わっているのですが[2]、時系列順をさかのぼって全通り試してみたところ、一番古いものがflagとなっていました。

TsukuCTF22{1973/06/14}

Gorgeous Interior Bus (433pts)

チームメイトから「銀座だよ」という伝言をもらって解き始めました。

銀座を走るおしゃれなバスを総当たりしようとしたのですが、似ているものがありませんでした。

諦めて写真上部の「ルートマップ」を見てみると、「〇〇ンスパあたみ」の字を発見しました。(ここで「銀座じゃないなぁ」と気づきました。)

「ンスパあたみ」で検索をかけると、「湯~遊~バス」という周遊バス(ネーミングセンスが良い)の停留所に「マリンスパあたみ」とありました。

ルートマップとにらめっこすると、マリンスパあたみの 2 つとなりに 2 文字長のバス停があります。「銀座」です(やっぱり銀座でした)。

すなわち、この写真は銀座ーサンビーチ間で撮影されたものであり、google mapで確認すると、その間に名前の付いた交差点が 1 つしかなかった。なので、それがflagだとわかりました。

TsukuCTF22{東海岸町}

Bringer_of_happpiness (446pts)

チームメイトから「移っている電車は島原鉄道」という情報をもらって解き始めました。

駅前にパチンコ屋があったので、「島原鉄道 パチンコ J」と適当に検索したところ、ここが「J-コースト」というパチンコ屋だとわかりました。

ホームページ曰く[3]、撮影地点が「島原外港駅」前であることがわかり、ストリートビューを利用して厳密な撮影地点を探しました。

TsukuCTF22{32.7691-130.3706}

uTSUKUSHIi (499pts)

映っている猫は、猫カフェの猫っぽいことがインテリアからわかります。

黄色が特徴の猫カフェに見えたので、「黄色 猫カフェ(都市)」という形でググりました。

問題の撮影地点が局所的に感じたので、都市は、「札幌・東京・名古屋・福岡・京都」を候補として検索しました。

すると、「京都」のタイミングで「猫カフェMOCHA京都河原町店」という、内装が似ている猫カフェを発見しました。

ホームページ[4]から猫の一覧を眺めていると、似ている猫を発見しました。

提出制限がなかったので、躊躇なく試してみたところ、一発で正解を引き当てました。

TsukuCTF22{2021/09/16}

頑張った問題

[OSINT]

  • what_time_is_it (495pts)
  • FlagDM (500pts)

[Misc]

  • Lucky Number 777(498pts)
  • nako3ndbox(500pts)

what_time_is_it (495pts)

残念ながら提出制限を超過してしまいました。非常に残念です。(まぁでも提出制限が無かったら1440通り試せばいいだけなので、妥当かなぁ)

画像から、「JRの特急である」「始点か終点駅である」「2602という数字がある」ことがわかりました。

2600系は、現在「特急うずしお」として高松ー徳島間で一日3,4往復程度運行されていうということが調査によってわかりました。

また、徳島駅をgoogle mapで確認すると、写真奥の建物にそっくりな建物を見つけたので、ここだと断定しました。

ここで、flagは3, 4択に絞れたので、このサイト[5]を見ながら手あたり次第全部提出してみたのですが、提出してから「このデータが旧ダイヤである」ことにきづきました(Oh...)

flagDM (500pts)

与えられた画像からgoogleドキュメントの共有ページにたどり着きました。

https://docs.google.com/document/d/1y266JcI1E8piugLQDPaK7boSzAKykg4FepQZIOt4Phg/edit

xeuledocを利用してこのドキュメントからgmailアドレスの特定をしました。

> xeuledoc https://docs.google.com/document/d/1y266JcI1E8piugLQDPaK7boSzAKykg4FepQZIOt4Phg/edit

Document ID : 1y266JcI1E8piugLQDPaK7boSzAKykg4FepQZIOt4Phg

[+] Creation date : 2022/10/03 12:18:33 (UTC)
[+] Last edit date : 2022/10/03 12:29:36 (UTC)

Public permissions :

- reader

[+] Owner found !

Name : my real name is secret
Email : [mpju40nchoyba85@gmail.com](mailto:mpju40nchoyba85@gmail.com)
Google ID : 03458870179467391774

ghuntを利用して、このアカウントでgoogle mapの口コミを利用したことを発見しました。

> python3 ghunt.py email mpju40nchoyba85@gmail.com

[+] 1 account found !

---

Name : my real name is secret

[+] Custom profile picture !
=> [https://lh3.googleusercontent.com/a-/ACNPEu_leXrOIIzCIna7Jx_LcstS9GGLCDF8HfbnQ-rS](https://lh3.googleusercontent.com/a-/ACNPEu_leXrOIIzCIna7Jx_LcstS9GGLCDF8HfbnQ-rS)
Profile picture saved !

Last profile edit : 2022/10/04 17:21:29 (UTC)

Email : [mpju40nchoyba85@gmail.com](mailto:mpju40nchoyba85@gmail.com)
Gaia ID : 117114600888142762916

Hangouts Bot : No

[-] Unable to fetch connected Google services.

[-] YouTube channel not found.

Google Maps : [https://www.google.com/maps/contrib/117114600888142762916/reviews](https://www.google.com/maps/contrib/117114600888142762916/reviews)
[-] No reviews

Google Calendar : [https://calendar.google.com/calendar/u/0/embed?src=mpju40nchoyba85@gmail.com](https://calendar.google.com/calendar/u/0/embed?src=mpju40nchoyba85@gmail.com)
[-] No public Google Calendar.
Google Docs
GIFT
We have a gift for you :) ⚠️WARNING⚠️ You visited our adult site yesterday!! You have to pay 294000 JPY. Please pay into the following bank account. Tsuku Banks XXXX-XXXX-XXXX-XXXX Failure to pay will result in legal action. Have a nice day 👋

投稿されている画像より、twitterのidを発見しました。

https://twitter.com/07xm8d9pzp

twitterのプロフィールからyoutubeアカウントを発見しました。

https://www.youtube.com/watch?v=3F4hSEJx5ks

このyoutubeアカウントに紐づけられているgmailアドレスと、googleドキュメントのgmailアドレスが違うかもしれないと思い、もう一度ghuntにかけてみたのですが、新たな情報は得られませんでした。

> python3 ghunt.py youtube https://www.youtube.com/channel/UCZ7_GtoaC4oHCKBLhJi13Ww/about

📌 [Youtube channel]
[+] Channel name : gross_poem

[-] No interesting snapshot found.

[-] Email on profile : not available.

🧬 Total views : 30
🧬 Joined date : Oct 3, 2022

このへんで時間切れになってしまいました。

試行錯誤ができそうな箇所としては

  • 非公開になっているgoogle calenderを、どうにかして見る
  • 非公開になっているgoogle mapの口コミを、どうにかして探す
  • youtubeから得られている情報があまりにも少なすぎるので、もう少し探す

といったものが挙げられると思います。

にしても、公開されたドキュメントだけで、こんなに情報が得られるなんて、非常に恐ろしいですね。

Lucky Number 777 (498pts)

lucky_number_777.py
import string

def challenge(lucky_number: str):
    flag = "TsukuCTF22{THIS_IS_NOT_FLAG}"  # TOP SECRET
    printable = string.printable
    filter = "_[].,*+%:  |()#\\\t\r\v\f\n"  # ( ̄ー ̄)

    if not all(c in printable for c in lucky_number):
        return "No Hack!!!"

    if any(c in filter for c in lucky_number):
        return "No Hack!!!"

    if lucky_number == "flag" or "{flag}" in lucky_number:
        return "No Hack!!!"

    try:
        return "your lucky_number is " + str(eval(lucky_number))
    except:
        return "No Hack!!!"

eval関数が穴なので、そこを駆使してflagを出力させるところまではわかったのですが、filterの制約がきつすぎて、突破することができませんでした。

nako3ndbox (500pts)

「なでしこ 脆弱性」で調べると、「圧縮・展開操作でOSコマンドインジェクションが起こせる」[^6]ということが分かったので、山を張って試行錯誤したのですが、問題の環境に7zipがインストールされていなくて実行できませんでした。

まとめ

知り合いが作問陣にいた ⋀ よくwrite-upを書いていらっしゃる強い方が参加されていたので、久しぶりに土日をCTFに費やしてみたのですが、問題の質も高く、楽しかったです。

CTFは復習が本番だと思っているので、上位の皆さんのwrite-upを楽しみに待っています。

脚注
  1. https://www.city.sapporo.jp/st/subway/anshin_syaro/anshin_syaryo.html ↩︎

  2. https://ja.wikipedia.org/wiki/渋谷パルコ ↩︎

  3. https://www.p-world.co.jp/nagasaki/j-coast.htm ↩︎

  4. https://catmocha.jp/shop/kawaramachi/ ↩︎

  5. https://207hd.com/post-15008/ ↩︎

Discussion