診断ツールを作ってみようと思う

36
Web アアアアアアアア アアアアアアアアアア

Upload: abendcve99990001

Post on 28-May-2015

963 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: 診断ツールを作ってみようと思う

Web アプリ診断ツールを作ってみようと思う。

Page 2: 診断ツールを作ってみようと思う

自己紹介Titter : abend@number3to4

Web アプリケーションのセキュリティをメインでやっています。ときどき、お酒を Inject することが趣味です。

Page 3: 診断ツールを作ってみようと思う

Web アプリ診断ってWeb アプリケーションに内在する脆弱性を発見するための手法の1つ。

http://www.slideshare.net/abend_cve_9999_0001/web-22186183

参考( Web アプリって奥が深いんです)

それ以外に・ペネトレーション・ソースコード診断・ファジング…etc

Page 4: 診断ツールを作ってみようと思う

どうやる?

脆弱性の有無を判定

1)リクエストに攻撃パターンを付加。

2)レスポンスの内容から脆弱性の有無を判定。

診断対象

リクエスト

レスポンス

攻撃パターン付加

Page 5: 診断ツールを作ってみようと思う

診断対象画面ログイン画面

ユーザ名:パスワード:

ログイン画面

ユーザ名:パスワード:

 

 

ログイン

様々な攻撃パターンを試行。・「 "><script>alert()</alert> 」・「 ' 」・「 '|||' 」・記号や Null 文字(空文字)・ 5000 バイトの文字列

1)各項目に数十~百パターン程度試行。

2)レスポンスの内容により、攻撃パターンを修正し試行。

どうやる?2

Page 6: 診断ツールを作ってみようと思う

ヒトがやるんだったら

「 ' 」を入力「 ' 」を入力

WebアプリWebアプリ 「 java.sql.SQLException:[Microsoft][ODBC SQL Server Driver][SQL Server]オブジェクト名 'xxxx' は無効です。」が出力

「 java.sql.SQLException:[Microsoft][ODBC SQL Server Driver][SQL Server]オブジェクト名 'xxxx' は無効です。」が出力

リクエストレスポンスブラックボックス

この結果なら、次は「 '+' 」にしよう。

Page 7: 診断ツールを作ってみようと思う

ツールって1ツールは、決まったルール(プログラム)に従い、決まった内容

をリクエスト。

敷かれたレールの上でしか動けないのです。

Page 8: 診断ツールを作ってみようと思う

ツールって2

レスポンスの評価する手法も3つが一般的だと思う。

Page 9: 診断ツールを作ってみようと思う

ツールって3①  grep

リクエストした内容がレスポンスにどう出力されているか。

怪しそうな文字列を探し出す。

Page 10: 診断ツールを作ってみようと思う

ツールって4②  diff

複数のレスポンス結果にどんな差分が存在しているか。

似たような結果であったとしても、どんな差分が

出ているか差分内容を精査する必要あり。

Page 11: 診断ツールを作ってみようと思う

ツールって5③ 挙動のチェック

レスポンス時間など挙動にどんな差分が存在しているか。

本来のキモいほどの激しい挙動が特定リクエストで遅くなる

など動きに差分がないかを確認する。

Page 12: 診断ツールを作ってみようと思う

ヒトとツールの違い1ツールのダメなところ

・検出できない項目がある。

・診断できないアプリケーションがある。

4)、 8)、 9)がツールでは

検出が不可または困難。

○  CAPCHAなど視覚を必要とするもの

○ パラメータをクラインアント側で生成するもの

                      など

Page 13: 診断ツールを作ってみようと思う

ヒトとツールの違い2ツールのいいところ

・ヒトと違い、バグがなければミスがない。

・ヒトよりも早い。

サーバの通信状況にもよるが、

2秒あれば送信も可能。

こんなこともできるようになる

Page 14: 診断ツールを作ってみようと思う

適材適所

ヒトの仕事を減らすために。

ヒトのようにミスがないので定型的な箇所はツールに、それ以外

をヒトが行うようにする。

Page 15: 診断ツールを作ってみようと思う

想定される構成こんな構成を想定しています。

診断対象

操作端末

開発対象

①「操作端末」から診断

対象にアクセスして、

「開発対象」に「診断

対象」の情報を蓄積。

③「開発対象」に蓄積

された情報から「診断

対象」へ診断。

「診断対象」の情報

②「診断対象」

の情報を蓄積。

Page 16: 診断ツールを作ってみようと思う

どんなツールにするか1

・ GUIで操作できるようにしたい。

・お手軽に結果が得られるようにしたい。

・ Javaクライアントアプリにしたい。

・ DBを使わなくてもイケるようにしたい。

どんなツールにするか考えてみた。

Page 17: 診断ツールを作ってみようと思う

どんなツールにするか2

・診断対象取り込み機能

・診断機能

・結果分析機能

・レポート機能

・スペシャル機能

機能は、こんな感じ。

Page 18: 診断ツールを作ってみようと思う

なので、作り始めた(と思う)一番最初にやり始めたのは、多分 2年前。途中まで作っていた

ことを最近思い出して、また再開させた。

ふと作り始めた診断ツールを命名するときに、尾崎豊の Shelly

聞いていたので、「 Shelly」に命名。

Page 19: 診断ツールを作ってみようと思う

Shelly

機能 実装状況

診断対象取り込み機能 ×

診断機能 △

結果分析機能 △

レポート機能 ×

スペシャル機能 ×

いまの現状は、というと

ほとんどできていない。

Page 20: 診断ツールを作ってみようと思う

診断対象取り込み機能1

「操作端末」の Proxyとして動作させて、アクセスした「診断対

象」

の情報(リクエストとレスポンス)を保存させる。

ローカル Proxyとして動作し、 Proxyした結果から「診断対

象」の

リクエストやレスポンスを自動的に抽出できるようにしたい。

Page 21: 診断ツールを作ってみようと思う

診断対象取り込み機能2

実装するときに以下を注意する必要がある(と思ってます)。

・ HTTPSの取り扱いに関して

診断対象操作端末Shelly

暗号化された通信暗号化された通信

「診断対象」の証明書Shellyの証明書

Shellyの証明書は自己証明書で「操作端末」と通信をする必要がある。

Page 22: 診断ツールを作ってみようと思う

診断機能1

保存されたリクエスト情報をもとに、「診断対象」に攻撃パター

を付加したリクエストを送信する。

リクエスト情報・ URL・パラメータ…etc

攻撃パターン

アドオン

Page 23: 診断ツールを作ってみようと思う

診断機能2

HTTPS時の Proxyに関して

HTTPリクエストを送る前に CONNECTメソッドを送信

し、 Socket

通信できるように準備が必要となる。

Page 24: 診断ツールを作ってみようと思う

診断機能3オレオレ証明書を用いたサイトへのアクセス

オレオレ証明書などの不正な証明書を使用しているサイトへの

アクセスは、 NoSuchAlgorithmExceptionが発生してしまう

ため

initSSLContextをオーバライドさせて、オレオレ証明書のサイ

でもアクセスできるようにした方がいい。

Page 25: 診断ツールを作ってみようと思う

結果分析機能1

リクエストした内容に応じて、レスポンス結果を分析する機能。

分析に必要なことは前述のとおり。

grep diff 挙動のチェック

実装済み 実装済み 未実装

Page 26: 診断ツールを作ってみようと思う

結果分析機能2grepに関して

XSSだけでも攻撃パターンは複数のパターンになるが、すべて

同じ文字列を grepすればいいというわけではない。

入力例  "><script>alert(48264)</script>

特定のリクエストで出力された結果であることを確認する

ために、入力値にランダムな数値をセットして、それを

検出するようにする。

検出例  alert(48264)

Page 27: 診断ツールを作ってみようと思う

結果分析機能3alert(xxxx)という文字列を grepし、アウトする場合

過剰検知( FalsePositive)が多数検出される可能性が高

い。

お問合せフォームなどフリーフォーマット(記号も入力を許可)

の場合に、脆弱性がなくても検出してしまう可能性が高い。

Page 28: 診断ツールを作ってみようと思う

結果分析機能4SQLインジェクションの場合

SQL文の断片が評価されたことを検知できる仕組みが必要

だけど、それって結構むずい。

Page 29: 診断ツールを作ってみようと思う

結果分析機能5たとえば、認証が通った場合にレスポンスの「 $flg」が 1に

セット

され、それ以外は 0にセットされるようなアプリケーションでは

~~省略~~

<script>

var flg = $flg;

if(flg == 1){

location.href='http://xxx/ok'

}else{

location.href='http://xxx/ng'

}

</script>

~~省略~~

POST /login HTTP/1.0

Id=1&pass=secret

リクエスト レスポンス

Page 30: 診断ツールを作ってみようと思う

結果分析機能6

それだと、変化の割合(全体に対してどのくらい変化があったか)

のみの評価では、検知漏れ( False Negative)につながる。

「 ' or 'a’ = 'a」、「 ' or 'a’ = 'b」の真偽値の違いと

レスポンスの差分から脆弱性の有無を判定するブラインド SQL

インジェクションの場合、差分が 1行しかない可能性がある。

検知漏れをなくすためには、変化の割合ではなく、変化の有無を

確認する必要があるが、時間の経過とともに、レスポンスが変化

するアプリケーションは多数存在するため、過剰検知( False

Positive)が増える。

Page 31: 診断ツールを作ってみようと思う

結果分析機能7

変更のあった割合と変更のあった内容をサマリ化し、ヒトが

内容を確認することで検知漏れを少なくするようにした。

ツールにすべてを任せるのは難しいので

まだまだ、改善の余地がある。。。

Page 32: 診断ツールを作ってみようと思う

レポート機能脆弱性を見つけた後は直す必要があるので、開発者が直しやすい

ように、どんな問題がどこにあったかをまとめる。

・検出箇所

・検出した脆弱性

・検出した際のリクエストおよびレスポンスログ

Page 33: 診断ツールを作ってみようと思う

スペシャル機能診断をしているときの気晴らし機能は、絶対に必要!!

例:

「↑↑↓↓→← →← AB」打つと、スレッド化されてリクエスト

が 2 倍出力される。

本当に 2 倍もリクエスト出している

と小ばかにするための機能。

性格のゆがんだ方にオススメ。

この機能は、どんどん追加していく所存です。

Page 34: 診断ツールを作ってみようと思う

それ以外にも1シグネチャに関して

データベースを使わないことを前提にしているので

1つのシグネチャを 1つのファイルとして管理する。

Page 35: 診断ツールを作ってみようと思う

それ以外にも2ログの取り方に関して

すべてのリクエストとレスポンスは、自動的に蓄積される

ようにする。

それとは別に、個別に脆弱性を検出した際のログを出力させる。

理由は、膨れたログから検索するのがめんどいから。

Page 36: 診断ツールを作ってみようと思う

さいごに

いつ完成するか不明だが、完成したら公開しようと思ってます。