2009-01-30 [neta]
■とくまるひろしのSession Fixation攻撃入門

やぁ、みんな,元気?とくまるひろしです。今日はSession Fixation攻撃の方法をこっそり教えちゃうよ。
いつもは防御側で漢字の名前でやってるんだけど,きょうは攻撃側ということで,名乗りもひらがなに変えたんだ。だってさ,今度デブサミでご一緒するはせがわようすけさんとか,はまちちゃんとか,ひらがなの人たちの方が格好良さそうじゃないか。
では始めよう。
用意するもの
大まかな手順
- セッションIDを準備する
- セッションIDを強制してサイトに誘導する
- 罠に掛かるのを見張る
- セッションハイジャックする
それでは,やってみよう
セッションIDを準備する
これは二つの方法があるよ。一番ふつーなのは,標的サーバーを閲覧してそこで発行されたセッションIDを記録することだね。ふつーはこれでいける。たいてい,サイトに行っただけでセッションIDが発行されるからね。セッションIDはCookieとかにPHPSESSIONIDとかJSESSIONIDのように,SESSやSESSIONとIDを組み合わせた名前であることが多い。値は英数字を組み合わせた乱数のようになっているはずだ。たぶん。
でも,たまにサイトにログインしないとセッションIDが発行されない場合がある。無料で会員になれるサイトだったら,会員になってログインすればいい。セッションIDを記録したらログアウトしておいた方がいいかな。この時セッションIDがつけなおされていたら,そのサイトの攻撃は難しいと思うよ。
簡単に会員になれないサイトの場合はどうするか。その場合は,適当に英数字の組み合わせでセッションIDを作る。そんなんでうまくいくかって?うまくいかないこともあるんだけど,PHPで書いてあるサイトなら大丈夫。PHPは寛大なんだ。
これで,セッションIDの準備は終わりだよ。
標的ユーザにセッションIDを強要してサイトに誘導する
この部分がSession Fixation攻撃のキモだね。なんせFixationって言うくらいだから,強要が大事なんだ。
セッションIDを強要する方法はいくつかあるけど,簡単なものから順に説明するね。
PHPやJavaなんかだと,セッションIDをURLに持てるんだよ。まぁ設定にもよるんだけどさ。
確かめ方は簡単だ。ブラウザのCookieをオフにして,そのサイトを使ってみる。URLにPHPSESSIONIDとかJSESSIONIDとか出てきたらしめたものだ。そのURLをそのままメールにコピペして,標的ユーザに送りつける。一人二人じゃだめだぜ。大量に送るんだ。
えっ,Cookieをオフにする方法はどうするかって? おいおい,よしてくれよ。僕らはスーパーハッカーを目指しているんじゃなかったのかい? それくらいは自分で調べてくれ。
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されちゃう,みたいな。
(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とバッチファイルでもポーリングくらいはできるけど,ハッカー目指すみんなはRubyかPythonあたりでクールな監視のスクリプトを作ってくれ。ハッカーの癖にひねくれた奴だと,wshにvbscriptかjscriptってのもいそうだね。まぁ,好きにしてくれ。
セッションハイジャックする
ユーザがワナに掛かったら,いよいよセッションハイジャックだ。ようは,なりすましだな。
一番ふつーなのは,ユーザが、仕掛けたセッションIDのままログインしてしまうのを待つわけ。そしたらさ,こっちはそのセッションIDを知っているわけだから,そいつでなりすましできるってこと。
ログイン機能がないサイトでも,ハイジャックできる場合があるよ。でも,レアかな。たまに,個人入力画面が何段階かに分かれていて,途中の情報をセッションに入れている場合なんか、見れる場合があるね。「hiddenは危険」なんてIPAのサイトに書いてあるもんだから,セッションの方が安全だろうと思って墓穴を掘るケースよね。こういう場合はhiddenの方がずっと安全です。おっと,安全の話をしているんじゃなかった。
えっ,ユーザがログインしたとたんにセッションIDが振り直された? あぁ,そういうサイトは狙ってもダメね。他をあたりなさい。狙えるサイトは,いくらでもあると思うよ,きっと。たぶん。
無粋な注意書き
このコンテンツはSession Fixationの啓蒙を目的として,同攻撃手法を分かりやすく、親しみやすく説明することを目的にしています。
この情報を元にした悪用は法律で禁止されています。あくまで防御目的のために,攻撃手法の理解のためにお読み下さい。
- 19 http://reader.livedoor.com/reader/
- 17 http://b.hatena.ne.jp/
- 17 http://b.hatena.ne.jp/hotentry
- 16 http://d.hatena.ne.jp/
- 15 http://b.hatena.ne.jp/entrylist
- 9 http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/ockeghem/20090130/p1
- 7 http://b.hatena.ne.jp/hotentry/it
- 6 http://b.hatena.ne.jp/add?mode=confirm&title=%u3068%u304F%u307E%u308B%u3072%u308D%u3057%u306ESession Fixation%u653B%u6483%u5165%u9580 - ockeghem(%u5FB3%u4E38%u6D69)%u306E%u65E5%u8A18&url=http://d.hatena.ne.jp/ockeghem/20090130/p1
- 5 http://b.hatena.ne.jp/entrylist?sort=hot&threshold=3
- 5 http://www.google.com/reader/view/
- 2009-01-27 ネットの片隅で愚痴を囁く 5/68 7%
- 2009-01-25 あと味 5/79 6%