MBSD Cybersecurity Challenges 2023
この記事はIPFactory Advent Calendar 2023の19日目の記事です
その他の記事はこちら
思い出したら都度色々書き足したりすると思います
備忘録的なものだと思ってください
作ったツール
チーム紹介など
こんにちは。情報科学専門学校1年のhatomatoです。
IPFactoryの1年4人でMBSD Cybersecurity Challenges 2023に参加しました。
チーム名はdelikitchupです。
前回先輩(私が入学した際には既にOB)が優勝していたり、そもそもIPFactoryという名前が大きすぎて背負えないという気持ちがあり、sangoの独断でdelikitchupになりました。
由来はよくわかりません。
過去ログ漁ってたらありました。
ketchupとdelicious合わせて
delikitchup(デリキチャップ)
将来技術力挙げてIPFactoryとして出たいですね。
この記事は丁寧語だったりそうじゃなかったりします。
人はなぜか記事をふざけて書いてしまう…これトリビアになりませんか?
メンバーは以下の通りです
開催概要に関しては公式ページをご参照ください。
1次審査通過したチームと最終審査の結果
競技内容
脆弱性診断をする前段階で診断の規模を把握できるようなクローラーを作る
スケジュール
- チームエントリー受付・課題配布
- 2023年7月19日(水)~ 11月13日(月)
- 説明資料・巡回ツール提出期限
- 2023年11月13日(月)
- 一次審査結果発表
- 2023年11月20日(月)
- 性能審査
- 2023年11月27日(月)~ 12月1日(金)
- 最終審査会(オフライン開催)
- 2023年12月15日(金)
エントリーから提出期限までは4カ月。最終審査会まで含めると5カ月間と長期間でした。
1次審査 競技概要
Webアプリの全容がわかるようなクローラーを作成する
ツール・ソースコード・インストール手順書や操作説明書を提出
操作説明書は開発エンジニアが操作する前提で書くこと
作成したツールの優位性などを示すこと
性能審査 競技概要
クラウド環境上に用意された本番サイトにMBSD{hogehoge}のようなflagがあり、その検出率で評価
運営が指定したドメイン以外にアクセスすると減点
運営がアクセスを禁止したページにアクセスすると減点
ツールで取得できたflagのみ出力すること
1次審査で提出したソースコードの改変は可能(改変した場合は再度提出する)
診断結果は運営が指定したフォーマットで出力すること
最終審査会
オフラインで東京の会場で発表
スライドを作り、性能審査などを踏まえたプレゼンをする
開始前
専門学校に入学してから
MBSDCCとはあまり関係がないので興味なければ飛ばしてください
自分はプログラミング等ほぼやったことがなかったのでなんとなくで人を集めました。とりあえず1年のうちに基本情報は取るつもりでいました。
ちょうどMBSDCCが始まるくらいに基本情報取れたので本当にちょうどよかったです。
人を集める
(先輩かChisenonに言われて?)コンテストについて知り、基本情報取った後のタスクとしてちょうどいいかなと思い参加を決めました。
正直MBSDCCのことはよくわかっていませんでしたがなんとかなるだろうの精神で動きました。
記事執筆時点も大した技術力もなく行動力だけで生きています。
IPFactoryに入るような人ならある程度やる気があるだろうという読みで同じクラスのIPFactoryの1年3人を誘いました。なんかいっぱいいて助かりました。
(上級生とやるのもいい経験になるとは思いますが、)当時は(今も)無知なので、言われるがままやることになると思ったので1年生だけにしました。
(先輩の手柄ででかい顔したくないので…でもsangoの功績ででかい顔はします)
作成したdiscordを見ると5月中旬だったので恐らく5月頭には人を集めていたと思います。
とりあえずCybersecurity Challengesなので徳丸本と脆弱性診断スタートガイドやることを決めました。
使用したツール
- Discord:
- 連絡ツールとして使用
VCを使ったミーティングの実施、タスクの連絡、分報(times)を用意
- 連絡ツールとして使用
- Git,GitHub:
- 鬼門、こいつに2週間は持っていかれたし、未だにわからない
- あとcopilotは神 学生なら無料で使えるので使おう
- VScode:
- 最強
- 色々な診断ツール
- これらを見てどんな機能が欲しいかを話し合った
作業開始
エントリーから
なにもわからん。
本当に何もわかりませんでした。
概要見てもなにを求められているのかわからないんですよね。
とりあえず2021年が脆弱性診断ツールの作成で、期間も同じような感じだったので先輩の参加記を見ながらその用語集を作って基礎知識を学びました。
あれ(よーでんのブログ)や、それ(アルゴリズム弱太郎)やそこにあるリンクを見ていました。
(そもそも参加記がIPFactoryしかない…なくない?プレゼン資料は多少あるんですけどね)
エントリーから1週間後くらいにOBの先輩とお話したのですがそもそも僕らは2021年の記事を見て完全に脆弱性診断をやるつもりでいたので、クローラーだけと知って計画を立て直すことになりました。
おかげで脆弱性診断スタートガイドは今積んでいます。
コンテストの公式ページ見ただけじゃ何言ってるかわからない、そんなレベルでした。
恐らくこの辺りで1次通過が目標になりました。
技術選定
とりあえず形にすることが目標だったのでpythonで書くことを決めました。
先輩の返答からあまりいい選択でないことはわかっていましたが、僕とERUTONEは本当にプログラミングしたことのない初心者だったので仕方のない選択でした。先輩の記事からGoも考えましたがAtcoderをpythonでやっていたのと基本情報B問題がpythonに近かったのでpythonにしました。次は別の言語習得してやります。
スケジュールを決める
先輩の記事を見るとガントチャートがあって、これ進研ゼミでやったとこだ!ってなっていたのですが、そもそも僕らはなにをすればいいかわからないのでスケジュールの決めようがありませんでした。
なので見つけたこと、やらないといけなそうなことを書き出して都度やる形をとりました。
のちの文を見るとわかるのですが継ぎ足し秘伝のたれ形式で要件が増えていきました。
とりあえずクローリングの試作機を作ろうという形になった気がする。
~8月
まずクローラーの試作機を作ろうとしたらコードの書き方がわかりませんでした。
初心者がAtcoderだけでツールがわかるわけがなかった。
requestsやbeautifulsoupの記事を見ていたが仕組みがわからずなにも手が動かない僕に対しsango,chisenonはどんどん理解を深めていっていて圧倒的な力の差を感じた。
ここでsangoにコードを書いてもらって徐々にプログラミングについて理解していきました。
やりながらこんな機能あったらいいよね、と要件を固めてを繰り返す感じで。
この辺りでGitHubに苦しめられていました。
9月
8月中には誰がどの役割になるか自然と決まってきており、それぞれが進めていました。
役割としては
- hatomato:
- プロジェクトを管理。streamlitでフロントを作るもsangoに遠回しに自分で全部書いたほうが早いと言われ以後ほぼ雑用に回る。
- Chisenon:
- 幅広い知見があったので普段からとりあえず彼に相談している。tagの取得機能を作成。
- sango:
- ほぼすべてのコードを書く、僕はコードを見てもどういう構造かわからないが動いているので良し。
- ERUTONE:
- 学校のPCを借りてサーバー立ててもらっていたのだが使う機会がなかった。予備選力がいるというのは精神的な安定にはなったが余っていてちょっともったいなかった。CSV出力を作成。
9月後半くらいから自分がセキュリティミニキャンプうんぬんで追われていたり、そもそもクローラーがいい感じになってきた満足感等で全然進まなくなりました。
人は長期間モチベーションを保つことができない。
10月
10月後半くらいまで1カ月間くらいほぼ進捗がなく、各々好きなことをやっていましたがそろそろやんなきゃなーとなって再開。
この時点でクローラーとしてある程度使えるものができていたので欲しい機能をガンガン追加していくことに。
11月
なんかもう2週間しかなくてやばくね?となり速度が一気に上がり、今まで放置していた改善案などをどんどん実装していきました。
前々日と前日にかなり作業して最終日の朝まで作業していました。
性能検査
フラグをどれだけ早く多く"ツールを使って"とってこれるかのテストでした。
(手動でとれたフラッグをツールでとったように見せかけるとかなり減点貰いそう)
踏んじゃいけないリンク踏んで、ツールの出力ミスっておそらく20個くらいあるフラグのうち8個取れたはずが4個しか出力できませんでした。(本番蓋開けてみたら3つでした)
あと出力の形式も間違えてました。
時間も点数に考慮されるんですが約8時間時間いっぱい使いました。
完全に時間配分をミスりました。
へこみすぎてそこから1週間くらいはMBSDCCの作業(スライド資料作成など)をしませんでした。
最終発表
行ってみたら1番目の発表でした。
早めに終わらせないとご飯喉通らなかったので1番目でよかったです。
性能審査が終わっていてぶっちぎりのドベだと思っていたのですが意外とほかのチームもフラグを取れていなくて安心しました。難しすぎです。
30個強フラグがあって一番とれていたチームが10個だったので相当難しかったです。
性能審査でへこみすぎてスライドまともに作らず発表の点は一番低かったですが収穫は大きかったです。ちゃんとやればもう少し伸びたかな
(踏んじゃいけないURL:marketAdminは10チーム中8チーム踏んでいたそうなのですが、今回は報告しなければ減点にならないとのことでした、よかった)
ちなみに全員いるにもかかわらず発表の際、前に2人しか出なかったのは僕らだけでした、写真のことを何も考えていない。
他の発表を見ていてDB使えばよかったなと思いました。
僕らのツールは回すたびに前のデータを上書きするので前のクロール状況が分かりませんでした。
そのせいで最大8個取れていたフラグを3個に減らしてしまいました。
DB参照すれば何度でも条件を変えてサーチできますからね。
意外とpythonで書いているチームが多かったです。
次はpython使わないとは思いますが意外とやれるんだなと思いました。
終わってから審査員の方がどういう要素をサイトに入れて嫌がらせしたかを嬉々として語ってくれました。
解散になってからもずっと審査員で反省をしているし、趣味:パソコン のオタク精神に心打たれました。
ちなみに結果としては8位でした
今回一番重視したと語られていたのはログインができるかどうかで、ほかのチームもそこに詰まっていました。
indexからログインフォームに行くか飛ばされるのですが、ログイン状態だとindexがmainページになります。indexのページ内容がログインのセッション持っているかどうかで(多分)変わるので、seleniumとかで動かしている場合セッションIDまわりどうにかしないとそもそもツールを使用してサイトに入れないということが起きます。
僕は実装してないのでどうやったかは知りませんが…sango、記事書いてくれ
僕らはその実装に5時間かけました。
感想(+雑記)
性能審査は大失敗したが、1年生の時にやってよかったなというのが正直な気持ちです。
セキュリティミニキャンプ参加もそうでしたが1年目でやるべきですね、ダメでも「まあ1年目だし…」というマインドでいられます。
MBSDCCがなかったら1年の間にGitHubは触らなかったかもしれないし、GitHubがわからないことを理由にセキュリティミニキャンプに参加しなかったかもしれない。
(やり方があっているかはわからないが)チーム開発の経験を積めたのが何よりも大きいと思います。
ちなみに僕らのMBSDCCの開発リポジトリは一度もmergeしたことないのでconflictの心配がないです。
branchは6つあるしなんかいろいろファイルやbranchが複製されてます、怖いね。
MBSDCC参加にあたってよく勉強するというか学校に残るようになりました。
なんか最近は週4で8時までくらいまで残るようになりました。先輩は10時くらいまで残ったりしてます、怖いね
今回は自分がリーダーだったので技術力がほぼなくてもやっていけたが今後絶対に誰かの下で動くことがあるだろうしその時どうするんでしょうか。
自分は誰かに何かを強制されるのが嫌いというか自分の思い通りにいかないのが嫌なので、どうにかいい雰囲気のところでやるかいい雰囲気を作るかになるんですかね。そうすると結局リーダーみたいになりそうだけど。
先輩の参加記を見ながら書いているのですがWebhookとか使ってみればよかったなとも思ってます。
まあ当時はそんな余裕はありませんでした。
最初は必要なことだけやるのが精いっぱいで気づいたら終わってました。
11月頭から加速度的に実装スピードが上がりましたがそれはそれまで、1週間単位でほぼ進捗がなくてつまんね~~と言いながら作業したりした結果がやっと出たのかなという気持ちです。
とてもいい経験でした
参加メンバー、相談に乗ってくれた先輩、居残りの際にお世話になった先生、主催のMBSD等の方々、ありがとうございました!