Hardening 2017 Fesレポート

初出: TechReport 2017.12

「衛る技術」を団体戦形式で競い合うセキュリティ・イベント「Hardening Project」の11回目、「Hardening 2017 Fes」に参加してきました。

通常の Hardening は、実際の競技を行う「Hardening Day」と、振り返りプレゼンと攻撃チームからの解説、最終結果の表彰などを行う「Softening Day」の二日間で行われます。今回は「Fes」と銘打っている事もあり、全三日間の日程となり二日目に「Firming Day」が設けられました。募集段階では詳細は明かされず、「アンカンファレンス、ワークショップ、ラウンドテーブルなどの形」と公表されています。

会場もここ最近ずっと沖縄でしたが、今回は淡路島の淡路夢舞台国際会議場でした。いわゆる日本標準時(JST)の子午線が通る地域でもあります。

というわけで、我々「Team9¥>pin9」の闘いを、時系列で追っていきます。

Day-0 競技前日

Hardening では、前日夜にはチームメンバーが集まって競技当日に向けた最終方針決定などを行うのが基本です。そもそも沖縄の場合には当日朝着が現実的に不可能であることから、ほぼ全員が参加します。

実はまずこの段階でつまずき、某 IPA の某研修プログラムの日程の都合によって7人中4人9が前日打ち合わせに参加できませんでした。正直ここでポプテピピックコラを貼りたい気持ちで一杯になりましたが、来られないものは仕方無いので来られる人だけで打ち合わせです。

前日打ち合わせのやり方もチーム毎に大きく異なりますが、私達は KDL さんに縁のある店で複数のチームが集まってお酒もそこそこに集まりました。途中でマーケットプレイスの方々も遊びに来たりしています。

より本気度の高いチームは、Airbnb で広めの家を借りてチームメンバー全員がそこに宿泊したりもしていたようです。正直その発想が無かったので、各々で高速バスの都合が良い三ノ宮などに宿を取りました。とにかく朝が早い(高速バスの場合は7時にはホテルを出ていないといけない)ので、高速バス乗り場から近いところが良いです。

ちなみに、接続用にポート数の多いラックマウントスイッチを持って行ったのですが、空港で見事に預け入れ荷物の重量制限に引っかかり、まさかの手持ち搭乗になりました。

Day-1 Hardening Day

競技当日です。

チーム毎にあつまり参加費(メシ代)を支払って会場に入ります。会場にはネットワークケーブルが一本出てきている状態で用意されているので、持ち込んだスイッチ等で参加者の PC を接続していきます。私達のチームではありませんが、最近のノート PC はネットワークインターフェースを持っていないものが多く、持ち込んだ USB-NIC がうまく接続できないというチームもあったようです10。当初は24ポートのスイッチを使っていたのですが、今回のテーブル配置だと8ポートくらいの小さなスイッチを2箇所において近い方に接続する方が場所を取らず良かったようです。

まず競技内容の説明があり、それと並行してひっそりと9時間のカウントダウンもしれっと始まります。Hardening の場合は、このような競技説明にもヒントがあったりするため、接続確認を進めながらもきちんと耳を傾ける必要があります。

初動

さて、Hardening で重要とされる「初動」として、以下を迅速に進めます。

  • 各サーバのログイン確認

  • パスワード変更(一般ユーザ・管理者)

  • 一般ユーザにログイン用 SSH 公開鍵を設定

  • 各サーバの基本的なバックアップ

  • マーケットプレイスの手配

パスワード変更や SSH 公開鍵の設定は、ある程度スクリプト化していたのですが、1台混じっていたUbuntu で上手く走らなかったりと若干の焦りもありつつも、ひとまずログインできるサーバについては実施しました。

バックアップについては、侵入を見越して対象と別のサーバ(踏み台 PC)への複製をしましたが、実は複製対象の確認が甘く、設定ファイルだけで Web コンテンツなどの複製ができていない状況でした。まさに「やるべきことをやりきることが重要」という Hardening の鉄則通り、バックアップ不備により、後のランサムウェアで痛い目に遭います。

その一方で、一般的な OpenSSH 環境でそのまま使える ProxyCommand 設定済みsshd_config をチーム内で共有して作業の迅速化を図ったりもしています。とにかくパスワードを打たないことが後々のキーロガー対策にもなるという予想から、基本的に全てこの段階から公開鍵認証でログインしてもらっています。後で他のチームのプレゼンを見て、このあたりのサーバ管理基本スキルについて事前訓練をやっておけば良かったなと感じます。

競技環境への誤解

これは思い返せばなんでこんな勘違いをしたのか判らないのですが、競技環境に接続した PC からはインターネットに出られないと思い込んでいました。そのため、事前に準備していた Slack やGoogle spreadsheet などを活用できず、土壇場で用意した付箋紙ベースでのプロジェクト管理を強いられることになり、無駄に苦労することになりました。

いやこれほんとなんで勘違いしたのかいまだに謎です。

競技環境上のサーバからはインターネットに出られませんが、接続している競技参加者の PC 自体はインターネットに出られたようです。

前任者による不正侵入

Hardening で重要なことは「想像力」です。与えられた情報全てから、どんなストーリーで何が行われているのかを推測していく能力が求められます。それが一つ現れるのが退職者による不正侵入というインシデントです。

各サーバのプロセス状況の確認から、「ametani」というユーザがログインして色々悪さをしていることが判明しました。当然ながら ametani なんてユーザは知らないので、ひとまずアカウントへのログインをパスワード変更で停止しつつ、「親会社の社長」や「総務部門」に問い合わせます。

その結果、現役のリモート作業者ではなく退職者であることがわかり、そのままアカウント停止処分と相成りました。

外部業者によるコンテンツアップロード

この上手く対応できた「ametani」氏インシデントと対称的なものが、外部業者からのコンテンツアップロードです。

あらかじめカバーストーリーとして、「外部業者にイケてるデザインを発注しているのでそれが競技期間中に届く」という事が明示されていました。その届いたデザインをウェブサイトに組み込むことで売上=スコアが上がるというわけです。そして競技環境にあるファイルサーバにあるテキストファイルをよく読むと、ウェブサーバの一般ユーザ user6でホームディレクトリにアップロードされる旨が書いてあります。

ここでおさらいですが、初動段階で一般ユーザのパスワードを一括で変更してしまっており、当然ながら外部業者がそのユーザでログインすることができなくなっています。「確認不足のまま現状を変更すると何かが起こる」というのは Hardening における王道パターンの一つで、見事にそれをぶち抜いた形です。

正しい対処としては、「別のリスクを許容しつつ、一般ユーザのパスワード自体は変更しない(そのかわり sudo 等を抑止)」もしくは「パスワードを変更して外部業者にその旨を連絡」の2パターンでしょうか。可能ならば後者が望ましいのは言うまでもないです。

ametani 氏の時は所属確認など注意深くできていたのに、かなり残念ポイント高いです。

ウェブサーバのランサムウェア

見事にやられました。

本来ならばバックアップから書き戻せば良いはずが、コンテンツディレクトリのバックアップミスにより、痛恨の支払いが発生します。まさにこれは現実世界でも同じ事が言えます。取っているはずのバックアップ、ちゃんと必要なものを全て取れていますか?

またランサムウェア復旧サービス(いわゆる支払い)に泣き付くときにもうっかりミスを重ね、10万円の復旧サービス(今回は無関係)と、100万円の復旧サービスの二つが用意されているのですが、100万円の復旧サービスと明示されているにもかかわらず無駄に10万円の方を発注してしまいます。

会場には攻撃側チーム Kuromame6からのヒントを代弁する Google Home11が居ましたが、みごと Google Home から「10万円なんかじゃ復旧できないよ」と煽られることになります。

復旧サービスに申し込むと、勝手に不正侵入して暗号化されたファイルを復号してくれるのも悔しい限りです。

Windowsマルウェア

定番として Windows 端末がマルウェアにやられます。というわけでエンドポイント製品、今回はIntel 製品を導入しました。見事に検知していただき、エンドポイント製品の重要性と威力を思い知りました。

複数サーバで連携してその経路などを追いかけてくれるのは流石ですね、かなり良いです。

HTTPS化

昨今の状況を顧み、カバーストーリーでも触れられていることから HTTPS 化が必須なので絶対やろうということに前日打ち合わせで決まっていたのですが、優先度判断が甘く最後の最後に回ってしまいました。おそらくこれによる売上低減が、中盤以降でスコアがまったく振るわなかった主要因の一つとみています。

HTTPS 化も、全て自前でやるという手法だけでなく、NEC InfoCage のような外部 Proxy 型のWAF であればそこに証明書を入れるだけで対応できたようです。正直マーケットプレイスに出ている製品の理解がまったく不足していたため、無駄に優先度を下げてしまったわけです。マーケットプレイスで購入を検討している製品は、どのような導入形態が取れるのか事前調査が勝利の鍵と思います。

壊れたWordpress

コーポレートサイトでのリンク先が間違っているためアクセスが来ないという仕込みがあるのですが、この Wordpress の管理画面が壊れているため、まともにコンテンツが編集できないという問題がありました。

本当に Wordpress 自体が壊れているわけではなく、競技環境は本物のインターネットから隔離されているのですが、本物のインターネット上の Google CDN から取ってくる JS に依存するなど、このあたりを早めの時間帯で切り分けて対策できていれば良かったと思います。また、いっそ API での編集など別の手段を確保するという手もありかも知れません。

情報漏えい事故

Web コンテンツのディレクトリに、DB のバックアップなどがぽろっと置かれているという情報漏えい事故が仕込まれています。

Web コンテンツのチェック、初動での確認事項に入れたい項目の一つです。

また、今回は各チームが「子会社」という体になっていますが、その時点でスコアの高い一部チームに対して情報漏えいインシデントに対する「親会社からのお呼び出し」が掛かります。別の個室で行われる状況がメイン会場にも映し出され、まだ呼ばれていないチームは戦々恐々としていました。

ルータへのログイン手段

競技ネットワークで2台用意されているルータ(これも競技対象の中)へは、踏み台として用意されたPC から SSH でログインするように設定されていますが、ここもまたシナリオへの想像力が求められました。

基本的に user1という一般ユーザを利用して作業をしていますが、ルータ1へは素直にファイルサーバ上の用意されている PuTTY とその秘密鍵を利用して user1にログインができます。判りづらかったのがルータ2へのログインで、やはりファイルサーバ上に用意された別の秘密鍵を利用しますが、ログインできるのは user2だったりします。こういう罠がたくさん用意された競技環境、とても楽しいです(白目)。

競技終盤

まあ終盤になってくるとだいぶ焦りが溜まってくるわけですが、細かい対応不足が重なってスコアが伸びず、よりさらなる焦りを呼びます。

仕掛かり作業をやりきろうと言うことで、HTTPS 化などに今更のように手を付けたのもこのあたりだったりします。当然ながら、そんなスピード感だと現実では Google chrome に怒られてしまうわけですね。

競技終了

9時間の競技を終え、レセプションホールでの立食パーティタイムです。

ここで運営側から競技時間の追加が告知され、「明日はまたゼロから」「引き継ぎをいかに詳細にするか」というキーワードが出ます。他チームとのスワップ辺りかなあと予想しつつ初日終了です。

Day-2 Firming Day

問題の2日目「Firming Day」です。

競技時間の追加は、「人事異動」として「リーダー以外が隣のチームに異動」することが発表されます。つまり、リーダー一人だけを残して別のチームの人が自分たちの環境を見ることになります。まさに引き継ぎ力が重要という通りです。

延長競技時間は2時間、私達はリーダーを残して隣のチーム「Team10天一」に移って引き継ぎを受けました。どうも引き継ぎ資料が不十分で、パスワードが分からないなんてチームもあったようです。隣のチームは、競技環境に splunk を導入してログ分析をやっていたりと、色々各チームの特色が見えて価値の大きい2時間でした。

ちなみに、この日のランチがカレーでしたが、本当に美味しかったです。

Day-3 Softening Day

Softening Day では、まず各チームがそれぞれの取り組みをプレゼンします。

特徴的だと思った取り組みをいくつか紹介します。

原価率などの戦略

仕入れ原価などを差し引いた売上額がスコアと言うことで、競技環境の EC サイトに並んでいる商品の原価率などに売上戦略に注目したチームが複数有りました。特に高額商品の「アナゴ」をたくさん売ったチームはスコアが高かったようです。なかには、新しい商品としてネギを新規に売り出したチームもありましたが、惜しくも「お客さん」には刺さらなかった模様です。

その一方で、「32億円の誤発注」という伝説的なやらかしがあったチームもありましたが、それをきっかけにチームの雰囲気が良くなり笑いの絶えない職場になったりと、なにが幸いするか判りません。

社歌

メール担当者が、出すメールのフッタに社歌を入れていたチームがありました。

この社歌は、翌月に東京で行われた振り返り会にて無事披露されました。

ツール

各チームいろいろ試行錯誤が見えましたが、タスク管理は Trello が良さそうという感じです。

Backlog や GitHub issues というチームもありました。

事前訓練

先ほど少し触れましたが、競技環境を模したサーバ群を用意して、基本的な作業や初動対応などを訓練したチームが複数有りました。

確かに Hardening の競技環境は「踏み台」の存在など癖のある部分も少なくなく、これは必ずやっておいた方が良さそうです。

Kuromamoe6からの解説と表彰

各チームからのプレゼンの後、攻撃チーム Kuromamoe6からの答え合わせの時間です。

そして、最終スコアの発表と表彰が行われます。私達 Team9は辛うじて最下位ではない15位でしたが、得るものは多かったので実質優勝です。

動画公開

そして、ここまで全て YouTube にて動画が公開されています。是非みましょう。

https://www.youtube.com/watch?v=me4rM9OVtNg

Day-4

Day-3を夜までゆっくり楽しみたかったので後泊しています。

この日は、Hardening の疲れを癒すべく有馬温泉に寄って帰りました。

今後に向けて

最近すっかりサーバーレス屋と化して、サーバの運用をあまりやっていない状況だったのですが、改めてサービス運用・サーバ運用の勘所を復習する良い機会になりました。

今後また Hardening に向けてやっておいた方がいいなーと思ったことをちらほら並べます。

  • 事前訓練で競技環境の癖に慣れる

  • バックアップなど、現実だったらやっていることをきっちり意志決定

  • 前日打ち合わせは全員参加、場合によっては宿泊も Airbnb で一緒にする

  • きっちりタスク管理、優先度判断

  • 素人なりにでも良いから最低限の脆弱性診断

  • splunk 等によるログの一括管理

  • コンテンツの全チェック

  • ビジネスの利益率向上施策についての議論

  • なんだかんだで世の中 Wordpress なので WP 力を付ける

これらは Hardening だけでなく実世界でのサービス運用に通じるのは言うまでも無いです。

最後にあらためて、Hardening Project という企画を動かしている全ての人達に感謝します。