2009年1月30日金曜日

とくまるひろしのSession Fixation攻撃入門

 やぁ、みんな,元気?とくまるひろしです。今日はSession Fixation攻撃の方法をこっそり教えちゃうよ。
 いつもは防御側で漢字の名前でやってるんだけど,きょうは攻撃側ということで,名乗りもひらがなに変えたんだ。だってさ,今度デブサミでご一緒するはせがわようすけさんとか,はまちちゃんとか,ひらがなの人たちの方が格好良さそうじゃないか。
 では始めよう。
# このエントリは、はてなダイアリーの過去のエントリの転載です。

用意するもの

大まかな手順

それでは,やってみよう

セッションIDを準備する

 これは二つの方法があるよ。一番ふつーなのは,標的サーバーを閲覧してそこで発行されたセッションIDを記録することだね。ふつーはこれでいける。たいてい,サイトに行っただけでセッションIDが発行されるからね。セッションIDはCookieとかにPHPSESSIDとかJSESSIONIDのように,SESSやSESSIONとIDを組み合わせた名前であることが多い。値は英数字を組み合わせた乱数のようになっているはずだ。たぶん。
 でも,たまにサイトにログインしないとセッションIDが発行されない場合がある。無料で会員になれるサイトだったら,会員になってログインすればいい。セッションIDを記録したらログアウトしておいた方がいいかな。この時セッションIDがつけなおされていたら,そのサイトの攻撃は難しいと思うよ。
 簡単に会員になれないサイトの場合はどうするか。その場合は,適当に英数字の組み合わせでセッションIDを作る。そんなんでうまくいくかって?うまくいかないこともあるんだけど,PHPで書いてあるサイトなら大丈夫。PHPは寛大なんだ。
 これで,セッションIDの準備は終わりだよ。

標的ユーザにセッションIDを強要してサイトに誘導する

 この部分がSession Fixation攻撃のキモだね。なんせFixationって言うくらいだから,強要が大事なんだ。
 セッションIDを強要する方法はいくつかあるけど,簡単なものから順に説明するね。

(1)URL埋め込みのセッションIDを使う
 PHPJavaなんかだと,セッションIDをURLに持てるんだよ。まぁ設定にもよるんだけどさ。
 確かめ方は簡単だ。ブラウザCookieをオフにして,そのサイトを使ってみる。URLにPHPSESSIONIDとかJSESSIONIDとか出てきたらしめたものだ。そのURLをそのままメールにコピペして,標的ユーザに送りつける。一人二人じゃだめだぜ。大量に送るんだ。
 えっ,Cookieをオフにする方法はどうするかって? おいおい,よしてくれよ。僕らはスーパーハッカーを目指しているんじゃなかったのかい? それくらいは自分で調べてくれ。

(2)Cookie Monsterを使う
 URLが使えない場合は標的ユーザのCookieをセットしてやらないといけないんだが,これはちょっと面倒だ。
 一番簡単な方法はCookie Monsterかな。セサミストリートに出てくる怪物…じゃなくてぇ,そういうバグがあるんだ。Firefoxの2.Xとか,Safariとかに。
 まず,.ne.jpとか,.or.jpとか.co.jpのドメインサーバーを用意する。.co.jpドメインとるのは通常難しいから,.ne.jpか.or.jpかな。IEでも,tokyo.jpみたいな地域ドメインだとこれが使える。おっと,標的サーバードメインと末尾が同じでないとダメだ。サーバーはレン鯖でおk。そこで,次のようなCookieを吐いてやるんだ。
Set-Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXX; path=/; domain=.ne.jp
 XXXの部分は,さっき用意したセッションIDな。別にCGI使わなくても,JavaScriptでも,METAタグでもいい。METAタグの場合は,次のようにする。
<META http-equiv="Set-Cookie" content="JSESSIONID=XXXXXXXXXXXXXXXXXXXX; path=/; domain=.ne.jp">
 標的ユーザがうっかりこのコンテンツを踏むと,彼の自慢のSafari君の中では,.ne.jpドメインCookieがセットされるわけ。その後彼は,example.ne.jp(標的サイト)に誘導されると,さっきのCookieが送られて,ばきゅーん,セッションIDがFixationされちゃう,みたいな。
 CGIへの誘導は,やっぱりメールかな。ブログでもいいよ。

(3)HTTPヘッダインジェクションを使う
 段々難しくなるな。標的サーバーHTTPヘッダインジェクションの脆弱性があれば,それを使ってCookieをセットできる場合が多い。やり方までは説明しないよ。それくらいは自分で勉強してくれ。

(4)XSSを使う
 クロスサイト・スクリプティングを使っても,Cookieをセットできる。けどね,ふつーそんなことは僕らしないのよ。なぜ? XSS使ってCookie盗んじゃえばふつーになりすましできるもんね。まぁどうしてもやりたければ止めないけど。
 あぁ,でも(2)のCookie Monsterちゃんとの組み合わせならありかな。標的サイトにはXSSないけど,同じ属性ドメインや地域ドメインの別サイトのXSSを使わせてもらう。だって,tokyo.jpみたいな地域ドメインも個人でとれるけど,そんなとこから足がついたらいやだもんね。だから,同じ地域ドメインで別サイトのXSSを使わせてもらう。BODYの中でも,さっきのMETAタグは有効だから,JavaScript使わなくても楽勝でCookieセットできるよ。こんな流れだ。
hogehoge.fugafuga.setagaya.tokyo.jpにXSS発見
  ↓
hogehoge.fugafuga.setagaya.tokyo.jpのXSSに標的ユーザを誘導
  ↓
<META http-equiv="Set-Cookie" content="JSESSIONID=XXXXXXXXXXXXXXXXXXXX; path=/; domain=.tokyo.jp">
  ↓
.tokyo.jpドメインセッションIDがCookieにセットされる
  ↓
標的サイトのxxx.tokyo.jpに誘導
  ↓
Session Fixation発動
 うーん,これIEでも有効だから凶悪だなぁ。地域ドメイン使っている人はCookie使わない方がいいかも…って無理か。Session Fixation対策を入念にしとけってとこかな。

(5)その他
 他にもCookieセットする方法はあるけど,まぁレアかな。昔の本とかだと,標的ユーザが席離れた隙にCookieセットする,みたいなことが書いてあったりするけど,ばっかじゃねぇのと思うよね。Cookieセットする暇があったら,キーロガーでもなんでも仕込めるじゃない。この間も逮捕されたばかりだな。空き巣に入ってキーロガー仕掛けた奴が。
 だから,さ。離席中にCookieセットする,みたいなのを読むと,まるで,女の子に無理に酒飲ませて泥酔させてさ,おいおいこいつ何するんだと思って見てたら,下着の色確認しただけで満足する,みたいな。却ってそれ,へんたーい,って感じがするのよ。
 あぁ,そうそう,DNS攻撃する手もあるか。でも,それも泥酔攻撃と同じで変よね。というわけで(1)か(2)がふつーだと思うよ。

罠に掛かるのを見張る

 ここまで準備ができたら,ワナに使ったセッションIDでサイトをひたすら定期的にアクセスし続ける。これは,標的さんがワナに掛かるのを見張る意味もあるんだけど,もう一つ重要な意味があるよ。
 それは,これをしないと,セッションタイムアウトっていうのが起こるわけ。だから,定期的に,そう10分くらいおきにアクセスするべきだろうね。
 えっ,そんな面倒くさい? 情けないこと言うね。手でアクセスするわけないじゃない。スクリプトよ,す・く・り・ぷ・と。まぁ,wgetとバッチファイルでもポーリングくらいはできるけど,ハッカー目指すみんなはRubyPythonあたりでクールな監視のスクリプトを作ってくれ。ハッカーの癖にひねくれた奴だと,wshvbscriptjscriptってのもいそうだね。まぁ,好きにしてくれ。

セッションハイジャックする

 ユーザがワナに掛かったら,いよいよセッションハイジャックだ。ようは,なりすましだな。
 一番ふつーなのは,ユーザが、仕掛けたセッションIDのままログインしてしまうのを待つわけ。そしたらさ,こっちはそのセッションIDを知っているわけだから,そいつでなりすましできるってこと。
 ログイン機能がないサイトでも,ハイジャックできる場合があるよ。でも,レアかな。たまに,個人入力画面が何段階かに分かれていて,途中の情報をセッションに入れている場合なんか、見れる場合があるね。「hiddenは危険」なんてIPAのサイトに書いてあるもんだから,セッションの方が安全だろうと思って墓穴を掘るケースよね。こういう場合はhiddenの方がずっと安全です。おっと,安全の話をしているんじゃなかった。
 えっ,ユーザがログインしたとたんにセッションIDが振り直された? あぁ,そういうサイトは狙ってもダメね。他をあたりなさい。狙えるサイトは,いくらでもあると思うよ,きっと。たぶん。




無粋な注意書き

 このコンテンツはSession Fixationの啓蒙を目的として,同攻撃手法を分かりやすく、親しみやすく説明することを目的にしています。
 この情報を元にした悪用は法律で禁止されています。あくまで防御目的のために,攻撃手法の理解のためにお読み下さい。

フォロワー