立て続けに発生した不正アクセス事件によって、あらためてパスワード使い回しの危険性が明らかになった。ツールを用いて「リスト型攻撃」のリスクを認識し、われわれがいま取ることができる対策について考えていく。
NTTレゾナントの「gooID」、NTT東日本の「フレッツ光メンバーズクラブ」、イーブックイニシアティブジャパン「eBookJapan」と、国内の著名サイトで立て続けに不正ログインが発生している。
「gooID」の事件の発生当初、原因は「ブルートフォース攻撃」(注1)という力技による攻撃であるとも考えられていた。だが時間が経過し、詳細が明らかになるに従って、ブルートフォース攻撃ではなく「リスト型攻撃」(「リスト型アカウントハッキング」や「リスト型パスワードクラッキング」などとも呼ばれる)によるものである可能性が非常に高いと考えられるようになってきた。
その決め手は、eBookJapanを運営するイーブックイニシアティブジャパンが公表したプレスリリースである。このリリースは、セキュリティインシデントに関する発表としては今までにない詳細なレベルで、事件の調査報告を行ってくれている。この記事を読んでいる皆さんにも、ぜひ一読をお勧めしたい。
【重要なお知らせ】不正ログイン被害のご報告とパスワード再設定のお願い
http://www.ebookjapan.jp/ebj/information/20130405_access.asp
徳丸浩の日記:eBook Japanの発表資料に見るパスワードリスト攻撃の「恐ろしい成果」と対策
http://blog.tokumaru.org/2013/04/password-list-attack.html
この中で注目すべきは、リリース本文にもある通り、「一つのログインID(メールアドレス)について試行するパスワードの数の少なさ」である。
【ログイン成立分】では2回までの試行で、733(386+347)ものIDについてログインが成立している。何も情報がない状態でここまでの精度を出すのは至難の技である。というよりも、事実上不可能に近いといってもいいレベルだ。
ということから、どこからか(1つか複数か不明だが)漏れたID、パスワードのリストを用いて攻撃を行ったのではないか、と推測するのが自然だろう。つまり、ID、パスワードの使い回しを行っているユーザーがこれらの攻撃の餌食になってしまった可能性が高いと言える(リリースでもそのように推測されている)。
注1:ブルートフォース攻撃がどういったものかということについては筆者のブログを参照してほしい(http://n.pentest.jp/?p=26701)。
「ブルートフォース攻撃と辞書攻撃は同列であって、ブルートフォース攻撃に辞書攻撃を含めるべきではないのでは?」という議論もある。上記のブログを書くときに確認する意味も込めて調べてみたところ、「ブルートフォース攻撃に辞書攻撃が含まれるか否か」については諸説あった。そこで悩んだ挙げ句、「(reverse) brute force attack」という定義の中に「incremental attack」と「dictionary attack」を含めることで、ある程度すっきり分類することを優先して説明を行っている。
用語の使い方、認識についてさまざまな意見はあるものの、本質的な部分には影響を与えず、間違いではないと判断した。
それでは、もう少し突っ込んで、「リスト型攻撃」とはどういうものかを知っていただくために、例を交えて説明していきたい。
リスト型攻撃とは、あらかじめ用意した「IDとパスワードを対としたリスト」を用いてログインを試みる攻撃のことを指す。
ここでは、有名なオンラインパスワードクラッカーである「hydra」を用いた例を見てみよう。今回の例でログイン試行を行う対象(=攻撃対象のサーバ)として、オープンソースのグラフ作成ツール「Cacti」を用いる。
例では、このログイン画面を表示させているサーバ、つまり攻撃対象のアドレスは192.168.1.103とした。Cactiのユーザーは2つ作成した。1つはユーザーIDが「admin」で、パスワードは「cacti」。もう1つはユーザーIDが「ntsuji」で、パスワードは「password」である。
hydraで、Cactiのログインフォームに対し、POSTメソッドを用いてログイン試行を行う場合は、以下のように実行する。
hydra -s ポート番号 -C リスト 対象のアドレス http-post-form "PATH:送信するパラメータ:ログイン失敗の際に表示される文字列"
まず[ポート番号]だが、今回は特に何も設定していないので[80]番を用いる。
次の[リスト]ファイルには、今回は[list.txt]というファイル名で以下の内容のリストファイルを作成し、指定した。
admin:admin admin:password admin:adminadmin admin:pass admin:cacti cacti:cacti ntsuji:admin ntsuji:cacti ntsuji:ntsuji ntsuji:password ntsuji:test
記述形式は、「ユーザーID:パスワード」である。今回はあくまで例なので、リストに記載された件数は少ないが、おそらく攻撃者が本当のリスト型攻撃を行う場合は、自身で盗んだものか購入したものかその経路は分からないが、何らかの方法で入手した、何万件もの対のIDとパスワードをここに記述することになるだろう。
[対象アドレス]には、前述したアドレスの[192.168.1.103]を用いる。
次に[PATH]だが、ここには攻撃を行うページのURLから、IPアドレスを除いた文字列を入力する。今回、攻撃対象のページのURLは“192.168.1.103/cacti/index.php”なので、[/cacti/index.php]を用いる。
次は[送信するパラメータ]である。これを設定するには、サイトに関するちょっとした調査が必要である。
Cactiのログイン画面の場合を見てみよう。下図は、Cactiのログイン画面からユーザーIDを「aaaa」、パスワードを「bbbb」としてログイン試行を行った際のHTTPリクエストを、Firefoxのアドオン「Live HTTP Headers」を用いてキャプチャしたものである。
ここに表示されている
action=login&login_username=aaaa&login_password=bbbb
の部分が、POSTされたパラメータである。
このパラメータの可変部分を、変数(決められた文字列)に変更する。ユーザーIDが入る部分は「^USER^」、パスワードが入る部分を「^PASS^」と変更し、以下のようになる。
action=login&login_username=^USER^&login_password=^PASS^
最後は[ログイン失敗の際に表示される文字列]である。これはhydraがログインの成功と失敗を判断する際に用いる文字列を指定する。
それでは、Cactiでの[ログイン失敗の際に表示される文字列]を見てみよう。
この画面で、赤文字で表示されているエラーメッセージ、「Invalid User Name/Password Please Retype」の部分を用いることになる。文字列すべてを使用してもいいのだが、[Invalid]の部分だけを用いれば問題ないだろう。
これでhydraで埋めなければならない情報はすべてそろった。各パラメータを埋めると、下記のようになる。
hydra -s 80 -C list.txt 192.168.1.103 http-post-form "/cacti/index.php:action=login&login_username=^USER^&login_password=^PASS^:Invalid"
実行結果は下記の通りである。
[80][www-form] host: 192.168.1.103 login: admin password: cacti [80][www-form] host: 192.168.1.103 login: ntsuji password: password
の部分がログインの成功を表しており、設定した内容と、ユーザーID、パスワードが一致していることが分かるだろう。
このリストとして、どこかから漏えいした(あるいはブラックマーケットなどで手に入れた)ユーザーIDとパスワードを利用すれば、複数のサービスで使い回しをしているユーザーはたちまち餌食にされるだろう。攻撃者にとって、これほど効率のよい攻撃はないのではないだろうか。
Copyright © ITmedia, Inc. All Rights Reserved.