なにげなく接しているメッセージ、それを文字通りに受け取らないことで見えてくるものもあるのです。あなたはこの問いにどう答えますか?
第1回、第2回とWebサーバ“Apache”のセキュリティ設定について紹介したが、引き続きApacheのセキュリティ設定について、新たな視点を提供したい。今回は「ユーザーディレクトリが有効」「デフォルトのコンテンツの存在」をキーワードとして、ここに潜む問題を解説させていただく。
ユーザーディレクトリ機能とは、Apacheのモジュールの1つである「mod_userdir」を利用した機能である。
皆さんは、Webサイトを巡回しているときに、http://●●.jp/~tsuji/のようなURLを何度も見たことがあるだろう。
このURLをリクエストすると、指定したユーザー(上記の場合はtsujiユーザー)のホームディレクトリにアクセスできるのである。ユーザーディレクトリは、このようにシステム内のユーザーごとのホームディレクトリを、Webで公開・管理することに利用される機能である【注1】。
【注1】
ホームディレクトリ以下をそのまま公開することは好ましくないため、多くの場合は、ホームディレクトリ以下に「public_html」などの共通の名前のディレクトリを用意し、そのディレクトリを公開専用にする場合がほとんどである。つまり、http://●●.jp/~tsuji/とリクエストをすると、システム内の/home/tsuji/public_htmlにアクセスできるということである。
この機能は、httpd.confなどのApache設定ファイルに記述されている。まず、どこに有効/無効の設定が記述されているのか、あらかじめ確認しておこう。
デフォルトでは、設定ファイルの中に以下のような記述がある。
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
#
UserDir public_html
上記の「UserDir public_html」の部分がユーザーディレクトリ機能の設定部分である。デフォルトでは、http://●●.jp/~tsuji/とリクエストした場合、/home/tsuji/public_htmlにあるファイルに対してアクセスすることとなる(多くの場合はindex.htmlやindex.phpなどのインデックスファイルが表示される)。
このユーザーディレクトリ機能を提供するmod_userdirモジュールは、Apache 2.1.4以前ではデフォルトの状態で有効になっている。この機能は、前述したような用途のために使用されるのだが、あるリクエストに対する応答において、セキュリティの観点から問題となる挙動をする。
それはどのような挙動なのか。問題となる挙動を示す前に、まず、今回のテストケースの前提条件を示しておこう。
この条件の下、下記のようなリクエストを送信してみよう。
a.http://●●.jp/~root/
b.http://●●.jp/~tsuji/
c.http://●●.jp/~muman/
結果は以下のとおりである。
上記の結果を見比べてほしい。c.のみ「Not Found」と表示されており、応答が違うことが分かるだろう。
ユーザーディレクトリが有効になっている場合、システム内に存在しないユーザーのディレクトリにアクセスした場合は「Not Found」が、システム内に存在するユーザーのディレクトリにアクセスした場合は「Forbidden」が返されるのである。
これは、どういうことを示しているのだろうか。
この挙動を利用して、さまざまなユーザーディレクトリへのリクエストを試行し、「Forbidden」を返すリクエストを確認することで、システム内に存在するユーザーを見つけ出すことができるのだ。
いちいちユーザーディレクトリをブラウザのアドレスバーに入力して確認するのは、面倒で現実的ではないと感じた方もいらっしゃるかもしれないが、このような作業を手動で行わなくとも、あらかじめ、テキストファイルに書かれた複数のユーザーディレクトリをチェックし「Forbidden」が返ってきたユーザーを通知してくれるツールも存在している。
今回のテストケース環境にて、ツールを実行した結果は以下のとおりである。
[*] Checking http server [192.168.0.XXX:80]...
Apache => yes
Vulnerable => yes
OS => Unix unknow
[*] Searching for system accounts...
root => yes
tsuji => yes
muman =>
sergey =>
sasha =>
pavel =>
dark =>
(以下略)
実行結果では、ユーザーディレクトリへアクセスを行い「Forbidden」を返したもの、つまり、システム内に存在するユーザー名の横には「yes」と表示されている。「root」と「tsuji」が存在していることが分かり、「muman」以下のユーザーが存在していないというように、ブラウザでリクエストを送信したときと同じ結果が得られていることが分かる。手間をかけブラウザでアクセスしなくても、自動化されたツールを利用することで手軽に調査が行われてしまうことが分かっていただけたと思う。
Copyright © ITmedia, Inc. All Rights Reserved.