Linux 権限昇格のラボ:setuid のバイナリ、sudo のルール、cron のジョブ

各生徒には、intern という権限の弱い第二のアカウントが付いた専用の Ubuntu VM が渡されます。その名前とパスワードは README に書かれています。root は3つのありがちな管理者の過ちを残しています。本来持つべきでないビットを持つ補助プログラム、一度も絞り込まれなかった sudo のルール、そして誰でも書き換えられる、root 自身の cron が実行するスクリプトです。課題は、この3つのうち1つを使って root になり、使ったものを書き上げることです。

この VM は生徒だけのもので、ほかの生徒のマシンへの経路はなく、インターネットへの経路も Ubuntu 自身のパッケージアーカイブ、PyPI、npm、GitHub に限られます。だから攻撃できる唯一のマシンは、ラボが渡したそのマシンです。ルールはラボの冒頭で述べられており、私たちだけでなく法律のルールでもあります。自分の VM だけを攻撃し、自分のものではないマシンは決して攻撃しないこと。Computer Misuse Act 1990 のもとで。

生徒が学ぶこと

ちょっとした、ありふれた管理上の近道がどうやって root への道になるかを学びます。仕事に必要な以上の権限を与えられたプログラム、1つのコマンドのために書かれて二度と見直されない sudo のルール、そして誰でも変更できるファイルを信用する予定ジョブです。それぞれを見つけるには、スキャナーを動かすのではなく、アカウントを他人に渡す前に管理者がすべきようにマシンを見る必要があります。Linux セキュリティの入門、システムの堅牢化、侵入テストの導入に向いています。

弱点

通常のシステムツールのコピーである補助プログラムで、常に root として動くように setuid ビットが立てられています。sudo の設定に書かれた1行で、権限の弱いアカウントが1つの通常のプログラムをパスワードなしで root として実行できます。root 自身の cron が毎分実行するスクリプトで、マシン上の誰でも書き換えられる状態になっています。ラボがホームフォルダーに置く README は第二のアカウントの名前だけを明かし、3つのどれも明かしません。

ブラウザーで動かす

VM ラボはモジュールのラボ課題として設定し、サンプルはラボのページにあります。マシンは小さく、CPU 1つ、メモリ 1 GB、ディスク 6 GB です。

  1. ラボを追加する. 自分が教えるモジュールで課題を追加し、「Ubuntu VM ラボ」のカードを選びます。ページにはcompose ファイルの代わりにマシンの短い記述が表示されます。
  2. サンプルから始める. ページには、そこから始められるサンプルのラボが用意されています。Linux privilege escalation を選びます。サンプルを使うとテキストが置き換わりますが、「元に戻す」で自分のテキストに戻せます。
  3. 公開して自分のコピーを起動する. 「公開」してから「起動」を押します。VM の初回起動時に、ラボ自身の setup スクリプトが第二のアカウントを作り、フラグを書き、Ubuntu のアーカイブから3つの弱点を仕込みます。所要時間は10秒ほどです。
  4. ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。第二のアカウントの名前とパスワードが書かれていて、答えは書かれていません。

このラボの基本レッスン

Privilege Escalation Basics は、Ubuntu VM であるこのラボで行う小さなレッスンです。各ステップに説明と「実行」ボタンがあり、コマンドをマシンのターミナルに入力して、出力を表示します。生徒は第二のアカウントに出会い、それが実行を許されているものと許されていないものを見て、root が何かを残した3つの場所を読みますが、それらを使うことはしません。

レッスンは見て回るだけで、root になるというラボ自身の課題は生徒に任せるので、答えは示しません。レッスンはわざと小さくしてあります。ラボで行うレッスンがどういうものかを教師に見せるためのもので、残りはラボが担います。変更したいときは、自分のモジュールにコピーしてください。

提出と確認のしかた

このラボには、意図的に採点スクリプトがありません。マシン上の生徒はすでに自分の管理者権限を持っているので、スクリプトが証拠として読めるファイルは、ラボの弱点を使わなくても1行で書けてしまいます。簡単に偽造できる採点は、ないほうがましです。そのため課題は、教員が読む文章での報告です。フラグは生徒自身の目標と報告のきっかけであって、証拠ではありません。あとで弱点を直すことはここでは求めていません。別の課題として出せます。

  1. 配布する. ほかの課題と同じようにラボを配布します。期限を付けることもできます。各生徒には専用の VM が渡され、セッションをまたいで保持されます。課題の提出設定で「ドキュメント」を選ぶと、生徒は文章で提出できます。
  2. 提出物を読む. 生徒は、使った弱点、それを突いたコマンド、フラグの内容を短くまとめて提出します。マシン上には採点するものがないので、教員が読みます。
  3. 採点する. ほかの提出物と同じように採点し、足りない場合は理由を書いて差し戻します。

GitHub の定義ファイル

このファイルはラボの定義のすべてで、プラットフォームが実行するものと同じテキストです。サイズ、setup スクリプトと README が入っています。コピーして、どのプログラムに setuid ビットを立てるか、sudo のルールがどのコマンドを許すか、書き換え可能なスクリプトが何をするかを変えれば、自分のラボになります。

よくある質問

生徒はこれを本物のサーバーに対して使えますか?
いいえ、ラボは何より先にそう述べます。この VM はほかのどのマシンにも経路を持たず、README とこのページはどちらも、自分のコピーだけを攻撃するというルールを述べています。これは Computer Misuse Act 1990 がこれを行うための条件として定めていることでもあります。
生徒は root にならずにごまかせますか?
はい。ラボもそれを隠しません。マシン上の生徒は自分の管理者権限を持っていて、フラグを1行で読めます。だから自動では採点されません。教員が読むのは、生徒自身の言葉とコマンドによる報告です。
生徒はあとで弱点を直す必要がありますか?
いいえ、このラボではありません。修正は、教員が別に出せる、あとの課題として残されています。