Hardening

Hardening 2020 H3DXで優勝しました

最終スコア

Hardeningについて詳細をまとめた同人誌を頒布しています。よろしければぜひどうぞ。

めちゃくちゃ釣りっぽいタイトルにしてしまった…(わざとです)

タイトルの通り、Hardening 2020 H3DXに競技参加者として初参加させていただいて、所属チームが見事優勝する。という大変ハッピーかつ激レアラッキーSSR(スーパースペシャルレア)な経験をしたので、今まで参考にさせていただいた先人の皆様に恩返しするためにも、そしてこれからHardeningに参加しようとする未来のどなたかのためにも、なにか攻略の糸口になればと思って書き残しておこうと思います。

とか言って調子にのって書いてたらやたら長文になってしまった…まあいいか。ご覧いただいている皆さまにおかれましては必要な項目だけご参照ください。

ちなみに、Hardeningへの参加は所属組織に応援していただいていますが、ここに書くことは完全に私個人の感想と所感とパッションです。所属組織とは一切関係ありません。
そもそもHardeningって何?という方はこちらをどうぞ

この記事を書いている人のレベル

趣味でセキュリティをしている者です。仕事は色んな事をしてきましたがエンジニアではありません。Hardeningは技術者の方しか参加できないと思っていたのですが、きっかけをいただいて参加することができました。

終わって思うのは、技術つよつよじゃなくてもチームに貢献できることは沢山あるので、自分に自信がなくて参加を悩んでいる方はぜひ一歩を踏み出してみるとすてきな経験ができると思います。

今回大会の前提

  • 11チームが与えられたECサイトをあらゆる攻撃から守り安定稼働と売上を競う
  • チームメンバーは9名〜11名?
    • アジャイルが成功する限界数だそうです
  • 3名まで知り合い同士で同じチームになれるように申請が可能
    • 申請が通るとは限らない
  • 初の完全オンライン開催

準備期間(約1ヶ月間)

このメールはあなたと同じチームとしてアサインされた人たちを To に入れてお送りしています。(中略)直ちにチーム内の意思疎通をはかってください。

開催1ヶ月前に同じチームのメンバーを宛先に入れたメールが運営の方から届きました。
受け取った瞬間、心臓がきゅっとしたことを覚えています(緊張…)
翌日には同じチームのメンバーを招待したSlackが立ち上がりコミュニケーションが始まりました。

はじめましての人同士なのでここで遠慮しちゃう事もあるかと思うのですが、ここはスピード勝負です。もじもじしないで積極的にコミュニケーションをとるのが肝要です。

やったこと

チーム全員がSlackに集合するまでに数日がかかりましたが、やりとりできるようになってからは基本Slackで連絡を取り合いました。
平均週2回のオンラインミーティングを開催し、以下のことを行っていきました。

  1. チーム名とCEO・COO・CFOの役職者の決定(1週間以内に運営の方に連絡する必要がありました)
  2. ぐぐったり経験者に聞いたりして過去のHardening競技会の情報を集める
  3. あつめた情報をもとに準備したほうが良いことをTrelloにチケット化
  4. 役割分担して各自宿題をこなす

チーム名は「おにぎりまみれ」に決まりました🍙

私がこの期間気をつけていたこと

  • ミーティングに毎回全員が参加できるわけではないので議事録をしっかりとって共有する
  • 信頼関係を構築するためにSlackで発言があったら絶対何かリアクションする。文字を打たなくてもemojiでも良いので無視だけはダメゼッタイ
積極的に話題を振ってくださる方もいてありがたかったです(アイスブレイク大事)

この期間につくられていったもの

  • スキルシート
  • メンバーの得意領域を把握する表
  • チートシート
  • サーバの設定の方法などを書いたコマンドや手順書
  • ランダム文字列一覧
  • 変更後のパスワードにする用
  • 各種自動化shell
  • システム停止や情報漏えい時の謝罪文テンプレ
  • IPAへの届け出様式
  • JPCERTへの届け出様式
  • プライバシーポリシー
  • 会社概要
  • 特定商取引法による表記
  • チームのロゴ・チームフラッグ・Zoom用バーチャル背景

…などなど…最終的に使わなかったものもありますが、使ったものは主にこのあたりです。
個人的には想定インシデントとその対応を決める、みたいなこともやりたかったのですが時間が足りませんでした。

チームのロゴは私が作ってます。我ながらお気に入りです💖

チーム編成

ざっくり技術部門と管理部門に分けていました。10人しかいないのであまり細かい分業をするのもなってことで、自然と皆ざっくり臨機応変に動くようになってた気がします。

ちなみに私は一応販売責任者でしたがそれらしいことは一切やってません…ほんとすいませんでした…。

体制図

競技前々日

競技前々日にCEO・COO・CFOの三人に宿題が課されました。
特にCEOの課題(CEO横断組織の堅団連として政府や関連団体に提言を行う)はボリュームが多く、その日の夜中から他チームのCEOたちと会議を行っていたそうです。(お疲れ様でした)

競技前日

競技前日の夕方くらいに、競技の構成やレギュレーションが書かれた資料が送られてくるのがお決まりだそうです。
そのことは事前に経験者に聞いていて資料を待ち構えていたので、前日の19時半から集合して読み合わせや対応を進めました。

準備したこと

  • 資料の読み込み
  • 環境に合わせたチートシートやツールの準備
    • 特に技術担当の方は徹夜の勢いで準備をしていました(お疲れ様でした)
  • マーケットプレイスでどれを買うか決める
    • 競技中にお金を払って購入できる様々なベンダーのサービスの情報が出揃ってきた
    • Cisco(FW/IPS・EDR)は欲しいけど皆狙うから大丈夫かなー買えるかなーという話をしていた(導入できるのは4チームまでの縛りがあった)
    • この時点ではサイバーセキュリティ保険は絶対買うつもりだった
  • 購入稟議の手続きを決めた
    • SlackとTrelloを連携させて、Trelloで稟議チケットを発行するとSlackに自動で証跡が残るようにした
  • 商品画像の準備
    • 達成すべきミッションとしてECサイトの商品画像の変更があったため
  • 商品の説明文の準備
    • 達成すべきミッションとしてECサイトの商品説明文の変更があったため
  • パスワード変更の担当者決め
    • 競技始まってすぐ初期パスワードを変更する必要があるため、各サーバごとに担当者を割り振ってパスワード変更を効率的に行えるようにした
  • 経営方針を決めた
    • 何かあったときに判断できる軸をもっていたいという意図
    • お客様が1番 売上2番 3時のおやつはHardening(?) ということになった(なんのこっちゃ)
    • 競技が始まると仮にお客様が1番って決めててもサービスの停止判断なんかしてる余裕ない…と思うのであんまり実効性がなかったと思う(泣いても笑っても8時間で終わるし、最初から絶対止めない!って振り切っちゃったほうが楽かも)実際のインシデント対応では軸をもつのは重要だと思います。

競技開始直後

この記事を書く前に運営の方に確認したのですが、資料をそのまま全ページアップするとかでなければ多少のネタバレは可。ということだったので構成などの説明はそのまま貼らせていただきます。(Hardeningは毎回テーマに合わせてネットワーク構成が変わるそうです。すごい)

右下のSSL-VPNルータからApache Guacamoleを使って競技環境内のWindows10またはLinuxにアクセスするようになっていました。

私はGuacamoleを使ったことがなかったのですが(ついでにいうとワカモレという食べ物の存在を知らなかった…国際教養が足りない…)
チームのみんなも同じ状況だったようで、環境に慣れるのにかなり時間がかかってしまいました。

競技環境はインターネットに接続されておらず、必要なファイルの持ち込みはDropboxから競技環境内に同期されるWindowsファイルサーバを通して行う仕様でした。インターネットにつながってないという特性上、何らかの脆弱性を発見したとしてもセキュリティパッチを当てたりバージョンアップをしたりする対応はサクっとできない可能性が高い気がしました、脆弱な環境のままでどこまで頑張れるかが肝かも。

  • ECサイトがShop1〜4まで4つあり、各ショップに不定期にbotが商品を買いに来る
  • 各ショップの環境はバラバラ。環境が古かったり意図的な脆弱性が存在する
  • 運営側のレッドチーム(kuromame6)が攻撃を行うので、それをなんとかして防いでサービスを維持する

Guacamoleの戸惑ったこと

  • なぜかコピペができないことがあった
  • ショートカットがうまく使えないことがあった
  • キーマップのせいか入力できない文字があった(記号など)
  • なぜか1回キーを押すと2回入力されることがあった
  • 私だけなぜかint03に接続することができず、ファイル一切持ち込めず…(トラブルシュートする時間もなく、ファイルのやりとりは他のメンバーに毎回お願いすることに)
  • 快適に使えていた方もいると思うので個別の環境のせいだと思うのですが…私は結構たいへんでした

マーケットプレイスの購入

なんとか競技環境に接続し、前日決めていたマーケットプレイスの購入申請を行いました。
購入は入札形式で行われ、Googlgフォームに金額を入力して、購入制限があるマーケットプレイスは高い金額を入れたチームから購入できるというしくみでした。

私達のチームは前日の打ち合わせ通り、 Cisco(FW/IPS・EDR)とあいおいニッセイ同和損害保険のサイバーセキュリティ保険の2社のマーケットプレイスを購入しようと申請を行いました。

しかし申請後のタイミングで、 サイバーセキュリティ保険は入札ではなく申し込めばどのチームでも加入できるものだということが明らかになり、その時点でチーム内に「わざわざ高い保険に入らなくてもよくない…?」という謎の風潮が起こり、申請したものの保険の購入はしませんでした。

要するに、なんとなく有り難みが薄れたので買わなくていいかーという雰囲気になったわけです。雰囲気で投資を決めるなんてあってはならないことです…この決断を後に後悔することになるとは、今の彼らには知る由もないのであった…。(フラグ)

競技中

自分たちのチームで発生したインシデント

私が把握しているものだけです、実は知らないところで他にも起こっているかも。

ショップのindexページが何者かに改ざんされる

  • あるショップのトップページが、当時最終回直後で大ブームだった◯沢直樹のO和田常務の画像が貼られたindex.htmlに差し替えられるという時事ネタ絡めた面白インシデント
  • コンテンツインジェクション攻撃と思われる
  • 当チームの超優秀なCFOが検知からわずか30分で復旧

フィッシングのメールにうっかり返信する

  • 攻撃だと気付かずに普通にお問い合わせとしてお客様対応してしまう(笑)
  • メールのリンク先にフィッシングサイトがあったらしいがパスワードを入力しなかったのでセーフ

1800件の個人情報漏えい事件を起こしてしまう

  • あるショップのデータベースのバックアップを外部公開領域に行う自動起動バッチプログラムが起動していた
    • 最初から仕込まれていて中からやられたので完全に想定外インシデント
    • 特定のショップの顧客情報と購入履歴が全部漏れる大惨事
  • この件で役員呼び出されイベントが発生する
  • 最終的に保証のために多額の支払いを行うはめに(あのとき保険に入っておけば…)

あるサーバのhttpdが何故か落ちまくる

  • 毎分再起動するようにcron設定して回避

マーケットプレイスの購入ページがDNSエラーで到達不能になる

  • 原因不明
  • 対応できずDiscordで聞き込みを行い、購入ページのIPアドレスを教えてもらい回避
  • 最後にマーケットプレイスに到達できず支払いが行えないとチームに重いペナルティがあったみたいなので、何気明暗を分けたポイントだったと思われる

呼び出されイベント

CEOが呼び出されっぱなし

インタビューやら堅団連の集まりやらでCEOはあまり現場にいられなかったようです(現実でもこういうこと結構ありそうでリアル)

役員会イベント

急に親会社の社長秘書からメールがあり、COOと販売責任者の私が説明を行うというイベントが発生しました。

「販売戦略」、「売り上げ見込み」、「セキュリティ対策」、「事実関係の把握」、「想定される損害」等についての説明資料を準備の上、役員会議に臨んでください。

資料が間に合わなかったので丸腰で行ったらすごい怒られた(当たり前です舐めとんのか
見た目は怖い人達でしたが、言ってることはすべて正論だったのに質問にまともに答えらえなくてめちゃくちゃ悔しい思いをしました。弁が立つひとならうまく乗り切れたのかもしれませんがいかんせん圧倒的説明力不足…。

その後、17時までに再度資料をメールで提出するようにという復活チャンスを与えていただき、何人かで手分けして1時間程度で資料を仕上げて提出しました。

翌日の振り返りで好プレーとして取り上げていただいたので、少しは挽回できたでしょうか。
資料はゼロからつくると消耗が激しいので、事前に想定してある程度テンプレートを用意しておけると良さそうに思いました。(事前の想定でどこまで使える資料ができるはわかりませんが)

競技終盤

ギリギリ17時に親会社に資料を提出して一息ついたのもつかの間、次は競技終了までに作業報告書の提出が必要です。

手の空いてる人間がひたすらスクリーンショットを撮影し、それをGoogleスライドに貼って資料にしていきました。複数人で同時に作業できますが時間がなさすぎてギリギリでした。
終了時にzoomでカウントダウンをしていたみたいですが正直そんな余裕なかったです…。

終わってから

競技が終わったらHardeningも終わるかと思ったら、次は翌日の各チームのふりかえりプレゼンを行うSoftening Dayに向けての資料を作る必要があります。(また資料…(꒪⌓꒪)

できれば競技中に進められたらよかったのですが、おそらくそんな時間はないと思います。
8時間完全燃焼した全員がぐったりしていたので、しばらく食事休憩を挟んで再度集合し、今までの資料と同様にGoogleスライドを使って全員で分担して資料を作成しました。

発表者が1人で全部資料をつくるというチームもあったかもしれないのですが、結構物量が多くて大変なので、分担できるならしたほうがいいなと思います(喋る側としては好みはあるかも知れませんが)

そのときに作成した資料がこちら(メンバーにアップしていい許可をいただいたので載せます)

私は僭越ながら発表者をやらせていただきました。
制限時間が10分と決められていたので実はかなり狙って喋ってました。

勝因がなんだったのか?

勝因をあげるというのは大変おこがましいのですが、強いて言えばチームワークが良かった点が挙げられると思います。

チームメンバーの得意領域がバラバラでうまい具合に自然な役割分担ができていました(←これは完全にラッキーポイント)し、声をかけあう、自分から状況を報告する、などの当たり前のことがちゃんとできていたのが強かったなと思います。

なんだそんなこと、って感じではあるのですが、オンラインでチームの協調を保つ(しかも全員あんまり知らない人同士で即席チーム)って結構たいへんです。
仲良しチームにならなくてもいいんですが、一人ひとりが少しずつオープンマインドになれて、ミスがあってもカバーしあえたのが良かったと思います。

オンラインのチームビルディングのコツはこっちでも書いてますのでよかったらどうぞ

役割のロールプレイのなかで、普段はできない貴重な経験を積むことができて勉強になりました。
関係者の皆様、本当にありがとうございました。次回もぜひ参加させていただきたいです!

役立ちそうな本

ちょいちょい更新がありそうなので別記事にしました。もしよかったらどうぞ。