Hatena::ブログ(Diary)

思い立ったら書く日記

2010-03-06

Firefox Add-on「NoRedirect」で HTTP レスポンスコードによるリダイレクトを防止する

| 22:20 | Firefox Add-on「NoRedirect」で HTTP レスポンスコードによるリダイレクトを防止するを含むブックマーク

いわゆる Gumblar に .htaccess を悪用して Exploit コードが仕込まれたサイトに誘導される方法が確認されたようですね。ラックが発表した注意喚起の動作概要を引用します。

【動作概要】

この.htaccessファイルが置かれる影響は、主要検索サイトからのアクセス、および404、403などのエラーがApacheのリダイレクト機能で攻撃サイトに転送されることです。攻撃サイトに転送された後、他のGumblar攻撃と同様に、悪性プログラムの感染被害に遭われることが推測されます。

Gumblar(ガンブラー)ウイルスによる新たなホームページ改ざん被害を確認 | 注意喚起 | 注意喚起情報 | セキュリティ情報 | 株式会社ラック

この注意喚起から分かることは、あくまで Exploit コードへと利用者を誘導する手法で新しいものが確認されただけであって、対策はこれまでの Gumblar(に限らず Web Exploit 全般)へのものと変わらないと思います(2009年11月3日の日記を参照)。

ただ、以前短縮 URL のリダイレクトについて調べた*1ときに HTTP レスポンスによるリダイレクトを防止する方法が見つけられなかったので、改めて調べてみました。すると、Firefox Add-on「NoRedirect」を見つけました。これを試用してみました。

結論

「NoRedirect」では、「HTTP レスポンスコードによるリダイレクト」と「meta タグによるリダイレクト」の際に、リダイレクト前に確認画面を挿入できるようです。ただし、JavaScript によるリダイレクト」はブロックできませんでした。リダイレクト先の確認に使えそうなので、しばらく使ってみようかなと思いました。

注意喚起の .htaccess の挙動を確認する

注意喚起の .htaccess の挙動を確認してみました。注意喚起の .htaccess を基に以下の .htaccess を作成して、僕の借りてるさくらインターネットの公開ディレクトリ(一時的に作成した demomo ディレクトリ以下)に設置しました。この .htaccess を設置した URL に対して、(a) Google の検索結果からのアクセス、(b) 存在しないファイルへのアクセスを実施しました。

# HostRule
RewriteEngine On
RewriteCond %{HTTP_REFERER} .*google.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*ask.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*yahoo.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*excite.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*altavista.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*msn.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*netscape.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*aol.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*hotbot.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*goto.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*infoseek.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*mamma.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*alltheweb.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*lycos.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*search.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*metacrawler.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*yandex.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*rambler.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*mail.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*dogpile.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*ya.*$ [NC]
RewriteRule ^(.*)$ http://www.google.ru/ [R=301,L]

ErrorDocument 401 http://www.google.ru/
ErrorDocument 403 http://www.google.ru/
ErrorDocument 404 http://www.google.ru/
ErrorDocument 500 http://www.google.ru/
# /HostRule
(a) Google の検索結果からのアクセス

http://q1w2e3.sakura.ne.jp/demomo/(今はありません) に Firefox 3.6 でアクセスします。なお、アクセスする際に Firefox Add-on「Tamper Data」で RefererGoogle で「ほげ」を検索した時の URL を設定しました。該当 URL にアクセスすると、HTTP レスポンスコード 301 が返ってきて、http://www.google.ru/ にリダイレクトされました。

上記の通信を Firefox Add-on「Live HTTP Headers」でキャプチャしました。以下、キャプチャ結果です。

http://q1w2e3.sakura.ne.jp/demomo/

GET /demomo/ HTTP/1.1
Host: q1w2e3.sakura.ne.jp
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.google.co.jp/search?q=%E3%81%BB%E3%81%92&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox
If-Modified-Since: Sat, 06 Mar 2010 11:49:38 GMT
If-None-Match: "46-4b924152"

HTTP/1.1 301 Moved Permanently
Date: Sat, 06 Mar 2010 11:55:02 GMT
Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
Location: http://www.google.ru/
Keep-Alive: timeout=5, max=19
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
----------------------------------------------------------
http://www.google.ru/

GET / HTTP/1.1
Host: www.google.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PREF=ID=a766140dc336d442:NW=1:TM=1267876370:LM=1267876370:S=LYwT1F_fiCsNH57R; NID=32=heJQG18gWByFgSDiKqSa_RdL8lV8MwiT2_eNu_lc0_AfeikHkKwL2Wzaf_EppKUvdyHdr4uCx0YfQs-ata8RHtUWLbcvVMsj58caVdpVu3uBRauZ7u5ZNjXLCsbqdM-u

HTTP/1.1 200 OK
Date: Sat, 06 Mar 2010 11:55:05 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=a766140dc336d442:U=0a0843889d83e5da:NW=1:TM=1267876370:LM=1267876505:S=-cDAVQvBhsGroo0D; expires=Mon, 05-Mar-2012 11:55:05 GMT; path=/; domain=.google.ru
Content-Encoding: gzip
Server: gws
Content-Length: 4389
X-XSS-Protection: 0
(b) 存在しないファイルへのアクセス

http://q1w2e3.sakura.ne.jp/demomo/hoge(今はありません) に Firefox 3.6 でアクセスします。該当 URL にアクセスすると、HTTP レスポンスコード 302 が返ってきて、http://www.google.ru/ にリダイレクトされました。

上記の通信を Firefox Add-on「Live HTTP Headers」でキャプチャしました。以下、キャプチャ結果です。

http://q1w2e3.sakura.ne.jp/demomo/hoge

GET /demomo/hoge HTTP/1.1
Host: q1w2e3.sakura.ne.jp
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

HTTP/1.1 302 Found
Date: Sat, 06 Mar 2010 12:10:36 GMT
Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
Location: http://www.google.ru/
Keep-Alive: timeout=5, max=19
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
----------------------------------------------------------
http://www.google.ru/

GET / HTTP/1.1
Host: www.google.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PREF=ID=a766140dc336d442:U=0a0843889d83e5da:NW=1:TM=1267876370:LM=1267876505:S=-cDAVQvBhsGroo0D; NID=32=heJQG18gWByFgSDiKqSa_RdL8lV8MwiT2_eNu_lc0_AfeikHkKwL2Wzaf_EppKUvdyHdr4uCx0YfQs-ata8RHtUWLbcvVMsj58caVdpVu3uBRauZ7u5ZNjXLCsbqdM-u

HTTP/1.1 200 OK
Date: Sat, 06 Mar 2010 12:10:36 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
Content-Length: 4388
X-XSS-Protection: 0

Firefox Add-on「NoRedirect」を試用する

Firefox Add-on「NoRedirect」をインストールし、すべての URL でリダイレクトチェックが有効になるように設定します。Firefox の [ツール]メニュー → [NoRedirect] を選択し、「NoRedirect」の設定画面を開きます。この設定画面で、正規表現パターンとして「.*」を追加します(下記画像の青枠を参照)。

f:id:kaito834:20100306212758p:image:w305:h216


設定が完了したら、前述の (a), (b) の URL にアクセスしてみました(下記 2 つの画像を参照)。「NoRedirect」を有効にしていると、HTTP レスポンスコード 301, 302 が返ってきた場合、リダイレクト前に確認画面が挿入されるようですね。これはいいかも。この確認画面でリンクをクリックすると、リダイレクト先にアクセスできます。

f:id:kaito834:20100306213226p:image:w392:h304

f:id:kaito834:20100306213227p:image:w392:h304


続いて、「bit.ly」の短縮 URL にもアクセスしてみます。きちんと確認画面が挿入されました。

f:id:kaito834:20100306214010p:image:w392:h304


meta タグによるリダイレクトも確認してみます。以下の内容の HTML ファイルを作成し、この HTML にインターネット経由でアクセスします。http://q1w2e3.sakura.ne.jp/a.html(今はありません)にアクセスすると、確認画面が挿入されました。

<html>
<head>
<meta http-equiv="refresh" content="0; url=http://www.google.ru/">
</head>
<body>
test
</body>
</html>

f:id:kaito834:20100306215556p:image:w392:h304


JavaScript によるリダイレクトについては、さすがにブロックできませんでした。ただし、JavaScript によるリダイレクトは Firefox Add-on「NoScript」を有効にしていればブロックできました。

「NoRedirect」では、「HTTP レスポンスコードによるリダイレクト」、「meta タグによるリダイレクト」を実行する前に確認画面を挿入することで、リダイレクトをブロックできました。「JavaScript によるリダイレクト」についてはブロックできませんでした。今回の Gumblar 手法を防御するだけではなく、短縮 URL サービスのリダイレクト先を確認することもできるため、個人的に使えそうだなと思いました。

参考情報

VMware Server で動作する Windows XP のカーネルデバッグ環境を整える

| 13:56 | VMware Server で動作する Windows XP のカーネルデバッグ環境を整えるを含むブックマーク

2010年2月27日の日記ではじめてカーネルデバッグしました。分からないことだらけだったけど、調べるのは面白かったです:D。VMware Server で動作する Windows XP をカーネルデバッグするためには、準備が必要だったので、その過程をメモとしてまとめます。

カーネルデバッグ環境の準備

カーネルデバッグ環境は、最終的に下記画像のようになります。下記画像の 1) 〜 4) の流れに沿って、カーネルデバッグ環境を準備します。

f:id:kaito834:20100306122257p:image:w388:h286

1). windbg のインストール

まず、カーネルデバッグができる windbg をインストールします。基本的には、Microsoft のサイトからインストーラをダウンロードしてインストールするだけです。2010年2月27日の日記では、windbg 6.11.1.404 をインストールして使用しました。

windbg をインストールしたら、OS のシンボルファイルを OS に合わせて取得するように、Microsoft Symbol Server へのシンボルパスを設定します。windbg の [File]メニュー → [Symbol File Path] を選択します。起動した設定ウインドウで Microsoft Symbol Server のパスを設定します。Microsoft Symbol Server のパスについては、Microsoft の「Windows デバッグ ツールとシンボル:はじめに」のサイトに記述があります。設定すると、下記画像のようになります。

f:id:kaito834:20100306124601p:image:w422:h128

2). Guest OS に仮想 COM ポートを作成する

VMware Server で動作する Windows をカーネルデバッグする場合、Guest OS の Windows に COM ポートを追加し、その COM ポート経由でカーネルデバッグすることになります。追加する COM ポートには名前付きパイプ(named pipe)を設定し、windbg はその名前付きパイプを介して仮想マシンデバッグします。

VMware Server 1.0.8 で仮想 COM ポートを追加する流れを下記画像にまとめました。Guest OS の設定画面を起動し、下記画像の(a)〜(e)の手順を実施すれば、仮想 COM ポートの追加は完了します。(a)〜(e)について、簡単に後述します。

f:id:kaito834:20100306131637p:image:w529:h397

(a).設定画面の [Add] ボタンから仮想ハードウェアを追加する

(b).ハードウェアタイプで Serial Port を選択する

(c).Serial Port タイプで「Ouput to named pipe」を選択する

(d).Named pipe に以下を設定する

  「\\.\pipe\com_1」

  「This end is the server」

  「The other end is a virtual machine」

(e).仮想 COM ポートの追加完了

3). Guest OS を debug モードで起動する

カーネルデバッグするためには、Windows XPデバッグモードで起動する必要があります。Windows XPデバッグモードで起動するため、Windows の起動パラメータにデバッグオプションを設定します。具体的には、C:\boot.ini に以下を追加します。「/debug /debugport=com1 /baudrate=115200」がデバッグモードに関連するパラメータとなります。「/debugport」には、Windows XP の CO M ポートを指定します。2) で追加した仮想 COM ポートが COM1 に該当するため、ここでは com1 を指定しました。デバッグオプションに関しては、Microsoft の KB170756 を参照してください。

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /debug /debugport=com1 /baudrate=115200

デバッグオプションを指定した後に Windows XP を再起動すると、OS が起動する前に下記画像のようにブートする OS を指定する画面が表示されます。ここで、「Microsoft Windows XP Professional [debugger enabled]」を選択します。

f:id:kaito834:20100306133242p:image:w326:h305

4). windbg を起動する

1) 〜 3) でカーネルデバッグの準備が整いました。ここで、windbg を起動します。windbg を起動したら、[File]メニュー → [Kernel Debug] を選択します。[Kernel Debug] を選択すると、Kernel Debug の設定画面が表示されます。この設定画面で、2) で作成した名前付きパイプ「\\.\pipe\com_1」に接続するように設定します(下記画像を参照)。

f:id:kaito834:20100306134948p:image:w200:h130

以上で、カーネルデバッグ環境が整いました。これで 2010年2月27日の日記で掲載した画像のようにカーネルデバッグが可能となります。

f:id:kaito834:20100213222036p:image:w400:h300


参考情報

puppetpuppet 2010/03/07 13:46 とても有益な情報ありがとうございます。

ところで、自分で試してみた感じでは、リストで許可してないURLの
リダイレクトは制限されるようで、「.*」は必要ないように思える
のですが、設定しない場合の問題点があれば教えて頂けると幸いです。

puppetpuppet 2010/03/07 15:09 すいません。「.*」は必要でした。

「.*」がなくても302がブロックされるサイトを見て必要なさそうに
思ったのですが、「.*」がないと404がブロックされないサイトが
ありました。

検証不足で、どうも失礼しました。m(_ _)m

kaito834kaito834 2010/03/07 15:48 >puppet さま

参考になったようで何よりです^^

ただ、「.*」の設定については、「あれこれ条件を考えるより、すべてリダイレクト前に確認してしまえば楽かな」という意図があります。「NoRedirect」によって、リダイレクトがブロックされるといっても、リダイレクトさせたければリンクをクリックするだけですし。

私も「NoRedirect」自体は試用したレベルなので、細かな挙動までは分かっていないのが正直なところです。なので、いただいだコメントは嬉しいです。標準設定でもリダイレクトをブロックできるところもあるんですね。