日本で大型連休に入る少し前の9月中頃、WASC Distributed Open Proxy Honeypot Project (DOPHP)のプロジェクトリーダであるRyan Barnett氏がそのブログで、「Yahoo! Mailのユーザアカウントのログインを試みるブルートフォース攻撃が、DOPHPのプロキシポットによって検知された」と発表した。筆者とBarnett氏とのメールインタビューを交えて報告したい。
DOPHPは、The Web Application Security Consortium(WASC)が行っているプロジェクトの一つで、Web攻撃のデータを収集することを目的で設置されたハニーポットプロジェクトだ。Webへの攻撃をハニーポットでキャプチャするためには、単にWebベースのハニーポットを設置するだけでは殆ど意味が無い。それは、データを収集するのに必要なトラフィックを得られないからだ。そのためDOPHPは、オープン・プロキシ・サーバにプロキシポットと呼ばれるハニーポットを設置し、そこを通過するHTTPトラフィックを解析し、リアルタイムのデータ収集を行っている。攻撃者が攻撃元のアドレスを隠すにはオープンプロキシを使うのが普通で、この方法は攻撃トラフィックに遭遇する確率が高い。
さて、通常ユーザがYahoo! Mailにログインする場合は、Yahoo! Mail web login interface pageを使う。このページは、ユーザがログインを試みた回数を記録しており、ユーザが規定回数以上のログインを試みた場合は、CAPTCHAを同時にクリアしないとログインできないことになっている。つまり、Yahoo! Mail web login interface pageからはブルートフォース攻撃が行えない。また、ユーザがログインに失敗した場合、Yahoo! Japanの場合のメッセージは、「Yahoo! JAPAN IDまたはパスワードが正しくありません」で、ログインIDが正しくないのかパスワードが正しくないのかを指摘しないため、ログイン情報の推測が難しくなっている。
ところが、こうしたセキュリティ手段が講じられていないのが、「/config/isp_verify_user」という名前の、ISPやパートナーのWebアプリケーション用のweb services authentication systems API。数多くのYahoo!のサブドメインが、このアプリケーションをホストしており、DOPHPが検知している分散型ブルートフォースは、この「/config/isp_verify_user」を攻撃対象としていた。
前記Yahoo! Mail web login interface pageと違い、「/config/isp_verify_user」に無効なログインが試みられた場合、ユーザネームが無効の場合は「ERROR:102:Invalid Login」というメッセージが戻ってくる。また、ログイン試みの回数カウンタもCAPTCHAも装備されていないため、「ERROR:102:Invalid Login」の代わりに「ERROR:101:Invalid Password」というメッセージが出るまでオートメーションされたログイン・リクエストを次々と送ることにより、正規ユーザ名を推測することができるのだ。一度ログインIDが分かったら、同じようにパスワードをブルートフォースして、ログイン情報が確定できる。
実際にプロキシポットで記録された攻撃トラフィックの一部は、以下の通りだ。
Get http://l33.login.scd.yahoo.com/config/isp_verify_user?l=kneeling@ort.rogers.com&p=qwerty HTTP/1.0 Get http://l06.member.kr3.yahoo.com/config/isp_verify_user?l=kneading@ort.rogers.com&p=000000 HTTP/1.0 Get http://69.147.112.199/config/isp_verify_user?l=kitbags@ort.rogers.com&p=333333 HTTP/1.0 Get http://217.12.8.235/config/isp_verify_user?l=kirk@ort.rogers.com&p=yankees HTTP/1.0 GET http://69.147.112.217/config/isp_verify_user?l=__miracle&p=weezer HTTP/1.0 GET http://69.147.112.202/config/isp_verify_user?l=123#@!.._69_&p=weezer HTTP/1.0 GET http://68.142.241.129/config/isp_verify_user?l=__lance_&p=weezer HTTP/1.0 GET http://202.86.7.115/config/isp_verify_user?l=__kitty__69__&p=weezer HTTP/1.0