にわかエンジニア好きなことを書く備忘録

個人用の備忘録となるので内容の保証はないのでその点はご了承ください。 ※変な内容や間違いを書いているなどありましたらコメントやご指摘いただけると幸いです。

OWASP ZAP2.7でzap-API を使ってSpiderの実行

 

概要

ZAPのAPI(UI)を使用してブラウザ操作でAPI用URLを作成する。

その後、curlでURLを使ってZAPからWebサーバに向けて スパイダーを実施し結果reportの確認を行えることを確認できた。

また、他のCLIベースやbaselineなどで実施したときには設定できなかった設定(本来は設定可能で単に設定方法を知らないだけかも)をコンテキストに追加し設定できた。

 

構成

f:id:pocket01:20180115003244p:plain

 

ZAPのAPIによる操作

ApiDetails · zaproxy/zaproxy Wiki · GitHub

HelpStartConceptsApi · zaproxy/zap-core-help Wiki · GitHub

上記を参考にして、URLformatにしたがってAPIが使用できるのかを確認する。

【フォーマット】

http(s)://xxx.xxx.xxx.xx:0000/UI/<format>/<Components>/<operation>/<name>/?[parameter]

 

(例)ZAPバージョン取得

http://192.168.20.165:8080/JSON/core/view/version/?zapapiformat=JSON&formMethod=GET

■設定値

format:JSON
Components:core
operation:view
name:version
parameter:zapapiformat=JSON&formMethod=GET

■実施画面

f:id:pocket01:20180115013701p:plain

(例)SCAN実施後アラート情報

http://192.168.20.165:8080/HTML/core/view/alertsSummary/?zapapiformat=HTML&formMethod=GET&baseurl=http://192.168.20.161

■設定値

format:HTML
Components:core
operation:view
name:alertsSummary
parameter:zapapiformat=HTML&formMethod=GET&baseurl=http://192.168.20.161

 ■実施画面

f:id:pocket01:20180115014823p:plain

スパイダー実施用API作成

ZAPの起動

ZAP(コンテン)を起動させる。(接続ポート:8080)

docker run -v $(pwd)/out:/zap/wrk/:rw -u root -d -p 8080:8080 \
-i owasp/zap2docker-stable zap.sh \
-daemon -host 0.0.0.0 -port 8080 \
-config api.disablekey=true \
-config api.addrs.addr.name=.* \
-config api.addrs.addr.regex=true

APIキーを無効:-config api.disablekey = true
任意のIPからAPIへのアクセスを許可:-config api.addrs.addr.name=.* -config api.addrs.addr.regex=true
接続ポート:8080

クライアントからブラウザでAPI(UI)にアクセス

http://192.168.20.165:8080でAPI(UI)画面に接続できる。

f:id:pocket01:20180115000804p:plain

API用URLの取得

"Local API"からリンクをたどり、Componentsとoperationを選択し設定/確認画面を開く

(例)SCAN実施後アラート情報取得のための設定画面

Component: core を選択し、operatoinは viewalertsSummary を選択し設定画面を開いてみた。

f:id:pocket01:20180115020111p:plain

 

アラートのサマリ情報表示画面(HTMLフォーマット)が表示されたことが分かる。

※この画面のURLのアドレスフィールドにはAPI用URLが表示されるので、このURLを直接入力することでも結果の表示が可能となる。

f:id:pocket01:20180115020120p:plain

 

アラートのサマリ情報表示をJSONフォーマットで表示した場合

f:id:pocket01:20180115020556p:plain

また、このときのJSON形式で表示させたURLを、curlコマンドで直接入力すると情報が取得できることが分かる。

 ■curlコマンドでの取得結果

# curl "http://192.168.20.165:8080/JSON/core/view/alertsSummary/?zapapiformat=HTML&formMethod=GET&baseurl=http%3A%2F%2F192.168.20.161"
{"High":0,"Low":97,"Medium":23,"Informational":0}

 ブラウザ操作時と同じ値が取得できる

 

Spider実施用URL作成

モード指定

テストモード設定(protect) 

mode:protect これでプロテクトモードで起動できる??

http://192.168.20.165:8080/JSON/core/action/setMode/?zapapiformat=JSON&formMethod=GET&mode=protect

context

Context作成

contextName:WebScanContext

http://192.168.20.165:8080/JSON/context/action/newContext/?zapapiformat=JSON&formMethod=GET&contextName=WebScanContext
SCAN対象URLをContextに追加

regex:http://192.168.20.161.*

http://192.168.20.165:8080/JSON/context/action/includeInContext/?zapapiformat=JSON&formMethod=GET&contextName=WebScanContext®ex=http%3A%2F%2F192.168.20.161.*
 Contextの確認
http://192.168.20.165:8080/JSON/context/view/context/?zapapiformat=JSON&formMethod=GET&contextName=WebScanContext

f:id:pocket01:20180116202702p:plain

spider用設定

(option設定)継続時間設定
http://192.168.20.165:8080/JSON/spider/action/setOptionMaxDuration/?zapapiformat=JSON&formMethod=GET&Integer=10
 (option設定)クロールの深度設定
http://192.168.20.165:8080/JSON/spider/action/setOptionMaxDepth/?zapapiformat=JSON&formMethod=GET&Integer=5

※ZAPツール上での設定個所

f:id:pocket01:20180116193550p:plain

(option設定)RobotsTxt設定 

初期値は未確認

http://192.168.20.165:8080/JSON/spider/action/setOptionParseRobotsTxt/?zapapiformat=JSON&formMethod=GET&Boolean=true
(option設定)SitemapXml設定

初期値は未確認

http://192.168.20.165:8080/JSON/spider/action/setOptionParseSitemapXml/?zapapiformat=JSON&formMethod=GET&Boolean=true

APIでのspiderを実施

http://192.168.20.165:8080/JSON/spider/action/scan/?zapapiformat=JSON&formMethod=GET&url=http%3A%2F%2F192.168.20.161&maxChildren=&recurse=&contextName=WebScanContext&subtreeOnly=

実施状況確認

■ステータス

(IDや進捗が見れる)※表示例の”100”の個所が進捗となる

http://192.168.20.165:8080/JSON/spider/view/scans/?zapapiformat=JSON&formMethod=GET
f:id:pocket01:20180116200400p:plain

■進捗確認

(ID:0 で確認:Statusが 0 ~ 100 で変化していく)

http://192.168.20.165:8080/JSON/spider/view/status/?zapapiformat=JSON&formMethod=GET&scanId=0

f:id:pocket01:20180116200549p:plain

アラート情報確認

■report出力(JSON形式)

http://192.168.20.165:8080/JSON/core/view/alert/?zapapiformat=JSON&formMethod=GET&id=0

※HTML形式での表示

f:id:pocket01:20180116201001p:plain

■全件確認

http://192.168.20.165:8080/JSON/core/view/alerts/?zapapiformat=JSON&formMethod=GET&baseurl=http%3A%2F%2F192.168.20.161&start=&count=&riskId=

※HTML形式での表示 

f:id:pocket01:20180116201310p:plain

■サマリ確認

http://192.168.20.165:8080/JSON/core/view/alertsSummary/?zapapiformat=JSON&formMethod=GET&baseurl=http%3A%2F%2F192.168.20.161

※HTML形式での表示

f:id:pocket01:20180116204249p:plain

 

■JSON表示を整形し抽出(スパイダーで取得したURL確認)

診断対象が指定しているアドレスのみアラートが出ているのかをURLを抽出して確認する。

他のグローバルサイトのアドレスはなかったため、一応指定アドレスのみ診断対象となっていそうでした。

# curl "http://192.168.20.165:8080/JSON/core/view/alerts/?zapapiformat=JSON&formMethod=GET&baseurl=http%3A%2F%2F192.168.20.161&start=&count=&riskId=" | jq -r '.alerts[] | .url '
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 5666k 100 5666k 0 0 3759k 0 0:00:01 0:00:01 --:--:-- 3757k
http://192.168.20.161/robots.txt
http://192.168.20.161
http://192.168.20.161
http://192.168.20.161
http://192.168.20.161/sitemap.xml
http://192.168.20.161/wp-admin/admin-ajax.php

~省略~

http://192.168.20.161/wp-includes/js/tinymce/utils/
http://192.168.20.161/wp-includes/js/tinymce/utils/
http://192.168.20.161/wp-includes/js/tinymce/utils/
http://192.168.20.161/wp-includes/js/tinymce/tinymce.min.js
http://192.168.20.161/wp-includes/js/tinymce/wp-tinymce.js.gz
http://192.168.20.161/icons/compressed.gif
http://192.168.20.161/wp-includes/js/tinymce/wp-tinymce.php
http://192.168.20.161/wp-includes/js/thickbox/?C=N;O=D
http://192.168.20.161/wp-includes/js/thickbox/?C=N;O=D

~省略~

http://192.168.20.161/wp-includes/js/tinymce/utils/?C=S;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=S;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=D;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=D;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=D;O=D
http://192.168.20.161/wp-includes/js/tinymce/utils/?C=D;O=D