Apache Server-Status:ペネトレーションテスターにとっては貴重な情報源

Apache Sever-Statusとは:

 

ApacheServer-StatusページはApache HTTPサーバーソフトウェアに含まれている機能で、サーバーの現在の状態や運用状況を知ることができます。一般にサーバー上でURLからアクセスでき、処理中のリクエスト数や各リクエストの状況、アイドルおよびビジー状態の作業者数などの情報が確認できます。

 

セキュリティの観点では、Apache Server-Statusページはサーバーの動きを理解できる貴重なリソースにもなり得ます。たとえばStatusページに表示された情報を使えば潜在的な脅威アクターがアクセス可能な各種パスやvHostsを特定することもできます。

 

ApacheServer-Statusページはサーバーや運用状態に関する機密情報を提供するので、厳重なセキュリティを確保し、信頼できる当事者のみにアクセスを許可する必要があります。  設定ミスのある、またはセキュリティの不十分なServer-Statusページはセキュリティ上の脆弱性となり、攻撃者がサーバーに不正にアクセス可能になってしまいます。

 

ApacheServer-Statusページはディレクトリバスティングツールや、ffufなどのファザー(fuzzer)で簡単に検出できます。

 

本書では脆弱なターゲットを「example.com」とし、

 

以下のようにhttps://example.com/server-statusでServer-Statusページにアクセスできると仮定しています。

具体的には2つのカラム、VhostとRequestに絞って見てみましょう。

vHosts:

 

vHostsとは?

 

Virtual Hosts(vHosts)は複数のドメインを1台のサーバーで単一のIPアドレスを使ってホスティングできるようにするウェブサーバー機能です。ドメインごとに個別の設定が割り当てられ、異なるウェブコンテンツを持つことができるので、そのドメインを指定した人にサービスを提供することができます。

 

vHostsごとに異なるサービスと情報を提供するので、これは重要な点です。たとえばexample.comのserver-statusページに、以下のようにexample.com(メインのウェブサイト)、backend1.net(同じサーバーのバックエンドvHost)とbackend2.netという3つの異なるvHostsに対するリクエストレコードが表示されているとします。

手動テスト:

 

この時点で各vHostに移動して以下のようにリクエストカラムに表示されたパスにアクセスしてみることができます。

または:

ただし、このコマンドは機能しません。

つまり“/sensitive-information?username=Adam”というパスには一般にアクセスできないような機密情報が含まれていることがわかります。

 

このプロセスの自動化:

 

通常、server-statusページにはすべて手動で確認するには手間がかかりすぎる(重要な情報が網羅できないリスクもある)レコードが多数含まれています。しかしありがたいことに、このプロセスを以下のようなシンプルなPythonスクリプトで簡単に自動化できます。

さらに詳しく調査:

 

場合によってはシステム自体に関して興味深い情報が得られることもあります。たとえば、/more-informationでbackend2.netにアクセスしようとすると、以下のレスポンスが返ってきます。

 

[snipped]

最初は非常に長いエラーだと思ってがっかりするかもしれませんが、レスポンスをさらに詳しく調べると、興味深いことがわかります。

このvHostは既知の脆弱性があるLaravel2を使用しているようです。

 

たとえばLaravel.logファイルにアクセスできるかどうかをチェックできます。

このログファイルにはウェブアプリケーションとその環境に関する機密情報が含まれている可能性があるので、これ自体が重要な発見です。アプリケーション実行中に発生したイベントやエラーはLaravel.logファイルに記録されるので、データベースクレデンシャル、例外やエラーメッセージ、デバッグ情報、さらにはユーザーデータなど、機密情報が含まれる場合があります。

 

このような機密情報にアクセスできれば、攻撃者にとってはウェブアプリケーションの脆弱性エクスプロイトやデータ、インフラストラクチャの攻撃に非常に有利です。

もう1つ興味深いLaravelファイルは.envです。

この例の場合、いくつかのDBとGmailクレデンシャル以外に、Cookiesの復号化、暗号化に使用できるAPP_KEYも含まれていました。  

 

ここから引き続きCVE-2021-3129(リモートコード実行)など影響の大きい他の脆弱性に移ることができます。

 

追加の選択肢:

 

Laravelで一通りの情報を確認したら、新しいvHostsを探って追加の情報を入手することができます。この例では深刻な被害をもたらす可能性がある.svnファイルを見付けました。決して簡単な作業ではありませんが、多くのセキュリティ専門家は既知の脆弱性を常に記録しようとしています。しかしソースコード(バグバウンティプログラムなどで常時テストされていない)に無制限にアクセスできれば、攻撃者はソースコード内から脆弱性を探し当てることができるため、エクスプロイト前に検出、修正することはほぼ不可能です。.svnファイルはsvn-extractor.pyなどのツールで簡単に抽出できてしまいます。  

 

結論:

 

ペネトレーションテストの際は非常に複雑な攻撃だけに注目し、非常にシンプルで有効な「ヒント」を見過ごしがちですが、この機能で得られる情報を活用する(すぐに完全なエクスプロイトを試すのではなく)ことをお勧めします。こうすることでペネトレーションテストの様々な選択肢を試し、その範囲を拡大できるので、徹底したテストが可能になります。これは貴重な教訓で、今回の記事でこのアプローチの一例をご理解いただければ幸いです。

 

大企業ではApache Server-Statusページなどの設定ミスを把握することは難しいでしょう。しかし幸いなことにUltra-redのプラットフォームを使えば、こういった問題(そしてその他多くのセキュリティ上の脆弱性)を簡単に検出できます。

 

詳細情報やご質問についてはsapir@ultrared.aiまでお問い合わせください。

 

付録:

 

1 – curlコマンドの-Hパラメータによって、HTTPRequestヘッダーの追加、上書きが可能になります。この例では“example.com”であるはずのHostヘッダーを不正アクセス先のvHostであるbackend1.netに変更しました。

 

2 - Laravelは堅牢でスケーラブルな最新のウェブアプリケーションを構築するために設計された無料のオープンソースPHPウェブアプリケーションフレームワークです。最も人気の高いPHPフレームワークの1つで、洗練されたモジュール式の設計と総合的なドキュメンテーションで知られています。