xryuseix’s diary progress

イベント参加記とか,何か進捗でたら書きます

OSINT中心のCTF・TsukuCTF2023 運営参加記

CTF 概要

タイトル TsukuCTF 2023
コンテスト URL tsukuctf.sechack365.com
Writeup URL tsukuctf.org/ctf/TsukuCTF2023
開催期間 2023/12/09 12:20pm ~ 2023/12/10 18:00pm (29h40m)
参加者 701 (昨年度+49)
問題数 39

ちなみに去年のブログはこれです。

xryuseix.hatenablog.com

単独作問した問題の感想

OSINTと言いつつ高度ネトストコンテストになりつつあったので、ちゃんとOpen-Source Intelligenceになるようにしました。

mab

ドメイン調査の基本問題として出しました。ちなみに答えのロリポップを運営するGMOペパボさんはインターンでお世話になりました。ありがとうございました。

ちなみにmab.main.jpは僕がユネスコ関連の講演資料を色々見て問題にしようと思っていた時に見つけたサイトです。

kiZOU

geo問に見せかけて実は場所特定以降が大変な問題を作りたくて考えました。au Style NAHAを隠してバスとかから特定させてもよかったのですが、今年は難易度が上がりそうな予感がしたので(結果的には易しくなったが)普通に表示させました。ちなみに研究発表(研究費沖縄旅行)で撮りました。楽しかったです。

twin

犯罪捜査っぽい問題に対して倫理観を考慮した問題を作りました。

Tsukushi Quine、略してTsuineはいかがでしたか?実は使ってたジェネレータが右下をうまく生成してくれなくて、Fの下あたりは全部手動で作ったので汚くなりました。

また、解いているときにこの二文に違和感を覚えませんでしたか?実は作問当初この二文はなく、かなりの鬼畜な問題になっていました。

我々はこの投稿IDがKL34A01mであるという情報を得た。 Hint: このWebサイトは28歳のオランダ人起業家によって2010年代初めに買収されている。

特に投稿IDの方は最後ギリギリに追加した文章で、理由としてはpastebinの検索回数制限が厳しすぎるためです(10回くらい)。本来は検索させるつもりでした。もしよければ投稿IDがわからなかった場合の解き方を考えてみてください!

> 解法 タグを使ってもらう想定でした。なかなか厳しかったと思います。やめて正解でした。

レビューした問題の解いた過程や感想など

writeupが残ってるものはそのまま貼りました。

big_statue

ドリアン食いてえ

> writeup

broken_display

> writeup

ところでこの画像からロクシタンがどこにあるのか見つけられませんでした:( 小さすぎる。

river

> writeup

Google lensでこのサイトが出る http://nisshindo.jugem.jp/?eid=9

[ここから方針間違えた] 左の看板を調べるとパーラーニューギンというパチンコ屋らしい。HPやGoogle Map(本州にフォーカスを当ててしまって)をググると名古屋のところらしい。名古屋のパーラーニューギンの近くの川が同じフェンス。あれ、さっきの記事では鹿児島って言ってたような...

この川、荒川らしい。記事書いた人のtypoか???近くにパーラーニューギンの本社などがあるが、どれも川に接していない。ついでに左の駐車場のマークを「駐車場 p オレンジ」でググると、d-parkingらしいけど、これも名古屋にある20店舗くらいは同じような川に接していない。 [ここまで話が逸れた]

やっぱり鹿児島にあるんじゃね?「鹿児島 newgin」で検索すると鹿児島にnewginあった。荒田川も記事に書いてある甲突川も鹿児島らしい。あとはGoogle Mapで検索するとあった。ストリートビューでピンポイントの場所は撮れないが、Google Mapでピンを置くと座標が取れた。

https://www.google.com/maps/@31.5756861,130.5533854,3a,37.7y,287.61h,90.05t/data=!3m10!1e1!3m8!1s226Tmm_B9bzN-TqVvQas5A!2e0!5s20160901T000000!7i13312!8i6656!9m2!1b1!2i37?entry=ttu

ちなみにレビューでフラグの範囲をちょっと大きくしましたが、まだ小さかったです。すみません。

travel_with_tsukushi

> writeup

Bangkok
Chennai
Jeddah
Kuala Lumpur

ここからがあまりよくわかっていないけど、Google Mapで見たかぎりKuala Lumpurが一番空港の形がそれっぽかった。けど真ん中の司令塔みたいな建物は見つからず...
とはいえ4つ全部投げれば解けるかなって思いました。

僕は「これmediumでいい気がします。他のeasyと比べると非オタクにとっては難しいです。」

とレビューしたのですが、Google Lensで出るらしい。難易度ミスりましたすみません。

Yuki

EXECpy

これ難易度がeasyとか書いてあって、hardにしました。多分今年の僕の一番の功績これです。

CtrlAltPrtSc

これ元々Youtubeの動画名を答える問題だったのですが、難しいというよりかなり虚無問題でした。フォント特定とかならいいんだけど、ピクセルが合うように調整するのがかなりめんどくさいです。 そこで、本問のように変わったのですが、よく考えたらかなりGuess問だったと思います。問題文をもう少し変えてGuess要素をもう少し減らすべきだったと思います、すみません。

kuni

> writeup まずこれを見て https://ja.wikipedia.org/wiki/%E7%AD%91%E7%B4%AB%E5%9B%BD

こいつがやったっぽい https://ja.wikipedia.org/wiki/%E7%A3%90%E4%BA%95_(%E5%8F%A4%E4%BB%A3%E8%B1%AA%E6%97%8F)

関連項目にこいつの名前が

筑紫薩夜麻-天智天皇期の人物で磐井の子孫と推測される人物。

少しググる天武天皇=筑紫君薩夜麻 説がいくつか出てくる https://www.ne.jp/asahi/wacoku/tikushi/kicou14.html

歴史問!!!!!レビューが少し大変でした。ちなみに、元の問題文はこれでした。

その子孫の一人が、ある天皇と同一人物である説が提唱されている。 その子孫の名前を TsukuCTF23{} で囲んで答えよ。

これだと最近の全天皇がフラグになってしまうので、少し変えました。

fiction

これeasy問としてかなり好きです。

> writeup

↑後からわかったけど、最後の少し間違っています、フラグがあってるのはたまたまです。

udon_2023

これ4~5時間くらいかかりました。最難関問だったと感じています。Lensの範囲指定がかなりシビアだけどとてもよかったです。解き方は公式と一緒でした。あとうまそうだった。こういう問題は一旦ご飯を食べてから取り組むべき。

sunset

提出回数で議論しましたが、結果的に3回はすごく良かったです。すまん🙏

> クソ長writeup

[工藤OshioNTパート]

  • TsukuCTF "shio"で検索
  • https://ctftime.org/team/157513/ のshioユーザから"Shio Kudo"が出てくる
  • Shio Kudo Security で検索すると"工藤 蒔大"が出てくる
  • "工藤 蒔大 イベント"などからセキュリティキャンプの情報が出てくる
    • (が、これは僕が新潟なんじゃないかと決め打ってるのでわかるのであって、本来はここからキャンプだと断定できない。せめて何月のイベントという情報が欲しいです。)(と思ったが、まさかこの伏線がこの先で回収されるとは...!!)

[画像OSINTパート]

[時刻OSINTパート]

  • 工藤 蒔大 新潟と検索してキャンプとわかり、開催日が9/10とわかる(問題文的に前日・翌日であることはなさそう)。
  • https://hinode.pics/ で調整する
  • 日の入り時刻が18:02&誤差が1分なので、その直前の偶数分(18:00,17:58, 18:56, ...)を10回程度やれば解けるなぁ
  • ここで、画像を見返すと日の入り直前であることがわかる
    • あれ、場所間違ってる????
    • 展望台の前あたりにカーソルを合わせる
  • これを参考にすると太陽が地平線に接してから沈むまで約2~3分かかる
  • 太陽をよく見ると、下の雑な図より、18:02の4~6分前だとわかる

hunter

メールアドレスの存在確認で僕はtelnetを使いました。

content_sign

C2PA toolとかで検索するとすぐ解けました。

grass court

数時間見て解けませんでした。天体望遠鏡がわからなかったです。

eruption

Exif見るだけでしたね。

コンテストの様子(写真集)

おわり。

Open xINT CTF 2023 簡易writeup

全体的な感想

去年2位だったので、今年は(個人戦なので)6位以内に入ることが目標でしたが、14位と惨敗でした。HUMINT,SIGINTが解けなかったことを加味して1問以上いずれかを解いている人を除いても10位でした。

最初2時間ほぼ1位だったのに途中3時間+0点の時間があったり、反省点が多めです。

個人的に面白かった問題はBitcoinとOtokichi(解ききれなかった...!!)、微妙だった問題はREVERSE AIです。REVERSE AI、これなんか思いついた以外のちゃんとした解き方あるなら誰か教えてください。あるなら良問です。

問題の簡単な解説

Amusement(GEO) (2nd blood)

Google Lensで一発です。

Esta rico!(GEO) (1st blood!)

メニュー名でググる食べログが出てきました。

(画像出典: Open xINT CTF 2023)

mural(GEO)

(画像出典: https://iranprimer.usip.org/blog/2022/feb/09/irans-revolution-43-politics)

Lensかけるとイランのテヘラン付近とわかり、もう少しググるといろんな角度の写真が出てきます

https://www.flickr.com/photos/ninara/41361150950 https://courrier.jp/news/archives/165911/

ほかのサイトにこの隣の建物の名前が書いてあったのでそれググりました。

https://www.aretenews.com/iran-nuclear-deal-widens-us-europe-rift/

neko(WHOIS)

これ

https://vnnic.vn/en/whois-information?lang=en

BUS(BUS)

バスを見ると日光行きであることがわかり、写真の右下に国道122番であることもわかって、雰囲気日光付近じゃなくてカーブがあって、足尾のあたりから同じような柵がみつかって、壁が似てる感じで速度表示があるところで探すと割とすぐ見つかりました。

(画像出典: Open xINT CTF 2023)

https://www.google.com/maps/@36.6761644,139.4841763,3a,75y,284.95h,90.69t/data=!3m9!1e1!3m7!1s0Kr24KsN363GIhz8QSgUyw!2e0!7i16384!8i8192!9m2!1b1!2i37?entry=ttu

Aircraft(MISC)

Lensで2, 3個似てるのが出てくるので、全部入れたらどれか当たりました。正直飛行機は全部一緒に見えるのでしんどいです。

Bitcoin(CRYPTO)

ググると最近Bitcoinを大量に盗んだ人らしいです。

https://www.justice.gov/opa/press-release/file/1470211/download

「Dutch Ilya Lichtenstein bitcoin address -news」で検索すると

https://21shares.com/research/onchain-insights-3

がでてきて、そこに書いてありました。

セキュリティ・ネクストキャンプ2023 応募課題晒し

応募課題はこちらに記載されています.また,内容は少しいじりました.

https://www.ipa.go.jp/jinzai/security-camp/2023/next/ps6vr7000000c62g-att/next.txt


以下について,フリーフォーマットで自由に記述し回答してください.

選考のポイント

基本として、加点法で判断します。 自身の技術力ややってきたこと、発信してきたこと、何ができるかといったことなど、アピールしたい点を存分に記述してください。 多く書くことにより、「文章が長過ぎる・まとまりが無い・重複している・冗長」などとして減点するようなことはありません。 失敗した経験や落選の結果を書くことや、「文章が洗練されていない」「誤字脱字がある」などによる減点もありません(文章や作文のテストではありません。内容を見ます)。 アピールをいっぱい書いて、得をすることはあっても、損をすることはありません。自身がアピールしたいことを思い付くままにいっぱい書いて、アピールしてください。 いかにやる気があるか、参加できたらいかに頑張ることができるか、ということを「示して」ください。「やる気があり、今までこうしたことをやってきています」「このようにいままでずっと手を動かしてきています」「こういったものを作ったことがあります」「今までこのような活動を継続してきています」ということを書くといいでしょう。それが、やる気を証明することになります。 課題については、課題が解決できたかどうかの○×や正誤で判断するのではなく、いかに自身で疑問を持ち課題設定するか、その課題を解決しようとする過程や未知のことにどのように取り組むか、新たなことに挑戦しようとする姿勢を見ます。 このため課題は解決できなくても構いませんし、正答にたどりつけなくても構いません。課題に対する正答を求めているわけではありません。途中経過でも構いませんし、自分なりの考えでも構いませんので、いかに取り組んだか、難しい課題にこのように取り組んでここまではわかった、自分なりにこう考え、こういうことを調べた・試した、自分はこう考えこう思ったという、その過程を書いてください。自身のできる範囲で課題設定して回答するのでなく、ぜひ今まで知らなかったものに挑戦して、その挑戦の過程を書いてみてください。その結果正答でないとしても、それは挑戦しているためとして判断します。 手を動かしてみてください。ネット検索で調べたことを張り付けるだけではなく、本当にそうなのかという疑問を持ち、自分で手を動かして、見て、試し、調べ、確認し、本当にそうなのかと深堀りして考えてみてください。ネット検索で出てきたことは、はたして本当なのでしょうか︖ 深堀りして理解し納得できているでしょうか︖ 疑問点や矛盾は無いでしょうか(矛盾があるとしたら、その原因はどこでしょうか)︖ 自分の眼や手で確認したでしょうか︖ 他人に説明できるでしょうか︖ そして、そうしたことを書いてください。課題解決に対する、そのような姿勢を見ます。

■ あなたに関する問い

あなたは今までどのようなことをやってきましたか.どのようなことができて,どのようなことが得意で,どのようなことに自信がありますか. どのようなものを作りましたか.どのような情報を発信してきましたか. どのようにしてそうしたことをやってきましたか.なぜ,そのようなことをやってきましたか.やってきてどう思いましたか. 参加できた場合,セキュリティ・ネクストキャンプにどのようなことを期待し,どのようなことをやってみたいですか.

中学2年のときに友人から誘われ、コンピュータ部に入ったことが、私がコンピュータを勉強した最初のきっかけです。最初はPRGツクールというゲームエンジンを勧められ、色々な2次元平面のRPGゲームを作っていました。入部してから半年ほど経った時、RPGツクールは基本的な操作がある程度できることから、頑張ればRPG以外のゲームも作れるのではないかと思いました(この時点ではチューリング完全という言葉を知りませんでした)。そこで、パズルゲーム、横スクロールアクションゲーム、3Dゲーム、リズムゲームなどをかなり力技で作りました。その後チューリング完全という言葉を知り、調べるとPowerPointExcelなどもチューリング完全であることがわかり、興味を持ちました。PoworPointでストリートファイターのようなゲームを作ろうともしました(結局1種の攻撃とHPゲージしか実装できず、遊べる程には完成しませんでした)。中学3年の時に、初めてプログラミングを始めました。最初はC言語クイズゲームを作成し、文化祭で展示しました。当時は両親に3万円で買ってもらった、起動に20分かかるPCで、Dev-C++という古いエディタを使って開発していました。この時にブックオフで買った100円のC言語入門本を擦れるほど読んだ記憶があります。 高校に入ってから体系的にコンピュータサイエンスを学びたいと思い、ITパスポートを取得し、そのまま応用情報技術者まで取りました。応用情報技術者ドットコムというサイトでAPの午前過去問を学習できるのですが、応用情報技術者の午前問題は4択問題なのでクイズを解く感覚に近く、これを解くことが趣味になりました。過去問5000問全て一度以上正解し、問題を正解すると表示される王冠が並んだ光景が非常に好きでした。また、AIZU ONLINE JUDGEの問題を解いたり、情報オリンピックなどに参加したりなどもしました。

大学に入ってからはまず競プロとソフトウェア開発に熱中しました。競プロでは毎週3,4個の海外のコンテストに参加し、累計で3000問くらい解きました。2020年のICPCでは国内予選を突破し、アジア地区予選まで行けました。これらの能力を活かし、p社でアルバイトもさせていただき、競プロに近い問題を200問ほど作成しました。開発では高レイヤのソフトウェアを主に作っていました。自分が普段不便だと思ったことを解決することが基本的なモチベーションとなっていました。例えば、競プロの問題文用のlinter、大学のwifiに自動で接続するソフトウェア(当時の立命館大学wifi接続はWeb認証があり面倒だった)などを作りました。大学二年生以降はWebアプリケーションの方により興味を持ち、自分のWebサイトだけでなく、ハッカソンなどでいくつかのWebサイトを作成しました。 また、Seccamp全国大会2019をきっかけにセキュリティの分野にも興味を持ちました。最初に興味を持った分野は映画「イミテーション・ゲーム」の影響で、暗号でした。実用的ではなくとも新しい暗号を作成することに興味があり、Seccampでは自作暗号を実装しました。そして翌年にはSecHack365にも参加しました。SecHack365では、競技プログラミングにおけるソースコードの盗作検知を目標として、研究駆動コースに参加しました。SeccampとSecHack365の参加で得たものとしては、技術的なものより、多くの人脈を得られたことの方が大きかったと思います。それぞれの同期とは今でも連絡をとっており、一緒に勉強会を開いたり、プライベートでも仲良くしています。特に、2020年にはSecHack365の同期とTsukuCTFというCTFを開催したり、AVTOKYOのスピーカーなどをさせていただきました。AVTOKYOでは、普段zoomを使っているときに「バーチャル背景を使っているときに、顔の横に少しだけ部屋が映る。顔が動いたときのこれを集めると部屋が復元され、プライバシーが守られないのではないか」という疑問を持ち、共同研究を行い発表しました。この研究は最終的にICSS研究会で研究賞まで戴けました。

大学3,4年では主にオフェンシブセキュリティと前述のWebアプリケーション開発に興味がありました。特に、CTFに熱中していました。一年弱、毎週土日に欠かさずCTFに参加しました。最初は1問解くことに精一杯でしたが、気づいたらいくつかのCTFで上位入賞できるようになりました。また、大学生のうちは1つでも多くの挑戦をすべきだと思うようになり、唐突に何かを始めることが増えました。例えば、大学3年の夏に物理錠の仕組みに興味を持ち、2週間弱東京に行き2級鍵師を取得してきました。また、大学4年のときに、セキュリティの国際会議で最近の業界の動向が知りたくなり、CODE BLUEに学生スタッフとして参加しました。他にも、集団開発や実世界のセキュリティ業界の業務を学ぶためにr社でのアルバイトを申し込みました。当時はアルバイト募集がされていませんでしたが、どうしても働いてみたかったため、会社のお問合せフォームで働きたい旨を伝えたら承諾していただけました。さらに、唐突に監視カメラやデジタル時計が作りたくなって初めてラズパイを購入し、カメラモジュール、ディスプレイモジュールなども買ってきて半田付けして作ったこともあります。

私は今後、ソフトウェアに対するハッキングと開発の両方ができるエンジニアになりたいと考えています。開発がある程度できないとハッキングに対する深い理解が期待できません。また、ハッキングができないと開発においてもセキュリティを考慮した設計ができないと考えています。現状どちらかが卓越しているエンジニアは非常に多いですが、両方とも卓越していると言えるエンジニアは数少ないと感じます。そのために私は、セキュリティネクストキャンプを通して、ハッキングや開発に関する知識を少しでも多く吸収したいと考えています。それだけではなく、ネクストキャンプでは同じように向上心を持ち、互いの知識や考えを共有し、切磋琢磨できる仲間が作れることを期待しています。

■ 課題への姿勢に関する問い

自身で何らかの技術的な疑問を設定し,その疑問を解決しようと取り組み,その過程を示すことで,自身の技術力や課題に取り組むやりかたを説明してください. (疑問の例:実行ファイルはどのような構造になっているのだろう? lsコマンドは何をしているのだろう? pingコマンドを実行すると何が起きるんだろう? といったようなことです) 設定する疑問は何でも構いませんし,解決しなくても構いません. 解決できたかどうかではなく,いかに課題に取り組むかという点を評価します.

前述の通り、大学3年のときからCTFに熱中していました。私は特にWebとOSINTを解いていました。その中で、OSINTのアカウント特定系の問題を解くためのテクニックとして、Webサービスのパスワードリカバリ機能に調査対象のアカウント情報を入力するというものがあります。第三者がパスワードリカバリ機能にユーザIDを入力すると、通知先であるメールアドレスや電話番号の一部が表示されることがあります。また、メールアドレスを入力すると電話番号の一部が、電話番号を入力するとメールアドレスの一部が表示されることもあります。これにより、アカウントIDからメールアドレスの一部が入手できるだけでなく、二つのアカウントが同一人物が所持するものなのか判断する手掛かりになります。 私はこのテクニックを用いて問題を解いている際に、もし調査対象者が多数のWebサービスを登録している場合、ユーザIDや電話番号・メールアドレスからパスワードリカバリ機能を通じて、電話番号やメールアドレスが完全に復元されてしまうのではないかと疑問に思いました。パスワードリカバリ機能で表示されるメールアドレスや電話番号の一部分はWebサイトによって異なります。例えば、メールアドレス「hogehuga@gmail.com」を用いてTwitterInstagramに登録し、パスワードリカバリ機能でユーザIDを入力した場合、Twitterは「ho@g」が表示され、Instagramは「ha@gmail.com」が表示されます。これらを組み合わせると、「ho*a@gmail.com」まで復元できます。このように、Webサービスによって開示される箇所が異なるため、調査対象者が多数のアカウントを所有している場合に限ってこれは脅威になりそうです。実際、私は累計100以上のサービスを使用しています。そこで、この問題が実際にどれくらい脅威となるのか、また防ぐ方法はあるのか疑問に思いました。以降、この攻撃を通知先情報復元攻撃と呼びます。 (略,詳しくは論文読んでくれ) また、この問題に対する対策手法を考察しました。この問題はメールアドレスを入力したにもかかわらず電話番号の一部が表示される(逆も然り)ことが原因でした。そのため、Webサービスの運営者はパスワードリカバリ機能において、メールアドレスが入力された場合は通知先としてメールアドレスを、電話番号が入力された場合は通知先として電話番号を表示すべきです。ただし、ユーザIDが入力された場合はメールアドレスのドメインのみを表示する、そもそも何も表示しないなどの対策が考えられます。また、ユーザは登録するメールアドレスにコメントやエイリアスを使用するなどして、パスワードリカバリ機能を用いた通知先情報復元攻撃に脆弱なWebサービスに対策することができます。 また、この研究は以下の研究会で発表されたものになっています。https://ken.ieice.org/ken/paper/20230313BCsd/

■ 興味ある分野に関する問い

セキュリティ・ネクストキャンプの講義の一覧を見て,その中から興味のある講義を選び,その講義で扱うテーマに対して自分が考えること,興味,疑問,課題,自分なりの考察などを説明してください. その分野について知識があるかどうかではなく,いかに興味や疑問を持ち,課題を考え,自分なりに調べて考察するかといった点を評価します.

セキュリティ・ネクストキャンプ共通講義・ネクスト講義の中から、特に以下の講義に興味があります。

「K3 サイバーセキュリティと国際政治」 私はOSINTに興味があるため、APTにも興味があります。特に、最近のトレンドとしてロシアのウクライナ侵攻に関するサイバー空間上・認知空間上の攻撃が非常に興味深いと考えています。また、これらの攻撃に反応して、義賊のようなハッカーも現れるようになりました。例えばAnonymousがロシアの国営放送をハックしたり、一般の個人ハッカーもロシアの企業にDDoSを仕掛けているところを複数観測しました。ところで、これらの戦争を仕掛けた国への第三者からの攻撃は犯罪なのでしょうか?仮に国に対する攻撃は認められたとして、その国に所属する企業への攻撃は行なっても良いのでしょうか?本講義でこのような疑問を解決する手掛かりが得られればと思っています。

「N2・N12 低レベルGPUプログラミング」

私は以前、機械学習モデルであるCNNを標準ライブラリのみで実装し、CPU上で動かしてみたことがあります。その際、素人が特に工夫もせずに実装し、動かしたコードは異常なほど遅いことを実感しました。そこで、外部ライブラリを用いてGPUを使ってみたところ、それだけでとても早くなり感動した経験があります。本講義ではGPUの内部構造にまで着目したGPUソフトウェア実装を主軸とされています。この講義を学ぶことで、よりGPUの特徴を理解し、我が家のGPUを最大限活用できるようになればと思っています。

「N4 TDD+モブプログラミング」

私は普段からTDDに興味があり、アルバイト先や個人開発でTDDを取り入れています。最近は特に、firebase関連のテストを書くことが多く、VitestやMochaをよく使用します。また、モブプログラミングはハッカソンで時々使用します。特に、アプリケーションの設計やベースとなる機能の実装において、モブプログラミングを取り入れることが多いです。しかし、私はモブプログラミングでTDDを取り入れたことはなく、単体でやったときとの差分が気になりました。例えば、プロダクトコードとテストコードで、ドライバーとナビゲーターを入れ替えればより網羅性のあるテストが書けるのではないかと非常に興味があります。

「N7・N11 競技自作入門」

私はCTF、ハッカソンプログラミングコンテストなど、様々なコンピュータ系の競技に参加してきました。そのいずれも遊んでいるような感覚でさまざまな学びが得られました。今までは、既存の競技の主催者として、CTFやプログラミングコンテストを実施してきました。しかし、自分で競技を作るという経験はありません。また、私は競技のルール上の穴を見つけたり聞いたりすることが好きです。例えば、以前ネクストキャンプで実施されていた、LANケーブルに物理的にノイズを入れた状態でファイルをできるだけ送信する競技で、競技のコンセプトとしては再送処理や誤り訂正などを工夫したプロトコルを考案するものとなっているにもかかわらず、片っ端からファイル送りまくるプロトコル(?)の成績が良かった、という話が非常に面白かったです。本講義を通じて、自分で公平で面白く、学びになる競技を作ることの難しさや楽しさを体験したいと思っています。

■ その他に関する問い

その他,アピールしたい点などあれば自由記述で回答してください.

「興味ある分野に関する問い」では興味のあるものを4つピックアップしましたが、今年は特に面白そうな講義が多く、このような機会はなかなかないと思います。今まで培った知識や経験を活かして、より多くのことを学べればと思います。Seccampの5日間、コンピュータセキュリティのみに熱中できることを楽しみにしています。

セキュリティ・ネクストキャンプを修了しました

ネクストキャンプについて

まずはネクストキャンプってやつを紹介します。

www.ipa.go.jp

セキュリティ・ネクストキャンプは、セキュリティ・キャンプ全国大会に対してさらに高度な教育を行うための特別プログラムです。 参加可能な年齢の上限を25歳に引き上げ、セキュリティ・キャンプ全国大会の過去の修了生も参加可能として、若干名を募集します。(ただしセキュリティ・キャンプ全国大会との併願は不可) 参加者は、受講料や教材費などの負担なく参加することができる点は、セキュリティ・キャンプ全国大会と同様です。 用意された講義は多分野に渡り、さらに高度なものになっています。 既存の価値観にとらわれないことで新たな脅威に先取りして備え、セキュリティの多様なシーンに対応し、新たな価値を生み出していけるトップオブトップの人材を発掘・育成します。

というですね、とにかくヤバめなイベントです。しかも講義内容が幅広すぎてどうみても一人では対応できない意味不明な難易度でした。

応募課題も厳しくて、僕は7日くらいかけて書きました。別のブログで応募課題は晒します。あと、枠は10人で受付番号70番位で受かっている人がいたので、倍率は7~8倍なんじゃないかなぁ......

セキュリティ・キャンプ全国大会2019(not ネクスト)の話

2019年度の全国大会ではXトラックの暗号化通信ゼミに参加しました。このゼミはなんでもいいから暗号や通信に関する好きなものを実装してみてその仕組みを理解するゼミです。僕は当時ほとんど開発経験がなく乏しい状態でしたが、応募課題で講師の緑川さんに「自分で考えた暗号方式があって、これが良さそうなら実装してみたいです!!」って熱意をいっぱい書いた覚えがあります。

結果的に実装も案も拙いものではありましたが、その時に学んだ綺麗なコードの書き方、世の中の暗号の仕組み、論文の読み方・書き方など今でも通用する多くの技術が学べました。

また、あの時は全国の受講生だったのに、今では10人しかいないネクストの受講生にまで来れて、緑川さんや当時チューターだったお二人、ゼミの仲間には本当に感謝しています。という話を(ネクストの講義と講義の間のあまり時間がない中)緑川さんに軽くお伝えできてよかったです。

1日目から5日目

1日目

つきました!着いたので一枚、スポンサー多い!w

まずは飯、うますぎ(ちょっと多かった)

スポンサーのおかげで毎年恒例のお水見れました!!

そして今年は4年ぶりのスイーツパーティ!!!企業さんや他の受講生との交流ができましたが、15分くらいしか時間がありませんでした......😭

あ、これ夕食でした。4年前と違って最終日以外の夕食も豪華でした!

2日目

朝・昼・夜情報です。

2日目の講義はそんなに難しくなく、終わった後はぐっすり寝ました。

3日目

朝・昼・夜情報です。ここら辺で朝のお茶漬けうめ〜〜〜〜ってなっていました。

3日目から難しくなってきましたね。特に4日目の競技自作入門の準備やCanSatの準備で夜は大変でした。

4日目

昼・夜情報です。朝は眠くて撮り忘れました。鶏肉が最後焼けなくて(ろうそくみたいなので焼くタイプだった)少し残したのが悲しかったです。

5日目

朝は寝坊して食べれませんでした。

というのも、この日は朝8:30から講義で移動だったにもかかわらず、前日(というか当日)3時か4時ごろまでCanSatのコード書いてたら寝坊しました。マジですみませんでした。 でも前日の夜だけで全然動かなかったプログラムがある程度考えて動くようになり、非常に面白かったです。最終日のレース(?)もなんかなんとなくいい感じに動いている気がしたようなしなかったような気がします。

そして修了証!!!!!かっこいい!!!!!!!!経済産業大臣のサインいただき!!!!!!!!!

2019年に修了した時の修了証は今でも自室に飾っているので、これも飾ろうかと思います!

講義に関して

N1・N13『学んだ技術の本質から魅力や価値を引き出そう』

本講義は他のネクストキャンプの講義で得られた知識をより活かせるようにするための講義でした。特に、N13の方では自分の得意な技術、好きな技術からそれをどのように組み合わせることができるのか考察し、それを実現するためにはどのような技術が必要なのかを考えることができました。また、その組み合わせたり追加したりした技術から、どのようなプロダクトが作れるか検討し、発表しました。

N2・N12『低レベルGPUプログラミング』

個人的に一番面白かった講義でした。多くのエンジニアは普段CPUを使ったり、CUDAなどあまりGPUのことを意識せずにプログラムを書くことが多いです。しかし、本講義ではGPGPUへ直接命令を書いたり、GPUメモリを直接操作するなどして高速に処理できるGPGPUプログラミングを学びました。また、GPUの仕組みや、今のGPUが出来上がった歴史についても学びました。本講義の特に面白かった点としては、N12の最後の方に行われた講師によって与えられたプログラムをどのように書き換えたら高速になるか検討できたことです。話は少し変わりますが、僕は以前競技プログラミングを頻繁にやっていました。競技プログラミングで定数倍高速化を行うことはよくあると思いますが、本講義はGPGPUプログラミングで定数倍高速化をする話だったので、より奇抜な発想が必要になるテクニックが必要で面白かったです。 具体的にはネクストキャンプ成果発表会で説明した、以下のコードを高速化するテクニックを学びました。最初のコードは元のコードの抜粋で、r3rotateしてからr4r5の積をr0に、rf[i-1]r0の和をrf[i-1]に入れています。

for i in range(0, 16):
    rotate(r5rep, r3, -i)
    fmul(ro, r4, r5)
    fadd(rf[i-1], rf[i-1], r0)

しかし、0 bitのrotateはする必要はないこと、またfaddfmulは合わせて1ステップで実行することができることを利用しました。また、このコードは4重ループの一番深い箇所のコードだったため、約0.3Gflops早くなりました。

mov(r5rep, r3)
nop().fmul(r0, r4, r5)
for i in range(1, 16):
    rotate(r5rep, r3, -i)
    fadd(rf[i-1], rf[i-1], r0).fmul(r0, r4, r5)
fadd(rf[15], rf[15], r0)

techbookfest.org

N3・N9『オリジナルCPUを創る』

本講義では事前に与えられたCPUの命令セットで、かつプログラムカウンタが4bitしかないCPUでどのようなプログラムが作れるか検討しました。また、後半では新しくどのような命令を追加するとより便利なCPUになるか検討しました。本講義で面白かった点として、他の受講生がPC(プログラムカウンタ)を乱用(?)していたところです。まず本CPUではリテラルの作成が大変です。そのため、リテラルXを作るためにPCをXまで進めてPCの値をACCにmoveするなどして命令長を極端に短くしていました。

monoist.itmedia.co.jp

N4『TDD+モブプログラミング』

(ここら辺で執筆する指が疲れてきた) 本講義ではTDDとモブプログラミングを同時に使用してソフトウェアを開発する方法を学びました。本講義では特に、頭の中に浮かんだ設計を他人に伝えるということが非常に難しく、ドライバは適度に抽象度の高い説明をしつつ、具体的は説明はしないということが重要だと学びました。

N5・N8『SimHでPDP-7ベアメタルプログラミング』

本講義は2番目に面白かったです。本講義では1960年代のコンピュータであるPDP-7をSimHというシミュレータを用いて実行し、コンピュータの仕組みについて深く学べる講義でした。また、今のUnix系のコンピュータがなかったらどのようなコンピュータができていたか検討しました。SimHというコンピュータではベクタスキャンディプレイという今とは全く違う形式のディスプレイを使っており、そのディスプレイを使って図形を描く楽しさを知ることができました。

yuma.ohgami.jp

N6・N10・N14『CanSatをはじめよう』

本講義では空き缶サイズの模擬人工衛星であるCanSatを制御するプログラムを書きました。CanSatGPS、ジャイロセンサ、地磁気センサなど様々なセンサがついていますが、そのどれも精度が低くて制御が大変でした。深夜にデバッグしまくってどうにかなんとか動いたような動かなかったようなものができて面白かったです。

CanSatを散歩させているの図

↓深夜ソロデバッグの図(割と楽しかった)

N7・N11『競技自作入門』

本講義では新しいセキュリティ系の競技が作れないか検討しました。僕は鍵を開錠する時間を競う競技と、宝探しとOSINT CTFを混ぜた競技を提案しました。後者を実際にやってみて課題は多かったものの、概ね楽しく実施することができました。

(こんな感じの写真を使いました)

講義以外に関して

LT会

1日目の発表でした。発表当日の朝電車の中で書きました。まさかセキュリティ業界のプロ200人くらいの前で話すとは思わず、少し驚きましたが、発表慣れしてきたのか思ったより緊張せずに落ち着いて話せました。2019年の成果発表の時はガチガチに緊張したのに......

会場ではウケを狙ったスライドで結構笑いが起きて、非常に有意義な時間でした。

speakerdeck.com

終わりに

セキュリティ・ネクストキャンプは君を待ってます!!!!!!!

youtu.be

応募課題とか全国大会どのコース行けばいいとか相談いつでも乗るのでTwitterとかで連絡いただければ...!!

↓あと、これは目元を隠したら怪しい人っぽくなった俺です

終わり

CODE BLUE 2022に学生スタッフとして参加しました

CODE BLUE

世界トップクラスの専門家によるセキュリティカンファレンス 「CODE BLUE」に参加してきました。

codeblue.jp

こっちじゃないです。

学生スタッフ

やることはここに書いてあるので省略します

yoshistl.hatenablog.com

応募

なんかポエムを書きました。SeccampやSecHackでも書いてきたので、実質ポエマーです。

技術面でやってきたことや、接客経験などをここに書きました。僕は昔、白髭のおっさんがチキンをシバく企業*1で接客業のアルバイトをしていたため、技術の話だけではなくそのへんのことも書きました。

-1日目

当日に気づいたのですが、0日目は13時集合で、僕は朝7時くらいに家を出ないと行けないらしく、辛いのでホテル取って前々泊をしました。0日目は結果的に結構疲れたので、ホテル取ってよかったです。

0日目

会場は渋谷駅から徒歩5分圏内の渋谷PARCO 10階・18階でした。

CODE BLUEに参加してくださった方々はよくわかると思うのですが、会場分かりにくかったです。(渋谷PARCOの本体?は9階までのエレベーターしかなく、僕らは10階に行きたかったので...)

1日目

学生スタッフの業務開始です。両日共通して、朝8~9時は一階の案内、それ以降は10階の案内をしていました。

一階は特に「会場どこやねん」みたいな質問をいただくことが多く、英語でお話しできて楽しかったです。しかし自分から話しかけることができず、来年こそはもっと積極的に行きたいなと思いました。

10階ではエレベーター前あたりにいました。

(今まであんまり顔出してなかったけど、色んなとこで顔出ちゃってるしまあもういいかなって気持ちです)

途中の休憩時には緑川志穂さんの講演も聞けて、非常に楽しかったです!

緑川さんは3年ほど前、セキュリティキャンプ2019の集中開発コースで事前学習?数ヶ月間+会場で5日間お世話になりました。僕はキャンプがきっかけで今の方向に進めていると思っているので、緑川さんの帰り際に軽くお話しして、感謝を伝えられて本当に良かったです。

なんかもうこれだけでCODE BLUE来て良かったな〜って気持ちになりました。

その後仲良くなった方々と居酒屋へ...🍺

2日目

この日は起床が一番大変だったかもしれん。

でもこの日は朝から部屋が賑やかで楽しかったです。

CTF for Connected Cars

codeblue.jp

また、1日目からCTF for Connected CarsというCar Hackingに関するCTFに出ていました*2。もともと名古屋大学の先生経由でMsYさんに誘っていただいて、出張扱いで参加してくれないかとのことで受諾しました。

名古屋大学からの出張という扱いなので、弊学の研究室の教授*3や、学部長などの許可が必要で想定より大変でしたが、上原先生や秘書さんがかなり親身に協力してくださったおかげで参加することができました。

しかし、前々日のこと

例年CTF会場と講演会場が分かれていたため(※らしい)、会場のチケットを持っていなくてもCTFに参加することができました。しかし、今年はコロナの影響もあって会場があまり大きくなかったため、CTFへの参加はCODE BLUEのチケットが必要でした。CTF運営とのコミュニケーションがスムーズではなかったため、このようになってしまいました。

さらに会場参加のチケットはすでに完売していたため、CTF参加メンバーのうち、会場へのチケットを持っていたのは学生スタッフの僕だけでした......

そこで、僕は会場の中から会場でしか知り得ないこと、会場の雰囲気や会場に置かれてる機材の情報などをチームメンバーにDiscord通話などをしながら共有してました*4

チーム7人中6人がオンライン*5という形でしたが、俺以外強強学生チームだったのでなんと2位になり表彰いただきました!!!

ちなみにチーム名の由来は、docker runとチーム全員が博士行く予定*6*7なので、こうなりました。

僕は一問も解いてないのに、ネットワークパーティ前に皆さんの前で表彰までしていただきました*8。ところで、一問も解いていないCTFで壇上に立って一言喋る人の気持ち考えたことある???????????*9

After Party

その後、ネットワークパーティでは大量のお酒を飲みながら色んな方とお話をし......

さらにpwcさん主催のafter partyでもお酒を飲み次の日気持ち悪かったです......(一応モザイクをかけてゆくぞ)

3日目(?)

CODE BLUEで仲良くなった方2人とお昼ご飯を食べました。

この日はAVTOKYOもやっていたので、例年の如くOpen xINT CTFに参加しました。

TsukuCTF運営の3人チーム(no yoshimi, no tsukushi)*10*11で参加し、準優勝をいただきました🙏

最後に

今年はCODE BLUEの学生スタッフとして参加しましたが、非常に充実していて楽しかったです。来年以降も学生スタッフ or 参加者 or スポンサー (or スピーカー?)で参加したいなと思いました!!

*1:ケンタッキーフライドチキンってやつです

*2:ちなみに僕は車の免許すら持っていません

*3:上原哲太郎教授

*4:問題を解く上で結果的にあんまり役に立たなかったが、多少の安心感は与えられましたかね...?

*5:会場の近くの貸しオフィスで解いていた

*6:予定

*7:僕は行かない

*8:会場に入れたのは僕だけなので

*9:楽しかったです

*10:AVTOKYOのチーマが「no hack, no drink」なので

*11:yoshimiさんは参加していない

OSINT中心のCTF・TsukuCTF2022 運営参加記

CTF 概要

タイトル TsukuCTF 2022
コンテスト URL tsukuctf.sechack365.com
Writeup URL fans.sechack365.com/ctf/TsukuCTF2022
開催期間 2022/10/22 12:20PM ~ 2022/10/23 18:00PM(29h40m)
参加者 652 (昨年度+273)
問題数 35

単独作問した問題の感想

全体的に以下の点に勝手に、個人的に注意しながら作問しています。

  • ブルートフォースは10回まで(個人的なルール)で、基本的にはスマートに解けるようにする
  • 典型を出すときは必ず学びがあるように
  • 典型じゃないものは正攻法ができるだけ簡潔に、スマートに(lucky_number, Ochakumiなど)
  • OSINTはできることが多すぎるので、ある程度は誘導する
  • できるだけguess要素を作らない
  • 海外ニキでも解けるようにする
  • 去年自分が出した手法と全く同じ手法で解ける問題は出さない(他の運営が出すことはあります)
    • 特に僕のQiitaとかで公開した方法は極力出さないようにしています
  • 答えが確認できる様にする(作問してて確証が持てる様にする)
  • etc...

lucky_number777

What's New in Pythonを読むのが好きだった謎の時期がありまして、その時にこれCTFに使えるじゃんと思って出題したものです。僕の知る限り2通りの解法があってeasyでいいかなと思ったんですが、あんまり解かれていませんね...🙇‍♂️

問題タイトルは去年の続きって感じですが、特に意味はないです。

TakaiTakai

私自身が高所からの特定問題にGoogle Mapの使用をやめて、全部Google Earth Proを使っているので、Google Earth Proが活かせる問題を作ろうと思ったんですが、できず微妙な感じになってしまいました。まあ3Dみたいな問題面白いしいくつか出してもいいかなって思って出しました。

普段から海外CTFでカピッカピの画像にキレている(いいえ)ので、仕返しにカピッカピにしてやりました。どうだ海外ニキたちよ!!!!!

uTSUKUSHIi

最初easyで提案したらny_aさんに「これ絶対ヤバいので最低でもmediumにしろ!!!!!(言ってない)」って言われ、耐えました(udonの悲劇回避)。

ねこちゃんの画像を出題したかっただけです。

というのは半分ジョークで、検索ワードをうまく見つけ出す問題として作りました。いかに「猫カフェ」という単語を導き出せるかって問題ですね。

それにしてもかわいいね。

TsukuCTF_Big_Fan_1 ~ TsukuCTF_Big_Fan_3

複数の問題で話がつながっているアカウント問を作りたくて作りました。

1は無難にやりました。2のドメインはTsukuCTFが保持していることがわかる&&CTF開催前に発見されにくいドメインとして「つくctf.com」を取得したのでpunycodeというややこしい要素が入ってしまってなんかすみません(別に最初から貼っても良かった)。メインテーマ?としてはcrt.shです(ところで、当日朝にcrt.shの鯖の調子が悪くて焦りました)。 3はWayback Machineから作ってます。

FlagDM

GHuntのissueが永遠に消えてない(※詳細は公式Writeupを見てください)けど、GHuntのソースコードを見るとそんなにヤバめのissueではなさそうだったので問題にしようと思いました。また、去年アカウント探すツールを使った問題があまりなく、Google Docsから他のサービスのアカウントが特定できると面白いな〜って思ってまとめちゃいました。 Youtubeがrabbit holeになっていたのはすみません。今すぐ思い出せないんですが、Docs→Map→Youtube or Twitter→Flagって順で、どうにかするとTwitterよりも先にYoutubeが特定できたはずです(writeupお待ちしています)(公式ではYoutubeは触れてなかった気がする)。

Ochakumi

お茶汲み担当の皆さん、解けましたか????????????

自分でWASMのコードを書いてる時、WASMの中にGitHub secretレポジトリのレポジトリ名が入ってて焦った経験から問題を作りました。onionサーバにするかは結構迷いました。メリットデメリットはこんな感じで、結局使いました

メリット: 一般鯖におけるOSINT手法が使いにくいので参加者の選択肢が減る、インターネット上で捕捉されにくい、来年以降onion問題を作るなら知見として貯められる
デメリット: ネットワークが重い、Torなんて知らん、Tor関連の選択肢が多少増える

Writeup見る限りの雑な感想なんですが、みんなTor使ったことないん...??OSINT解くならかなりデフォで入れてると思ってました。

共同作問した問題の感想

Bus POWER

xINT CTF定番のBus問風で作ろうかなと思って、僕が雑に写真撮ったやつを出しました。shiosa1tくんが「ヤバイけど」解けるとか言ってたので、ボス問のつもりで出したんですが、意外と解かれてびっくりです(左の文字が読めるとかいう人間離れしたWriteupも見ました)。

ところで、Bus POWERは僕自身はすぐに解けなくて、理由としては

  • 車番が同じでも同じルートとは限らない
  • 車番が違ってても同じルートとなることがある

あたりで綺麗な方法がなくて、そんなことしてる間に隣でshiosa1tくんが力技で解いてたので問題名にPOWERを入れました。

Money

パソコン初めて使ったような人でも1問くらい解かせてあげたいなと思って作りました。

Moon

開催3日前くらいまで解法がなくて没にするつもりでした。labo_4423くんが解いてくれました。

labo_4423「やっぱオタクは困ったらTwitterなんよ(笑)」

解けと言われ解法を生んだだけの問題の感想

banana

Google Lensが変な特徴を過度に解釈してしまう?という現象は今までよくあって、今まではトリミングとかしていい感じにやってたんですが、https://cleanup.pictures/ を見たときにこれで特徴量?消せるじゃんってなった記憶がありました。

Momoka「人間を消せ」

あと左の文字が読めるとか言ってる人間離れした人もいて、かなり驚きました。(いや読めないだろ)

Robot

Baidu問のつもりだったんですが、なんかLensで出るらしい。hardタグつけちゃってごめんなさい。 ところで、Baidu問は簡単すぎ or 激ムズしか作れなくて結構調整が大変でした。

レビューした問題の感想

  • Attack_of_Tsukushi
    • もう少しくらい簡単なのあってもいいよね
  • Desk
    • 沖縄いいな〜〜〜〜〜〜
  • douro
    • 情報量なさそうでめっちゃあるのいいね
  • FlyMeToTheTsukushi
    • 窓ガラスの反射で場所が特定されるのは現実でかなりあるので、よさそう
  • Gorgeous Interior Bus
    • 銀座ってここにもあるんか
  • inuyama082
    • うまそう
  • PaperJack
    • TsukuCTF運営は京都や寺社仏閣が大好きなんですよ、マジで
  • sky
    • 情報量ないように見えていっぱいあるね
  • what_time_is_it
    • 最初exifに思いっきり時間が入ってて慌てて消しました。僕の今回の一番の功績です(?)。あとshiosa1tくんが「答えが3パターンから絞ることができないけど、提出制限3回あれば十分だろ」とか言い出しててせめて5にしてって言いました。
  • Where
    • 都会やな〜
  • bughunter
    • 最初はもう少しむずかったんですが、日に日に簡単になるように改良されていました

準備期間

運営DiscordでTsukuCTF作問チャンネルみたいなのを作って、一年間原案になりそうなネタや写真などをそこにストックし続けました。また、いくつかのWebサイトにフラグを仕込んだり色々してたりしました(?)。

また、皆さんお察しの通りOchakumiだけは事前にタイトルを決めていました。ネタ枠です。

他にも「「97人までの参加、猫はチームメンバーに含む」をルールに追加」みたいなTODOもこの時期に決まってました。

そういえば、作問全体では特にフラグ形式に苦労しました。一般的な(?)SECCONのようなCTFでは、例えばWeb問ならWebサーバ内のDBやadminのcookieとかにフラグの文字列があるし、revなら元のソースコード内に直接的・間接的*1にフラグがあります。つまり、フラグは一意であり、運営が用意しています。

しかし、OSINTのCTFではどうでしょうか?Ochakumiやhub been storenなどは一般的なCTFと同じですが、inuyama082やPaperJackなどは違います。フラグは誰か運営とは別の人が考えた/一般的に使用されている(固有)名詞になっていることが多いです。これは表記ゆれが非常に生まれやすい上、作問者が思っている名称は正式名称ではないこともあります*2

そこで、一部の問題(Attack_of_Tsukushi, TakaiTakaiなど)はフラグフォーマットをTsukuCTF22{\x21–\x7e}*3で、かつ一意に定まる地理情報(開業日や郵便番号*4 )にしました。しかししかし(2回目)、正確な地名をフラグにしたい場合はどうしたら良いでしょう?douroとかがこれに当たりました。 open xINT CTFではniceviewという問題に「plus code」が使用されていました。これは天才の発想なんですが僕らはそんなこと知らずに困って困った先、普通に地理座標を使用しました。

しかししかししかし(3回目)、地理座標のフォーマットをどうしたらユーザに誤解を与えることなく伝えられるでしょうか?前回の反省点で、間違ったフラグフォーマットで大量にsubmitされている方*5がいました。長きにわたる議論の末*6、このようになりました。

問題文の末尾

※フラグの形式はTsukuCTF22{緯度_経度}です。ただし、緯度経度は十進法で小数点以下五桁目を切り捨てたものとします。

ルール

座標を特定する問題におけるフラグ形式は問題文に記載のある通り、 TsukuCTF22{緯度_経度} です。ただし、緯度および経度は十進法で小数点以下五桁目を切り捨てたものとします。例えば、日本中央標準時子午線最北端の塔の座標は緯度 35.693098 、経度 135.003078 付近なので、フラグは TsukuCTF22{35.6930_135.0030} となります。また、数メートル程度の誤差が許容されています。

基本的にはdiscordで質問された時に「ルールのこの辺りに書いてあるからちゃんと読め!」って返せるように他のルールも工夫されています。その結果、今年は(提出を監視してた限り)かなりフラグフォーマットのミスを防げたかと思います *7

開発体制

GitHubでmasterから各問題ブランチに切ってPRを作成する形で作っていました*8。レビューは基本的に2人体制で行っていました。そしてGitHubの更新はdiscordにwebhookで飛ばすようにしていました。

DiscordとGitHubの使い分けとしては

  • 問題のレビュー、問題特有のissue(バグなど)はGitHubのPR comment(名前わからん)
  • 他は全部Discord

と言った形で行いました。

後にこの辺りのKPTを行ったのですが、来年はこの辺りの開発体制を一新してより効率的かつミスの少ない仕組みが検討されています。

本番

TsukuCTFは元々Sechack365 Returnsの併催イベントとして開催されています。今年はReturnsがオフラインで開催されたので、僕ら運営陣も東京に集まって運営しました。夜は貸し部屋(名前わからん)を借りて交代しながら誰か1~2人は最低起きていられるようにしました。

次回に向けて

KPTで言うKeep, Tryはみんな興味ないと思うので、特にProblemについてお話ししたいと思います。アンケートでいただいたいくつかの内容について触れたいと思います。

  • 「CTFd上で漢字変換する際に提出されてしまう、そのせいで提出回数制限がある問題で失敗する」→知りませんでした。来年は最善を尽くします。
  • 「上位入賞者へは直接DMを行って住所などをお聞きしていましたが、DMの送信者が本当に運営か分かりにくい*9」→来年はTsukuCTF鯖内で賞品を渡す方々用のチャンネルを作成します。
  • 「Welcome問題がむずい」→CTFerからするとビックリでしょうが初見だと確かになって感じです。もう少し難易度を落とします。
  • 「英語で書いてくれ」→少なくとも来年は今年より時間を割きたいです。
  • 「問題数が多い」→面白そうで解きたい問題だけを解いて楽しんでもらえるとありがたいです!!後述しますが難易度傾斜がかなり緩やかなので、全完された方以外は「あともう少しで解けた」という問題が必ず存在するようになっています。

Q&A

来年は開催するの?

(TsukuCTF 運営ではなく個人の意見です)同じくらいの難易度でしたいです。今年はSecHackからの来年もやってくれってお話をいただいたり、鯖費用以上の寄付金をいただいたりしたので、意地でも開催したいなと思っています。

コンテストの様子(写真集)

おわり。

*1:例えば、フラグを受け取ってハッシュ化すると文字列Xになる場合にその値がフラグです、的な問題

*2:CTF運営=仕事ではないので、対策は全部ベストエフォートです

*3:表記適当ですが、要するにasciiのprintableなもの

*4:郵便番号は範囲が広いけどAttack_of_Tsukushiは九州の僻地だしええやろ的な

*5:上位10チームの中でも結構いらっしゃった

*6:本当に数日議論してた

*7:TsukuCTF{XXX}というミスは結構あった、これは来年への課題になっています

*8:GitHubにお金払ってないのでbranch protectionは設定とメッセージが出ているものの機能していませんでした

*9:フィッシング的な

BaestaMapを支える技術 & 技育展参加記

技育展って?

技育展は、アウトプットの促進を目的とした エンジニアを目指す学生のためのピッチコンテストです。 自らのアウトプット(作品)を展示(プレゼン)し、 もの創りの楽しさ、厳しさ、可能性を知ることができます。 (公式サイトより)

です。あとはTwitter#技育展とかインターネットで「技育展」とかググってください(適当)。

BaestaMapって?

BaestaMap(バエスタマップ)とは、気軽に”映える”スポットを見つけられるサービスです。 最近では、「ググる🔍」ではなく「タグる🏷」が主流になってきています。 おしゃれなスポットを見つけるために、インスタグラムでハッシュタグ検索をする若者も多いです。 しかし、ハッシュタグで検索すると、実際に遊びたい場所よりも遠いところまで引っかかってしまうことがあります。 そこで、本サービスを使用することで、ハッシュタグ検索で引っかかったものを近い順に見つけることができます。 ぜひ、本サービスを使用して、おしゃれで映えるスポットへ足を運んでみてください🐾 (公式説明ページより)

です。

ここのサイトにデプロイされています。

wanwan0622.github.io

他のリンクはこれ

あと一緒に作ったばんぶーさんのブログがこれです。経緯とか諸々の詳しくはこっちをみてください。

bamboo-music.hatenablog.com

それと、これが発表動画です。

drive.google.com


では、そろそろ本題です。このソフトウェアがどのようにしてできたか記載していきます💪

イデア出し

イデア出しは1時間くらい通話しながらmiroでやりました。

なんかよくわからないネタがいっぱい出ています。アイデア出しはアイデアの質よりも量とポジティブな意見を尊重して進めていきました。

最終的には(アイデアとしては)この「デートスポットのsuggest」を採用し、これを中心として仕様を考えていきました。

どのアイデアを採用するかに関して、以下の点を重要視しました。

  • テーマが具体的なものになっているか
  • なんらかの問題を解決しているか
  • 他の既存のソリューションと差別化できているか
  • 楽しく開発できそうか

その他、技術イベントは若い女性が非常に少なく、若い女性目線で(のみ見つかりやすい)なんらかの問題点をピックアップできるのであれば、他と差別化できるだろうと予め話していました。

最初は「女性特有の悩み」の問題点と解決策の考察をしました。案自体は多く出たのですが、以下の点で最終的には採用できませんでした。

  • 生理、薬に関係する問題は大抵「botのリマインダー」で解決するが、それ以上それ以下にはならない
  • 他の問題は物理的なソリューションが多いが、僕らは"ソフトウェアエンジニア"
  • 実際かなり既存のものがある

個人的にこの中だと「生理用ナプキンを持ち歩くのが大変」という問題点に対して、このOiTrってソリューションが素晴らしいと感じましたが、素晴らしすぎて僕らの力でこれ以上のものに発展させることができず捨ててしまいました。

www.oitr.jp

用件定義

以降、ドキュメントはNotionを使用しました。

なんか色々いい感じに便利です(適当)。

まず、メインコンセプトとしてはこのようになりました。

その後、どんな機能を入れるか、そしてそれはどのような技術を採用するか話して議事録にまとめました。

技術選定

今回の最終的な構成としてはこのようになっています。

仕様を決めたタイミング(&アイデア出しのタイミング)でInstagramAPIの調査をしたのですが、「特定の座標から近くかつ#●●ランチのタグがついている」投稿を取得できるAPIは存在しなかったため、自鯖で投稿DBを作ってAPIを立てる必要がありました。

バックエンドに関して、Web REST API、DBが使えればなんでも良さそうです。しかし、中でGoogle Place APIを呼び出す関係で、ある程度高速に処理してあげる必要がありそうです。

また、僕はGolangが書きたい欲で溢れていました💕。そこで、API自体はFunction+Golangでややモダンで高速なサーバーレスAPIを作成し、1ヶ月しか時間がなかったので楽なNoSQLのFirestoreをDBということにしました。

フロントは

ばんぶー「ReactとTypeScriptとNext.jsを使いたい!!!!使ったことないけど!!!!!!!!!」

って言ってたので採用しました(?)まあ基本的によさそうなので。実際かなり時間がなかったので、できるだけ時短になる用に意識していました。例えばデプロイ先はGitHub Pagesを使用したのもそのためです。

開発

フロント

GitHubでいい感じにやりました

github.com

まずFigmaでデザインを決めました。ばんぶーさんがなんかいい感じに作ってくれました。

バックエンド

github.com

バックエンドのAPIは3つ立っています。

  • Get Instagram Posts API (from Coordinates)
    • 主に現在地から投稿を取得するAPI
  • Get Instagram Posts API (from Query)
    • 検索クエリ「サポーターズ本社など」からその場所の近くの投稿を取得するAPI
  • Get Location from Query API
    • JSでGoogle MapをEmbedするときに画像の中心をどこにすればいいんかと言われ、前日くらいに立てた

APIを書くにあたって、Golangはエラー処理がしやすかったり高速だったりと非常に楽でした。Firestoreもcloud.google.com/go/firestoreライブラリを使えば(Cloud Functions内なら)認証情報なしで動いたので非常に良かったです。

インスタ投稿クローラー

めんどいのでPyhtonで書きました。

github.com

データセット作成の流れとしては以下の3手順になっています。

  1. タグを登録
    1.1. 全国の駅名を取得
    1.2. 駅名ランチ、駅名ディナータグをFirestoreに登録
  2. タグからタグIDを取得
    2.1. FaceBook Graph APIig_hashtag_searchAPIを使用しました。しかし、これは週100件くらいで上限がきてしまいます(カス)
    2.2. そこで、instagrapiを使用しました。これはスマホやWebページのInstagram内部APIを呼び出せるPythonライブラリで、こちらなら10000リクエストくらい出来ました。
  3. タグIDから投稿を取得
    3.1. タグから最近/トップ投稿を取得します。これもFaceBook Graph APIInstagram内部APIの両方を使用しています。
    3.2. ついでにタグに対して最終取得日を追加し、あんまり取得していないタグから順にいい感じに取得します。

余談なんですが、baestamap公式Instagramは凍結されました😇

現在15000投稿くらいがDBに保存されています。お近くの場所も保存されているかも??

wanwan0622.github.io

(※もしなかったらそこは田舎、田舎です。はっきり言って田舎です。映えるスポットじゃないってことです。)

運用・保守

なんか書こうと思ったんですが、忘れました。DBの投稿は少しずつ増やして行こうと思ってるんですが、なんせグレーなAPIを使用しているのでよく落ちます。なので自動化はめんどいなという気持ちです。

その他

ばんぶーファンの方へ、こういうことなのでよろしくな👋

あと実はもう一個提出しています。インフラ/セキュリティです。こっちもよろしくお願いします。

それと、女性エンジニアテーマの「RiST Library」チームと同じサークル(RiST)なんですが、深夜に限界開発頑張ってたので見てきました。やっぱりハッカソン前日みたいなのは(見てる分には)面白いね^^

おわりに

次見るブログはこれ!!!!

bamboo-music.hatenablog.com