本サイトは、快適にご利用いただくためにクッキー(Cookie)を使用しております。
Cookieの使用に同意いただける場合は「同意する」ボタンを押してください。
なお本サイトのCookie使用については、「個人情報保護方針」をご覧ください。
MBSDの国分です。
先日参加したワーキンググループ(後の懇親会)で、私を含む3人が同じポーズで写真を撮られていたことがわかりました。 偶然その3人が別々のウェブプロキシツールを使っていたため、並べるとプロキシツールのエバンジェリストっぽいと言われました。 日々プロキシツールの普及に努めている本物のエバンジェリストさんに失礼なので、ジェリストくらいでいいです…。 とはいえ折角の機会なので、私が普段愛用しているプロキシツール「Burp Suite」について紹介したいと思います。
Burp Suiteは様々な機能を持っており、その中で私が最も使う機能は「Proxy」です。 診断やデバッグに必須の機能です。詳細は割愛します。
一方、最も好きな機能は「Manual testing simulator」です。この機能は有償のプロフェッショナル版にのみ含まれる機能で、無償版では使えません。 この機能は、様々なテストパターンを使って対象のサーバにアクセスします。 ただ、インタフェースが非常に簡易的なもので、何をしているのか履歴の確認はできず、速度も遅いです。 Burp Suiteを使ったことのある方ならご存じであろう「Scanner」や「Intruder」と似かよっています。 また競合他社でWebアプリケーション診断をしているプロフェッショナルたちに聞いてみると、存在すら知られていなかったりするなど、使っているという声を聞いたことがないので、実はあまり有用ではない機能なのかもしれません。
なぜそんな機能がなぜプロフェッショナル版だけに含まれているのでしょうか。その動作の詳細を調べていきたいと思います。
この機能を使うには、まずBurp Proxy経由で対象のWebサイトにアクセスして、TargetタブのSite mapタブに、対象が含まれている状態にします。 その後、表示されている対象の1つを選択し、右クリックのコンテキストメニューから、"Engagement tools"→"Simulate manual testing" をクリックします。
すると、"Manual testing simulator"というウィンドウが開きます。 このウィンドウでできる操作はたった2つ、左上のクエスチョンマークをクリックしてヘルプを表示するか、"Simulation running"のチェックボックスをクリックするか、です。
とりあえずチェックボックスにチェックを入れてみると、いきなりこの機能が稼働し始めます。 しばらく眺めていると、"Request made"の数字や 一番下の "Modified value"などが刻々と変わっていくのが見えると思います。
特に"Modified value"を見ていると、"><script>alert(document.cookie)</script>
など、Webアプリケーションへの攻撃に使われるような文字列が表示されています。
[27/Jul/2015:13:41:01 +0000] "GET /burp.jsp?param=mbsd\"><script>alert(document.cookie)</script> HTTP/1.1" 404 285 [27/Jul/2015:13:41:12 +0000] "GET /burp.jsp?param=mbsd%00 HTTP/1.1" 404 285 [27/Jul/2015:13:41:21 +0000] "GET /burp.jsp?param=%u0000 HTTP/1.1" 404 285 [27/Jul/2015:13:41:24 +0000] "GET /burp.jsp?param=\"><img%20src=a%20onerror=alert(document.cookie)> HTTP/1.1" 404 285 [27/Jul/2015:13:41:27 +0000] "GET /burp.jsp?param=mbsd../../../../../../../../etc/passwd HTTP/1.1" 404 285 [27/Jul/2015:13:41:31 +0000] "GET /burp.jsp?param=../../../../../../../../etc/passwd%00 HTTP/1.1" 404 285 [27/Jul/2015:13:41:36 +0000] "GET /burp.jsp?param=mbsd<img%20src=a%20onerror=alert('test6a91cd9')> HTTP/1.1" 404 285 [27/Jul/2015:13:41:44 +0000] "GET /burp.jsp?param=mbsd<script>alert('testb9652')</script> HTTP/1.1" 404 285 [27/Jul/2015:13:41:46 +0000] "GET /burp.jsp?param=mbsd\"><img%20src=a%20onerror=alert('test559d')> HTTP/1.1" 404 285 [27/Jul/2015:13:41:54 +0000] "GET /burp.jsp?param=mbsd%00 HTTP/1.1" 404 285 [27/Jul/2015:13:42:05 +0000] "GET /burp.jsp?param=%00%0d%0aTest%3a%20f9c738b HTTP/1.1" 404 285 [27/Jul/2015:13:42:17 +0000] "GET /burp.jsp?param=mbsd%00 HTTP/1.1" 404 285 [27/Jul/2015:13:42:25 +0000] "GET /burp.jsp?param=mbsd%u0000 HTTP/1.1" 404 285 [27/Jul/2015:13:42:35 +0000] "GET /burp.jsp?param=mbsd%00 HTTP/1.1" 404 285 [27/Jul/2015:13:42:43 +0000] "GET /burp.jsp?param=%00test6ce325 HTTP/1.1" 404 285 [27/Jul/2015:13:42:51 +0000] "GET /burp.jsp?param=mbsdtest04a0 HTTP/1.1" 404 285 [27/Jul/2015:13:42:54 +0000] "GET /burp.jsp?param=mbsd\"><script>alert(document.cookie)</script> HTTP/1.1" 404 285 [27/Jul/2015:13:43:01 +0000] "GET /burp.jsp?param=\"><img%20src=a%20onerror=alert(document.cookie)> HTTP/1.1" 404 285 [27/Jul/2015:13:43:04 +0000] "GET /burp.jsp?param=mbsd\"><script>alert('test8')</script> HTTP/1.1" 404 285 [27/Jul/2015:13:43:10 +0000] "GET /burp.jsp?param=mbsd\"><img%20src=a%20onerror=alert(document.cookie)> HTTP/1.1" 404 285 [27/Jul/2015:13:43:18 +0000] "GET /burp.jsp?param=mbsd../../../../../../../../etc/passwd HTTP/1.1" 404 285 [27/Jul/2015:13:43:27 +0000] "GET /burp.jsp?param=mbsd../../../../../../../../etc/passwd%00 HTTP/1.1" 404 285 [27/Jul/2015:13:43:37 +0000] "GET /burp.jsp?param=%2527 HTTP/1.1" 404 285 [27/Jul/2015:13:43:49 +0000] "GET /burp.jsp?param=mbsd\\' HTTP/1.1" 404 285 [27/Jul/2015:13:43:54 +0000] "GET /burp.jsp?param=\"><img%20src=a%20onerror=alert(document.cookie)> HTTP/1.1" 404 285 [27/Jul/2015:13:44:01 +0000] "GET /burp.jsp?param=\"><script>alert(document.cookie)</script> HTTP/1.1" 404 285 [27/Jul/2015:13:44:03 +0000] "GET /burp.jsp?param=mbsdtesta3 HTTP/1.1" 404 285 [27/Jul/2015:13:44:09 +0000] "GET /burp.jsp?param=<foo> HTTP/1.1" 404 285 [27/Jul/2015:13:44:20 +0000] "GET /burp.jsp?param=mbsdtest03 HTTP/1.1" 404 285 [27/Jul/2015:13:44:28 +0000] "GET /burp.jsp?param=mbsd' HTTP/1.1" 404 285 [27/Jul/2015:13:44:30 +0000] "GET /burp.jsp?param=%27 HTTP/1.1" 404 285 [27/Jul/2015:13:44:35 +0000] "GET /burp.jsp?param=mbsd' HTTP/1.1" 404 285 [27/Jul/2015:13:44:39 +0000] "GET /burp.jsp?param=]]>> HTTP/1.1" 404 285 [27/Jul/2015:13:44:49 +0000] "GET /burp.jsp?param=mbsd<!--6feef--> HTTP/1.1" 404 285 [27/Jul/2015:13:44:59 +0000] "GET /burp.jsp?param=mbsd]]>> HTTP/1.1" 404 285 [27/Jul/2015:13:45:09 +0000] "GET /burp.jsp?param=' HTTP/1.1" 404 285
いかにも攻撃されてる、って感じのログですね。 どのような疑似攻撃をしているのか、Webサーバ側のログから精査してみたいと思います。
パターン1: HTMLエスケープ漏れを狙ったXSS?
おおざっぱに分類すると、次の3種類を観測しました。
- 「
<
」「>
」を1文字だけ - HTMLタグっぽい文字列(例: 「
<foo>
」「</foo>
」「<!--ランダム-->
」) alert
を含むパターン例(「<img%20src=a%20onerror=alert(document.cookie)>
」「<script>alert(document.cookie)</script>
」)
ただ、上記の文字列をそのまま送るだけではなく、以下のパターンを1つ以上組み合わせているため、実際に送られる文字列のバリエーションは多くなります。(以下のパターンでも同様です)
- 元の文字列に追加する(例えば、「
mbsd<script>alert(document.cookie)</script>
」など) - 先頭に「
">
」を追加する(例えば、「"><script>alert(document.cookie)</script>
」など) document.cookie
の代わりに適当な文字列(例えば、「'test1f94a5e'
」)
パターン2:JavaScriptのエスケープ漏れを狙ったXSS?
次の2種類を観測しました。
]]>>
'%3balert('testランダム')%3b//
パターン3: SQL Injection?
「or'a'='a
」のような危険なパターンは送っておらず、エラーを誘発させる程度の安全なパターンのみのようです。
'
'--
''
\'
%2527
%27
パターン4: Directory Traversal?
Windows と UNIX用、それぞれ1種類ずつを観測しました。
..\..\..\..\..\..\..\..\boot.ini
../../../../../../../../etc/passwd
こちらは末尾に、「%00」を追加するバリエーションもありました。
パターン5: CRLF Injection?
%0d%0aTest%3a%20ランダム
「%0d%0a
」の代わりに、「%0a
」「\r\n
」「\n
」を使うバリエーションもありました。
パターン6: NULL Injection?
%00
や%u0000
の2種類が、元の文字列や適当な文字列の前後に使われていました。
例:
mbsd%00
mbsd%u0000
%00ランダム
いずれのパターンも、脆弱性診断の教科書に出てきそうな、典型的な文字列が送られていることが分かります。
前述のようなWebアプリケーションの脆弱性を探すための文字列を自動的に送ってくれるツールを、Burp Suiteは他にも持っています。 1つがScannerで、上記の文字列よりももっと多くのテストパターンを自動的に送信して、脆弱性を探し出すツールです。 もう1つがIntruderで、こちらは自分で作成したテストパターンのリストを使って、自動的にテストをするツールです。 これと比べてManual testing simulatorは、パターン数は圧倒的に少ないので、脆弱性を探すには不十分と言えるでしょう。
それではこのツールの使いどころはどこなのでしょうか。 "Manual testing simulator"ウィンドウでできるもう一つの操作、クエスチョンマークボタンをクリックしてヘルプを表示すると、その答えが書かれています。
あなたがちゃんと仕事をしているか誰かがWebアプリケーションのログをレビューするかもしれないと思うなら、長めの昼食・ジムでトレーニング・しびれるような呑み会、あるいはその他の気分転換をしている間、この機能が使えるでしょう。
なんと、手動で診断している風のログを、対象サーバに自動的に残すためのツールだったんです(笑)。 プロフェッショナル版にしか含まれてない理由も分かりました。気分転換をしている間ですら仕事をしているような姿を顧客に見せ続ける姿勢が、まさにプロフェッショナルですね。
その観点で、もう一度サーバのログを見てみましょう。
ScannerやIntruderが、1秒間に100リクエスト以上送信するのに比べて、simulatorは多くても1分間に10リクエスト程度。熟練の診断士からすると若干遅いですが、人間が考えながら手動で診断をするのを真似た絶妙なタイミングでリクエストを飛ばしています。
送っているパターンは先程述べた通り教科書に載っていそうな典型的なパターンです。先輩が初心者のために診断の仕方を教えている、そんな情景も思い浮かびます。
また上記のログをよく見ると、全部404で返ってきています。最初にサンプルを採取したリクエストが悪かったのですが、そんなエラーにも挫けず黙々と診断をしていくこの愚直な姿勢・根気が、脆弱性診断には求められます。このツールはその心意気をも教えてくれています。
なお、どのようなリクエストを送ってレスポンスがどうなっていたかは、ツール上からは確認できません。これではもし何かトラブルが発生したときに、診断が原因なのかどうか調査できません。席を外している間に何が起きたのかさかのぼって調査できるよう、しっかりとログを取っておくことをお勧めします。OptionsタブのMiscタブに移動し、Loggingセクションの"All tools"の、RequestsとResponses両方にチェックを入れておくと、ファイルにシミュレータのリクエストとレスポンスが全て記録されます。
今回は、Burp Suite の Manual testing simulator 機能を紹介しました。 人間による診断を模しているものの、機械感を完全消し切れているわけではないので、よく見ればツールからのアクセスであることに気がつかれるでしょう。診断をしている振りをしてサボるには実力不足です。 ヘルプには息抜きの時に使うと書いてありましたが、使いどころはそれだけではないと思います。例えば診断期間中でも、手元に検証環境を構築して検証していると、診断対象サーバにしばらくアクセスしないことがあります。アクセスがないことを心配されるお客様もいますので、その気遣いとして使う程度が適当だと思います。
今回は、Burp Suite のマイナーな機能を紹介しました。ジェリストなので。Burp Suiteの主要機能やその他のプロキシツールについては、エバンジェリストさんらの発表資料をご覧下さい。
http://www.slideshare.net/zaki4649/proxy-war-42161988
また、Fiddlerジェリストの長谷川さんのブログ記事はこちらです。
https://www.securesky-tech.com/column/techlog/04.html
国分裕
おすすめ記事