2)実際の検査におけるZAPの設定と手順

前編の1)で「Standerd Mode」の状態で「クイックスタート」による検査を行ったが、これはあくまでもZAPの動作を確認するための手順で、実際の検査ではもう少し細かい指定をして検査を行う。
以下に実際の検査時の手順を説明する。

・ブラウザのプロキシを設定し、ブラウザで検査対象のページにアクセスする

前編の事前準備のところで解説した手順で、ZAPのプロキシ設定の調整(調整不要ならデフォルトで)と、ブラウザへのプロキシ設定を行う。

その状態で、検査対象とするサイトにアクセスすると、ZAP画面下部の「履歴」タブや左の「サイト」のところにアクセスしたサイトやURLが表示される。

・モードの変更
前編では「Standerd Mode」で検査を行ったが、実際の検査ではZAPの左上のmode設定を「Protected Mode」にして、意図しないページへの検査(攻撃)が走らないようにしながら検査を行う。

セミナーでは教わらなかったか私が聞き洩らしたか、で各モードの詳細が不明だったので調べたところ

・Safe Mode - 危険な処理が一切できないモード
・Protected Mode - スコープ内のURLにのみ危険な処理が行えるモード
・Standard Mode - 全URLに危険な処理が行えるモード

という感じのようでした。
「スコープ」というのは、コンテキストの一段上の概念で、コンテキストの設定画面で「In Scope」にチェックが入っているとそのコンテキストがスコープ内として扱われるようです。
コンテキスト設定画面の「In Scope」にはデフォルトでチェックが入っているので、本記事の手順では「コンテキストに入れていればスコープ内」になります。スコープについては他にも便利な使い方があったりするようなのですが、セミナーでは「スコープ」という概念の説明は、(多分)まだ出てきていないか省略されているため、本記事でも割愛します。

「Standerd Mode」の時に、ZAPを通してアクセスしたサイトをZAP上で右クリックすると、下図のように「攻撃」の各メニューが有効になっている。



この状態で検査を行うと、各URLに何の歯止めもなく攻撃できてしまうモードになっているため、誤操作や誤設定により意図しないページにまで検査を行ってしまう可能性がある。

それを防止するため、ZAPの左上のmode設定を「Protected Mode」にすることにより、「コンテキスト」に指定したページしか検査を行わないという設定を行う。

まず、ZAP左上のモードを「Protected Mode」にすると、コンテキストメニューの「攻撃」の各メニューはほとんどが無効とされてしまい、そのままでは検査(攻撃)をおこなうことができなくなる。



検査対象サイト/ページを指定するには、「サイト」もしくは「履歴」タブ内の検査対象にしたいサイトかページを右クリックし、コンテキストメニューより「include in Context」の「1」を選択。(この「1」はコンテキストの名称で、次に出てくるコンテキストの設定画面でちゃんとした名前に変更できる)



上で「1」を選択すると下図のウィンドウが開く。



ここで、「Include in Context」の「URL regexs」に「\Q」~「\E」の形の正規表現で、指定したURLが表示される。正規表現の「\Q」は「\E」までの正規表現メタ文字をエスケープするため、URLの「.」などが余計な意味を持たない。

「Include in Context」の「URL regexs」にURLを指定すると、ZAPの「サイト」タブのその正規表現にマッチするURLを持つページだけに二重丸「◎」のようなマークが付く。



この二重丸「◎」のようなマークが付いているページはコンテキストメニューの「攻撃」が有効になり、検査対象のページとなる。

ここで、本記事の手順を手元で確認中に気付いたのですが、Protected Modeの場合、対象となるページをコンテキストに入れるだけではなく、サイトのルートもコンテキストに入れないとうまく検査が走らないという挙動があるようです。(セミナーでも、単体のページだとうまく検査が動かず、急遽ルートからの検査に切り替えていたような気がします)

例えば、Protected Modeにした後で「http://127.0.0.1/test/test.php」だけを指定してコンテキストに入れて、このページに「◎」が付いている状態で自動検査を行おうとしても、一見、右クリックメニューで「攻撃」が有効になっているように見えて、実際に「Active Scan single URL」を選択しても検査が走らず、何もせずに止まってしまいます。
モードを「Standard Mode」に戻すか、「http://127.0.0.1/」をコンテキストに入れると、右クリック-「攻撃」-「Active Scan single URL」が動作するようです。
ただ、「◎」が付いていて、コンテキストメニューでも攻撃可能になっているのに、実際には攻撃が走らない、というのは直感に反するので、この挙動が正しいのか自分の設定ミスなのか、後日確認します。
ひとまず上記手順で検査が動かない場合、「サイトのルート」もコンテキストに入れる、という手順を追加して確認してみてください。

※2014/11/8追記
この現象について、私がいろいろZAP関連で参照させていただいているYuki(@yukisov)様のブログで検証がされていました。
Yuki様の調査によるとやはりバグっぽいようで、近いうちに出るZAP 2.4では修正されるようです。ありがとうございます。
OWASP ZAP 2.3 の Protected mode で Active Scan した時の問題について
(Web Application Security Memo)

・手動検査

OWASP ZAPを部分的に使って、手動検査を行うことも可能で、ここではその手順を解説する。

ブレークポイント

OWASP ZAPの右ペインの上部に「→」(全リクエストにブレークポイントセット)というアイコンがあり、このボタンを押下すると、ブラウザから発行されるPOSTやGETをZAPで中継する際に一時的に差し止めて、リクエストを改変してから発行することができる。



「Standard Mode」の場合、「→」(全リクエストにブレークポイントセット)を押下しただけで全てのリクエストにブレークポイントが設定されるが、「Protected Mode」の場合、ブレークポイントが有効になるのはコンテキスト内のURLに対してのみの模様。

ブレークが入るURLの場合、POSTやGETなどで当該URLに遷移する際、ZAPが反応してリクエストを差し止めてくれる。右上ペインの「ブレーク」タブが自動的に有効になり、上にリクエストヘッダ、下にリクエストボディが表示された状態になる。



パラメータやリクエストヘッダの内容を改変し、「サブミットして次のリクエストかレスポンスへ移動」「サブミットして次のブレークポイントへ移動」のどちらかのボタンを押下すると、改変したリクエストがサーバーに投げられ、レスポンスが戻ってくる。



サーバから戻ってきたレスポンスは、ZAPの右上の「レスポンス」タブで内容が見られるし、ブラウザにも表示される。
この手順でリクエストをいろいろ改変し、脆弱性を探すことができる。

Fuzzer

ブレークポイントを使ってパラメータを一つ一つ改変するのを手作業でやるのがつらい時がある。
OWASP ZAPには、ファジングを行う機能もあり、その機能を使って様々なパラメータを楽に試すことができる。(ファジングに使うパラメータリストを自前で作成することもできる。)

Fuzzerの設定を調整


「ツール」-「オプション」-「Fuzzer」で「並列スキャンスレッド数」を設定することができる。並列スレッド数を増やすと、ファジングを行うスレッドが増え、検査の進捗が早くなるが、サーバ及びクライアント側の負荷が高くなる。

また、この画面の「Add Custom fuzz File:」「ファイルを選択してください」というボタンを押下し、任意のテキストファイル(1行に1パラメータを記述したテキストファイル)を、自前のファジング用パラメータリストとしてZAPに設定することができる。



ここでFuzzerの動作を確認するため、試しに

fuzz1
fuzz2
fuzz3

という3行だけのテキストファイルを作って、「fuzztest.txt」という名前でデスクトップ等に保存し、これをZAPのカスタムファザーに設定してみる。(このファイルの一行が、1パラメータになる予定)

上図Options画面の「Add Custom fuzz File:」「ファイルを選択してください」というボタンを押下し、「fuzztest.txt」を指定する。(このファイルをZAPが格納するディレクトリの書き込み権限がないとエラーになることがある。その場合はエラーダイアログに表示されるディレクトリを作成し書き込み権限を追加してください)

ZAPの画面下部の履歴タブからファジングを行いたいリクエストを選択し、画面上部右の「リクエスト」タブを開き、ファジングを行いたい箇所をドラッグで選択してから右クリック-「Fuzz..」を選択。



「Fuzz」という子ウィンドウが開くので、「Fuzzカテゴリー:」のプルダウンを「Custom Fuzzers」にセットし、Fuzzリストにさきほど読み込ませたファイルが出てきていたら、それを選択。



「Fuzz」ボタンを押下すると、ZAPメインウィンドウの「Fuzzer」タブがアクティブになり、読み込ませたファイルに記載したパラメータが、ドラッグした箇所に設定されて次々とリクエストされる。



後は、レスポンスを見て回って脆弱性を示すようなレスポンスがないかチェックする。

結果一覧で、「Status」がHTTPステータスコード、「RTT(ms)」がレスポンス時間、「size」がレスポンスサイズ、「Fuzz」欄にリクエストしたパラメータが表示されるので、
特定のパラメータの時だけ
・HTTPステータスがおかしい
・他のパラメータの時と比べてレスポンスに時間がかかっている
・他のパラメータの時と比べてレスポンスサイズが大きい/小さい
などの変化を一覧で表示してくれるので、大変便利である。

また、「State」に「Refrected」とあると、リクエストしたパラメータが変更なく反射されたということを表すので、XSSの判定などに便利である。

・ZAPのアップデート
ZAPの「ヘルプ」-「アップデートのチェック」で、「Manege Add-ons」というウィンドウが開き、すでにZAPにインストールされているアドオンのアップデートがある場合には「Installed」タブに「Update」という印がついているので、右のチェックボックスをクリックして「Update Selected」ボタンでアップデートすることができる。



「MarketPlace」タブのほうでアドオンを追加することもでき、ここでstatusが「Release」になっている項目は、リリースレベルであると確認されたものなので追加しても安全とされる。

Betaレベルのアドオンでもベータ版であることを分かった上で追加することもでき、たとえば「SQLMap」がBetaレベルのアドオンとしてリストにあるので、追加してみると、スキャンポリシーのインジェクションカテゴリに「Advanced SQL Injection」という設定項目が増える。
(SQLMapは強力なツールなので、利用には気をつけたほうがよいようです。私は機能追加のテストとしてのみ入れ、ポリシーの項目が増えるのを確認した後アンインストールしました。)


参考資料

Translations / OWASPドキュメント翻訳
https://www.owasp.org/index.php/Japan#Completed
OWASP ZAP マニュアル Ver.2.1.0版 がある(日本語マニュアル)

zaproxy Google Code プロジェクト
https://code.google.com/p/zaproxy/
downloadsのところにUserGuideがある

(参考)別の方のOWASP ZAP ハンズオンセミナーマニュアル
OWASP ZAPのススメ (亀田 勇歩氏)
http://sssslide.com/speakerdeck.com/ykame/owasp-zapfalsesusume

ZAPをぶん回せ(境 稔氏、亀田 勇歩氏)
http://www.slideshare.net/minorsakai/130821-owasp-zed-attack-proxy

8月から毎月一度開催されている「セキュリティ診断(自分でしたら)いかんのか?(OWASP ZAPなら)ええんやで(^ ^)」という、OWASP ZAPハンズオンセミナーに第一回から第三回まで参加し、講師の方に全体的な内容のまとめ&ブログ掲載の許可をいただいたので、これまで私がセミナーで学んだ内容を全部まとめてみます。
時系列に沿ったまとめではなく、セミナーの内容を頭から自習できるような一本の記事に再構成しました。

ブログ記事へのまとめ・編集による間違いやミスの混入の責任は私にあります。 また、一部、セミナーの時にとったメモを見ながら不明点を手元で確かめて書いている箇所があります。

リンク
セミナーの案内ページ(セキュリティ診断手法コミュニティページ)
セキュリティ診断 勉強会
http://security-testing.doorkeeper.jp/
このページにこれまでのセミナーの案内ページへのリンクがあります。

第二回ハンズオンセミナー 資料(Slideshare)
http://www.slideshare.net/nilfigo/sec-test-zap00220140925-40667816

第三回ハンズオンセミナー 資料(Slideshare)
http://www.slideshare.net/nilfigo/sec-test-zap00320141024-40802525

・セミナーの事前準備
ハンズオンセミナーなので、OWASP ZAPが動く環境が必要です。
自習用に環境の整え方を記載しておきます。

準備1: OWASP ZAPインストール
各環境用(win,mac,linux版がある)のOWASP ZAPをこのサイト からダウンロードしてインストール。(要JRE)
本記事ではWindows版ZAPバージョン2.3.1に基づいて解説します。

準備2:ブラウザのプロキシ設定
OWASP ZAPをローカルプロキシとして設定する。

OWASP ZAPは起動するとデフォルトで8080ポートでプロキシとして動作し始めるが、8080ポートは他サービスで利用されている可能性が高いポートなので、他とぶつかる場合は「ツール」-「オプション」の「ローカル・プロキシ」でポートを変更する。



ここで、ホスト名のほうも変更できるが、これはhostsなどでローカルホスト名が変わっている場合などに設定を行う。

そして、利用するブラウザのプロキシ設定を、OWASP ZAPのローカルプロキシのポートに設定する。 (http, https 両方を同じポートに設定する必要がある。)

Firefoxの場合は「ツール」-「オプション」-「詳細」-「接続設定」で下図のように設定する。


講師の松本さんによると、FirefoxであればFoxyProxyというプラグインが、Fiddlerや、ZAP、通常接続などを手軽に切り替えられるのでお勧めとのこと。

プロキシ設定に成功していれば、ブラウザで任意のサイトにアクセスすることで、OWASP ZAPの「サイト」や「履歴」のところにサイトやアクセスログが記録される。

準備3:検査可能なサイトの用意

セミナーでは講師の方が自分のパソコンに「Mutillidae II」という、OWASPで配布している 「やられ役サイト」を立ち上げて、セミナー参加者が一斉にそのアドレスに攻撃(検査)を仕掛ける、という形式だった。

本記事で自習する場合、手順確認用に、何か検査可能な(=壊れても大量アクセスしても他人に迷惑をかけないような)任意のローカルWEBアプリを準備する必要がある。(リモートにあるWEBアプリでは、検査により途中のネットワークに負荷がかかってしまう恐れがあるのでローカルネットワーク内が望ましい)

「Mutillidae II」はWindowsのXAMPP環境でセットアップしてみた限りでは、「Mutillidae II」のZIPアーカイブを解凍して出てきたディレクトリをXAMPPのhtdocs下に置いて、MySQL+Apache有効化してアクセスしただけで使えるようになるので、それを利用してもよい。(本セミナーでは目下「Mutillidae II」に依存した手順は出てきていないので、自分の管理下にある検査可能なサイトがある場合はそのサイトで代用しても良い)

「Mutillidae II」ダウンロードサイトはこちら。
http://sourceforge.net/projects/mutillidae/

※「Mutillidae」って正しくは何て読むのだろう? と思って調べたところ「ミューティリダエ」というのが正しい読み方っぽいです。
発音→http://ja.forvo.com/word/mutillidae/
(私は「ムッチリダエ」で定着してしまったのでこの綴りを書くときは必ず「ムッチリダエ」と内心で読んでいますが)


以下はセミナーの内容です。

・OWASP ZAP って何?
OWASP(The Open Web Application Security Project)が開発および管理しているセキュリティ診断ツール。オープンソースで、世界中のセキュリティエンジニアが開発に加わっている。

・ハンズオンセミナー開催の理由
講師の松本さんが熱い思いを語っておられました。
セキュリティ会社の人間が自前での検査方法をレクチャーするのは、自分の利益を減らすような行為だが、あまりにも今のWEBアプリのセキュリティの状況が悪すぎるので、診断方法を公開して、開発者が自ら検査を行えるようにセミナーを開くことにした、とのことでした。


・セミナー本編
1)「クイックスタート」による検査

まずOWASP ZAPの動きを見るため、一番手軽な「クイックスタート」での検査を行ってみる。
「クイックスタート」での検査では、URL欄に攻撃対象のURLを指定し、ボタンを押すと、自動でリンクをたどってクロールを行い、OWASP ZAPに備わっているさまざまな検査項目を自動で実施してくれる。
これは手軽に検査できるが、微調整ができないので、実際の診断ではあまり使わない。
しかし、クローリング-自動的なスキャン-検出結果出力というZAPの一通りの手順を試すことができるため、ZAPの機能を一通り見ることができる。

「クイックスタート」での検査手順は、

ZAPのウィンドウ左上のプルダウンの値が「Standard Mode」である状態(起動直後のデフォルトではそうなっている)で


クイックスタートタブの「URL」欄に、アタックしてよいURLを指定して「攻撃」ボタン押下


最初にスパイダー検索が走る(ZAPウィンドウ下部の「スパイダー検索」タブが自動的にアクティブになり、クロールの履歴が表示される)

次に、OWASP ZAPに設定されているポリシーにより
・静的スキャン
・動的スキャン
が実施され(「動的スキャン」タブが自動的にアクティブになる)、スキャンが終わると結果が表示される。

ここでのプチテクニックとして、分かりにくいが「動的スキャン」タブのプログレスバーの左隣に、グラフのようなアイコンがあり、これを押下すると、現在の検査の進捗が別ウィンドウで表示される。





カテゴリ別にどのくらい検査が進んでいるかがプログレスバーで表示される。
「status」欄にある再生一時停止ボタンのようなマークをクリックすると、そのジャンルの検査をそこで終えて次のカテゴリの検査に移る。上の画面は「パストラバーサル」の検査を途中でスキップしたときのキャプチャ。

自動検査が終わると、「アラート」タブに切り替わって見つかった脆弱性が表示される。

※ここで、twitterなどの外部サイトへリンクがある場合、勝手にそっちのサイトまでクロールして検査してしまうのではないかと不安になる方もいると思われるが、クイックスタートでURLを指定した場合は、ドメインレベルで違うサイトにまでは検査は行わないようになっており、例えば、URLに「http://127.0.0.1/mutillidae/」を指定した場合、Mutillidaeからリンクが貼られているhttp://www.owasp.org、http://sourceforge.net、http://www.kali.orgなどのページは、クロール結果に出ては来るが「OUT_OF_SCOPE」(スコープ外)として表示される。



前方一致ではなくあくまでドメインレベルで歯止めをかけているだけらしく、探査するディレクトリを制限したくて「http://127.0.0.1/mutillidae/xxx/」を指定しても、上のディレクトリは探査対象に入るようで、「http://127.0.0.1/mutillidae/」や「http://127.0.0.1」は対象になってしまう。

スキャンポリシー

OWASP ZAPは、自動検査の強度(Strength)や閾値(Threshold)を設定することができる。
「メニュー」-「スキャンポリシー」を選択すると、別ウィンドウで、スキャンポリシーの設定画面が開く。ここでの設定値に基づいて、自動検査の強度が決定される。



各カテゴリごとに「Threshold」「Strength」という設定項目がついている。

それぞれ選べる設定値は次のとおり。


「Threshold」を「OFF」にすると、そのカテゴリの検査を行わないようにできる。「LOW」~「HIGH」についてはパラメータの多さなどの調整になるとのこと。

「Strength」については、具体的な意味をセミナーで質問するのを忘れてしまったが、ZAPのヘルプによると「strength (the number of attacks they perform)」と書いてある箇所があるので、攻撃の回数を表す模様。「insane」にするとダメージが大きい模様(insaneってどういう意味だっけ? と思って辞書引いてみたら「正気でない、狂気の」とあった)。

「Threshold」「Strength」は、OSSの開発のプロセスでバランス調整が行われているのが期待されるので、基本はDefaultで良い。
また、各カテゴリを選択すると、その内部でも細かく検査項目が分かれており、その項目ごとに「Threshold」「Strength」を個別で設定することができ、そうやってカスタマイズしたスキャンポリシーに名前をつけて保存することも可能。

カテゴリ内の設定項目の例)「インジェクション」の設定項目


「Passive」カテゴリだけは「Threshold」の選択項目がなく、OFFにできないが、これはいわゆる「静的スキャン(受動的スキャン)」だからで、通常のアクセスログから分かるような脆弱性(が疑われる箇所)を指摘するものなので、OFFにする必然性がないからと思われる。(静的スキャンはスパイダーによるクロール時に既に行われてしまう模様)

ここで、特定のカテゴリのみDefault、他のカテゴリを全部OFFにすると、例えばディレクトリトラバーサルのみ、SQLインジェクションのみ、という検査を走らせることも可能になる。

※セミナーで紹介されてはいないのですが、OWASP ZAPのスキャンポリシーの検査項目については、下記 Yuki 氏 のサイトにかなり詳しい説明があったので、参考資料としてリンクしておきます。
OWASP ZAP スキャンポリシーの検査項目一覧(Release版)(Web Application Security Memo)


OWASP ZAP ハンズオンセミナー 「セキュリティ診断(自分でしたら)いかんのか?(OWASP ZAPなら)ええんやで(^ ^)」第一回~第三回の内容まとめ・後編へ続く

Powered by Blogger.
© WEB系情報セキュリティ学習メモ Suffusion theme by Sayontan Sinha. Converted by tmwwtw for LiteThemes.com.