インシデント対応とフォレンジックのラボ:侵入されたサーバーをブラウザーで調べる

このラボでは、各生徒が専用の Ubuntu VM を受け取ります。中には昨夜侵入された Web サーバーのログとファイルが入っています。パスワードを次々に試した SSH のログ、スキャナーだらけのWeb サーバーのログ、アカウントのファイル、crontab、ファイルの更新時刻の一覧です。生徒はインシデント対応担当者として、誰が、どのアカウントで、いつ侵入し、再び入るために何を残したのかを突き止めます。

マルウェアもエクスプロイトのコードもなく、実行するものもありません。すべてテキストで、どの Linux マシンにもあるツールで読みます。

生徒が学ぶこと

ログを証拠として読むこと。grep と awk で SSH のログを検索し、sort と uniq で数えて並べ、攻撃と背景のノイズを見分けます。この事件には意図的にまぎらわしい要素があるので、手抜きの検索では解けません。失敗が最も多いアドレスは一度も侵入せず、管理者はパスワードを打ち間違えてから成功し、正当な新しいユーザーと古い SSH 鍵が侵入者の残したものと並んでいます。時系列を組み立て、変更の時刻から、侵入者の仕業と管理者の作業を見分けます。

課題

生徒は6つの項目を見つけ、answers.txt にラベル付きで1行ずつ書きます。攻撃元のアドレス、侵入されたアカウント、最初にログインに成功した時刻、残された永続化の種類、それがあるファイル、それが動かし続けているプログラムです。ラボがホームフォルダーに置く README には見つけるべきことが書かれていて、答えは書かれていません。

証拠は読み取り専用なので、答えは読んで見つけるしかありません。全員が同じ事件を扱います。

ブラウザーで動かす

VM ラボはモジュールにラボ課題として追加し、サンプルはラボのページにあります。

  1. ラボを追加する. 自分が教えるモジュールで課題を追加し、「Ubuntu VM ラボ」のカードを選びます。ページにはcompose ファイルの代わりにマシンの短い記述が表示されます。
  2. サンプルから始める. ページには、そこから始められる用意済みのラボが並んでいます。Incident response and forensics を選びます。サンプルを使うとテキストが置き換わりますが、「元に戻す」で自分のテキストに戻せます。
  3. 公開して自分のコピーを起動する. 「公開」してから「起動」を押します。VM の初回起動時に、ラボ自身の setup スクリプトが事件のファイルを作ります。所要時間は数秒です。イメージに Python がない場合を除き、Ubuntu のアーカイブからは何もインストールしません。
  4. ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。case フォルダーにある証拠と見つけるべきことが書かれていて、答えは書かれていません。答えは answers.txt に、ラベル付きで1行ずつ書きます。

このラボの基本レッスン

Incident Response Basics は、このラボで進める小さなレッスンです。このラボは Ubuntu VM で、各手順に説明と、マシンのターミナルにコマンドを入力して出力を表示する「実行」ボタンが付いています。生徒は証拠を一覧し、2つのログの行数を数え、SSH ログの最初の数行を読み、失敗したパスワードの数を数えます。

生徒は見て回るだけで、攻撃者を見つけるというラボ本来の課題は生徒に任せるので、レッスンは答えを教えません。無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダーからコピーでき、意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、自分のモジュールにコピーしてください。

採点の仕組み

ラボにはチェックがあります。answers.txt を読み(大文字小文字や空白は問いません)、各答えを事件と照らし合わせます。間違いがあれば最初に間違っている項目を示し、答えは決して書きません。答えに合わせて証拠のファイルが書き換えられた事件も不合格にします。

生徒は自分の VM で sudo を使えるので、root のファイルを読めば鍵が見つかる可能性があります。それは認めています。ラボは練習であり、採点されるのは書かれた答えです。

  1. 配布する. ほかの課題と同じようにラボを配布します。期限を付けることもできます。各生徒には専用の VM が渡され、セッションをまたいで保持されます。中身は全員同じ事件です。
  2. チェックを実行する. クラス一覧の生徒の行で「チェックを実行」を押します。保存されたマシンのコピーが(元には保存されない形で)起動し、ラボのチェックスクリプトが root で実行されて、合格したか、何を出力したか、いつかが表示されます。結果は生徒には知らされません。
  3. 採点する. チェックの出力を読みます。1行目は最初に間違っている項目を示し、答えは決して書きません。足りない場合は理由を書いて差し戻します。

GitHub の定義ファイル

このファイルがラボの定義のすべてで、プラットフォームが実行するのと同じテキストです。サイズ、固定のシードから事件を作る setup スクリプト、README、チェックが入っています。コピーしてsetup のジェネレーターを書き換えれば、自分の事件を作れます。

よくある質問

ラボにマルウェアは入っていますか?
いいえ。事件はテキストで、ログ、アカウントのファイル、crontab、鍵、時刻の一覧です。何も実行されず、アドレスは文書用に予約された範囲かプライベートの範囲のものです。
生徒にはどのくらいの大きさのマシンが必要ですか?
CPU 1つ、メモリ 1 GB、ディスク 10 GB です。ラボがインストールするのは Python だけで、イメージにない場合に限ります。
生徒は答えを調べて見つけられますか?
生徒は自分の VM で sudo を使えるので、その気になれば root のファイルでチェックの鍵を読めます。ラボは練習であり、教員が採点するのは書かれた答えです。