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なら)ええんやで(^ ^)」第一回~第三回の内容まとめ・後編へ続く