全7928文字
PR
4/1朝まで
どなたでも有料記事が読み放題「無料開放デー」開催中!

 前回までで解説したように、WebサーバーソフトやWebアプリケーションの脆弱性を突く攻撃を防ぐには、シグネチャーベースで攻撃を検知するWAF(Web Application Firewall)が有効だ。

 だがWAFには弱点がある。あるPoCコードに対応するよう作成したシグネチャーは、異なるパターンの攻撃には対応できない場合がある。例えば同じ脆弱性を悪用する攻撃であっても、攻撃用の文字列を変えられると検知できなくなる可能性がある。

 そこで今回は、異なるパターンの攻撃でも検知できるようにシグネチャーを強化する方法を紹介しよう。

デバッガーで処理を分析

 今回も前回と同様に、2017年に公開されたApache Struts2の脆弱性(CVE-2017-5638、S2-045)を題材にする。

 基本的な検証環境は前回の記事と同じで以下の通り。

OS:CentOS 7
Webサーバーソフト:Apache HTTP Server 2.4.6
WAF:ModSecurity 2.9.2
Webコンテナ:Apache Tomcat 7.0.76
Webアプリケーションフレームワーク:Apache Struts 2.3.31
Java:OpenJDK1.8.0

 シグネチャーを強化するには、Webサーバーが攻撃のリクエストを受信した際に、内部でどのような処理をしているのかを分析する必要がある。そこで今回はここにデバッガー(デバッグ環境)としてEclipseを追加する。

IDE:Eclipse IDE for Enterprise Java Developers+Pleiades

 原稿執筆時点の最新版は「2019-06」。Pleiadesは日本語化する場合に使用する。

 以下、環境の構築方法を説明しよう。なおURLやバージョンなどは2019年7月時点のものなので変更される可能性がある。

1.Eclipseのダウンロードと展開

 まずはEclipseの公式サイト(https://www.eclipse.org/)からアーカイブファイルをダウンロードする。公式サイト→「Download」→「Download Packages」と遷移し、「Eclipse IDE for Enterprise Java Developers」の「Linux64bit」リンクをクリックする。

 そしてダウンロードされたtar.gzファイル(https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2019-06/R/eclipse-jee-2019-06-R-linux-gtk-x86_64.tar.gz)をデスクトップなど任意のディレクトリーで展開する。日本語環境にする場合は日本語化プラグインPleiadesを追加する。

2.EclipseからTomcatを使用するための設定

 次に展開されたeclipseディレクトリー配下にある実行ファイルを起動し、サーバー環境を整える。

(1)Eclipseのメニューで「ファイル」→「新規」→「その他」→「サーバー」と選択し、「次へ」をクリックする。

(2)「新規サーバーの定義」画面で「Tomcat v7.0 サーバー」を選択。サーバーのホスト名がlocalhostであることを確認して「次へ」をクリックする。

(3)「Tomcatインストールディレクトリ」にTomcatをインストールしたディレクトリーを入力し、「完了」をクリックする。

 このときyumでインストールした場合は「/usr/share/tomcat/conf/tomcat-users.xml」の権限の問題でエラーとなるため、「#chmod 644 tomcat-users.xml」を実行後、Tomcatインストールディレクトリに「/usr/share/tomcat」と入力する。

3.プロジェクトのインポート

 今回はStrutsプロジェクトで配布されているサンプルアプリケーションを使用する。まず、EclipseにStruts2プロジェクトをインポートする。

(1)Eclipseのメニューで「ファイル」→「インポート」→「Web」→「WARファイル」と選択し「次へ」をクリックする。

(2)WARファイル入力欄の右にある「参照」をクリックし、Struts2アーカイブ内のapps/struts2-blank.warを選択して「完了」をクリックする。

 そしてプロジェクトエクスプローラーに「struts2-blank」プロジェクトが表示されていることを確認する。確認できたらStruts2を起動する。

(3)Tomcatが動作している場合は「systemctl stop tomcat」を実行してTomcatを停止する。

(4)「struts2-blank」プロジェクトを右クリックし、「実行」→「サーバーで実行」をクリックする。

(5)「ローカルホストのTomcat v7.0サーバー」が選択されていることを確認し、「完了」をクリックする。Eclipse内でブラウザーが自動起動し、「Struts is up and running ...」といった画面が表示されればOKだ。

4.ソースコードの添付

 デバッグではjarファイルにソースコードを添付し、ソースコード上でステップ実行する。

 まず、Struts2のソースコードを添付する。「struts2-blank」プロジェクト内で「Javaリソース」→「ライブラリー」→「Web App ライブラリー」とクリックすると、このプロジェクトで使用されているライブラリーの一覧が表示される。ここで「struts2-core-2.3.31.jar」を右クリックして「プロパティー」を選択する。

 「Javaソースの添付」という画面が開いたら、「外部ロケーション」→「外部フォルダー」とクリックして、Struts2のアーカイブに含まれる「src/core」を選択する。

 試しに「struts2-core-2.3.31.jar」をダブルクリックして適当なクラスファイルを開いてみてほしい。そのクラスのソースコードをEclipse上で確認できることが分かるだろう。

 次にCommons FileUploadにソースコードを添付する。Struts2のアーカイブには含まれていないので、Struts 2.3.31内で使用されているバージョン1.3.2のソースコードを別途ダウンロードする必要がある。

 Commons FileUploadの公式サイト(https://commons.apache.org/proper/commons-fileupload/)にアクセスして、「Download」→「Archivesの下にあるarchives...」→「source」と進み、「http://archive.apache.org/dist/commons/fileupload/source/」の配下にある「commons-fileupload-1.3.2-src.zip」をダウンロードして展開しておく。

 そしてStruts2にソースコードを添付した要領で、「Web Appライブラリー」にある「commons-fileupload-1.3.2.jar」にソースコードを添付する。

5.PoCコードの実行

 起動したStruts2に対してPoCコードを実行する。今度はTomcatが起動しているlocalhost:8080に送信する。

Eclipse上のStruts2に対してPoCコードを実行した結果
Eclipse上のStruts2に対してPoCコードを実行した結果
[画像のクリックで拡大表示]

 その結果、Struts2の脆弱性を突いてpasswdファイルの内容を表示できた。

 ここで、ログが出力されているかどうかも確認する。スタックトレースが出力されていれば分析のヒントになるし、運用するシステムが攻撃を受けたかどうかを確認する手段の1つにもなる。

 今回はEclipse上からStruts2を起動したので、Eclipseの画面下部の「コンソール」タブにエラーログが出力されているかどうかを見てみよう。

出力されたエラーログ
出力されたエラーログ
[画像のクリックで拡大表示]

 このように、PoCコードに含まれていた文字列が含まれたスタックトレースがログに出力されている。分析の際のヒントになるので、コピーして別途ファイルに保存しておこう。