TsukuCTF 2021に参加しました(write-up)
TsukuCTFにkstmとして、後輩と2人で参戦しました。
公式のwrite-upもSecHack365-Fansのページに公開されています。
自分たちは2700点で24位で、そのうち次の問題に自分が正解しました。
- Welcome | Tsukushi
- digits | Web
- TORItsukushi | Misc
- Customization | Misc
- CAD | Hardware
- ramen | OSINT
- shop | OSINT
- fishing | OSINT
- train | OSINT
- train2 | OSINT
- cafe | OSINT
- OBOG | OSINT
- InterPlanetary Protocol | OSINT
- 感想
Welcome | Tsukushi
TsukuCTF 2021にご参加いただきありがとうございます。フラグの形式は全てTsukuCTF{}です。 この問題のフラグはTwitterのアカウント名です。質問などはTwitterのDMにお願い致します。
公式Twitterのアカウント名かスクリーンネームを入れればいいだけなので
スクリーンネームのほうを入れました。
TsukuCTF{2021}
(今見たらスクリーンネームは2022?
になってました)
digits | Web
コンピュータは高速に正しく計算してくれますが、昔のコンピュータは今ほど正確に計算できないことがありました。現在もハードウェアの故障などが原因でとても低い確率でコンピュータは計算をミスするでしょう。 運が良いあなたならこの問題が解けるはずです。10 桁の好きな数字をクエリパラメータ q に入れて、神に祈りましょう。
同時に次のファイルが与えられます。
from typing import Optional from fastapi import FastAPI import random app = FastAPI() FLAG = "TsukuCTF{}" @app.get("/") def main(q: Optional[str] = None): if q == None: return { "msg": "please input param 'q' (0000000000~9999999999). example: /?q=1234567890" } if len(q) != 10: return {"msg": "invalid query"} if "-" in q or "+" in q: return {"msg": "invalid query"} try: if not type(int(q)) is int: return {"msg": "invalid query"} except: return {"msg": "invalid query"} you_are_lucky = 0 for _ in range(100): idx = random.randrange(4) if q[idx] < "0": you_are_lucky += 1 if q[idx] > "9": you_are_lucky += 1 if you_are_lucky > 0: return {"flag": FLAG} else: return {"msg": "Sorry... You're unlucky."}
プログラムから、q
に0~9
以外の文字を入れることができればflagになりそうということがわかります。
文字列中に-
や+
を入れるのはだめで、type(int(q))
をしたときにint
である必要があるようです。
そこで、pythonのint()のリファレンスを確認してみます。
バージョン 3.6 で変更: コードリテラル中で桁をグループ化するのにアンダースコアを利用できます。
とありました。動いているpythonのバージョンは明記されていませんでしたが「どうせ3.6以降だろ」と思いながら投げてみると
➜ curl 'https://tsukuctf.sechack365.com/problems/digits?q=10_000_000' {"flag":"TsukuCTF{you_are_lucky_Tsukushi}"}⏎
無事flagを入手できました。
TORItsukushi | Misc
大文字文字列 TSUKUSHI を可能な限り何度も取りつくしてください。 残った文字列がフラグです。フラグ内に大文字文字列 TSUKUSHI は含まれていません。
添付ファイルを開くと大量のTSUKUSHI
の文字が羅列されているテキストファイルでした。
CyberChefのFind/Replace
を使ってTSUKUSHI
を消して、出てきた文字列を再度inputに入れる…を何回か繰り返すと
最終的にすべてのTSUKUSHI
が消えてflagが出てきました。
TsukuCTF{Would_you_like_some_fresh-baked_Tsukushi?}
Customization | Misc
Tsukushiくんは自分を鍛えるために、毎日欠かさず活動を行う習慣化を行うことにしました。 マンダラートを利用しますが、晒されるのが恥ずかしいので目標の部分を消してしまったようです。目標を見つけてください。
Tsukushiくんのマンダラートのgoogleスプレッドシートが渡されます。
マンダラートの目標
の部分がどこにあるのかよくわからなかったので、調べてみたら中央の部分らしいです。
該当のセルをクリックしてみると内容の部分にflagが出てきました。
TsukuCTF{yak1n1ku_ta6eta1}
CAD | Hardware
少し早いが筑紫くんと素日華ちゃんは少し早いが今年のクリスマスについて話をしていた。 素日華ちゃん「クリスマス、キーホルダーが欲しいな~」 筑紫くん「いいよ~素日華の好きな動物を模したものを作っちゃおうかな~」 そして、筑紫くんは3Dプリンタで彼女の好きな動物をキーホルダーにして、メッセージも残したらしい。 ※この問題はCADソフトが手元ない場合でも解くことが可能です。
添付ファイルをプリント3Dとかで開いてぐりぐり動かしてやるとflagが見つかります。
TsukuCTF{ILIK3B3ar}
ramen | OSINT
ハッカーにとってラーメンは必須の飲み物だといわれています。写真のラーメン店の本店のインスタグラムIDを特定してください。
ラーメンの画像が与えられるのでグーグル画像検索に投げてみましたが、コーンポタージュしかヒットしませんでした。 しかし、ヤングコーン載せているラーメン屋なんてあまりないと思い、スープの色も独特だったので、
とグーグルで検索すると画像欄にそれっぽいラーメンが出てきました。
どうやら銀座 篝
というお店らしいです。
flagは本店のInstagramのIDだったので
TsukuCTF{kagari_honten}
shop | OSINT
Tsukushiくんはショッピングモールにデートに来ましたが、相手がいなかったことに到着してから気づきました。 帰ろうと思いましたがここがどこかわかりません。動画内に映っているショッピングモールの店舗名を特定してください。
イオンモールが写っている動画で、後半には車道と湖らしきものが映っています。
「湖といったら琵琶湖!」なので、脳死で琵琶湖近くにある「イオンモール草津」を入れてみると正解でした。
TsukuCTF{イオンモール草津}
fishing | OSINT
初めての釣りで楽しみだなー! 友達が先に待ってるらしい。 友達から写真が送られてきた。 あれ、どこだっけ...? 写真の場所を答えて下さい。
画像検索に添付画像を投げてみると「若洲公園キャンプ場」がヒットします。
公式サイトにアクセスしてみると、「若洲海浜公園&江東区立若洲公園」となっていて、 そのうち「若洲海浜公園」をflagに入れてみると正解でした
TsukuCTF{若洲海浜公園}
train | OSINT
画像が撮られた駅名を答えてください。 この問題は5回までしか提出できません。 駅名は東京近郊路線図内に記載されている駅名の英語表記を使用します。 駅名がそのままフラグになります。仮に駅名がKyotoの場合、フラグはTsukuCTF{Kyoto}となります。
東京のことはよく知りませんが、画像と路線図から「京浜東北線」と「山手線」の両方が通っている駅だということがわかります。
また、京浜東北線の電光掲示板の「15:35頃まで通過」を調べてみると、特定の駅で快速が止まらないようです。
さらに、山手線の方面が東京以降モザイクで消されているものの、下に英語でbukuro
と書いてあるので池袋方面であろうことがわかります。
以上の条件に当てはまるものは路線図から「有楽町」と「新橋」だけなので、両方を入れてみると新橋が答えでした。
TsukuCTF{Shimbashi}
train2 | OSINT
今いる駅名を答えてください。駅名は漢字で答えてください。
貰った画像をよく見てみると踏切名?のようなところに「出町柳 9号」と書いてあるのが確認できます。
検索してみると写真を撮っている人がヒットして、メモのところに近くに「元田中駅」があることが述べられています。
よってflagは元田中になります。
TsukuCTF{元田中}
cafe | OSINT
私の彼氏(@7aru7aru)が最近どうやらメイドカフェにハマっているみたいなんだけど、そのカフェの場所が知りたいの! そのお店の公式 HP の URL がフラグです。ただし、もしそのお店がチェーン店の場合は店舗専用 HP の URL がフラグです。
Twitterにアクセスしてフォロー欄を漁ってみると、めいどりーみんの秋葉原中央通り店の子をフォローしていることがわかります。
また、メディア欄を漁ってみるとメイドさんとの写真が見つかり、いいね欄を見てみると先ほどのめいどりーみんの子がいいねしているのがわかります。
他にフォローを漁ってみてもメイドカフェの子のアカウントが見つからなかったことと、めいどりーみんの制服を調べてみると一致したことにより、
「めいどりーみん 秋葉原 中央通り店」であると確信して
TsukuCTF{https://maidreamin.com/shop/detail.html?id=5}
とすると無事正解でした。
OBOG | OSINT
easy sechack365 セキュリティマインドを有した創造的人材を目指しているTsukushiくんは国立研究開発法人情報通信研究機構が実施する、セキュリティイノベーター育成プログラムSecHack365に参加しています。参加したはいいものの、進捗が全くなく、嫌になった彼は修了生が作成したSecHack365非公式サイトを一部改ざんしてしまいました。彼の改ざんした内容を探してください。 ※本CTFはNICT主催の若手セキュリティイノベーター育成プログラムSecHack365の修了生イベントに際して開催されています。
SecHack365非公式サイトにアクセスしてみるとリポジトリが公開されていたので、直近のコミット履歴を確認してみましたが、flagらしきものは見つかりませんでした。
どうしようかなと思って、たまたまデベロッパーツールのコンソールの欄を開きながら†締切駆動コース†のページを開くと、 コンソールログに
Please decode! → VHN1a3VDVEZ7aHR0cHM6Ly9zZWNoYWNrMzY1Lm5pY3QuZ28uanB9
の文字列が表示されました。
base64デコードをかけてやるとflagを得ることができました。
TsukuCTF{https://sechack365.nict.go.jp}
InterPlanetary Protocol | OSINT
大変だ!つくし星に住むエイリアンが団結して地球を侵略しにくる!以下の文字列は、つくし星で使われている特殊なウェブサイトのURLらしい。 このウェブサイトをなんとか開いて、侵略計画を手に入れるのだ!!! bafybeieozcigchzmmpjzlct5eti4xhqexjnolpuehsnk2ckeaiqfqfqilu bafybeifvtvmitvebs6ktbaqqhort2h76xfen4zj65bujq7xos2zzxdvwga bafybeidtzxolknnds6k2ny6s6rgvbm7t7gopwyfgvyblfjdw6m6og2vsxm
何も考えずにbase64に入れても(当たり前だけど)答えは得られず、文字列の頭のbafybei
が共通していたので検索してみましたが何も得られませんでした。
わからなかったので、タイトルでググってみるとIPFS(InterPlanetary File System)というおあつらえ向きのプロトコルが出てきてくれました。
問題文のURLはこのIPFSの形式にそっているものだと推測できます。
braveだとこのURLの形式に対応しているらしいですが、入れるのも面倒なので他の方法がないか探しているとjs-ipfsというサイトが出てきて、
ここでアクセスを試すことが出来そうだったのですが、うまくいかずうーんとなりました。
少し考えてみるとHTTP Gatewayの形式で試していないことに気づき、https://ipfs.io/ipfs/
以下に文字列を入力してアクセスして組み合わせてみると無事flagを入手できました。
TsukuCTF{IPFS_is_the_future}
感想
OSINTは普段解かないので、今回沢山解くことができて楽しかったです。
でも惜しいところまでいって後輩に投げた問題もいくつかあったので、OSINT力(りき)をもっとつけていきたいです。
Web問も数題あったのに全然解けなかったので、CTF全般もう少し積み重ねていきたいです。
TsukuCTF運営の方々ありがとうございました。楽しかったです。