いつもは防御側で漢字の名前でやってるんだけど,きょうは攻撃側ということで,名乗りもひらがなに変えたんだ。だってさ,今度デブサミでご一緒するはせがわようすけさんとか,はまちちゃんとか,ひらがなの人たちの方が格好良さそうじゃないか。
では始めよう。
# このエントリは、はてなダイアリーの過去のエントリの転載です。
用意するもの
大まかな手順
- セッションIDを準備する
- セッションIDを強制してサイトに誘導する
- 罠に掛かるのを見張る
- セッションハイジャックする
それでは,やってみよう
セッションIDを準備する
これは二つの方法があるよ。一番ふつーなのは,標的サーバーを閲覧してそこで発行されたセッションIDを記録することだね。ふつーはこれでいける。たいてい,サイトに行っただけでセッションIDが発行されるからね。セッションIDはCookieとかにPHPSESSIDとかJSESSIONIDのように,SESSやSESSIONとIDを組み合わせた名前であることが多い。値は英数字を組み合わせた乱数のようになっているはずだ。たぶん。
でも,たまにサイトにログインしないとセッションIDが発行されない場合がある。無料で会員になれるサイトだったら,会員になってログインすればいい。セッションIDを記録したらログアウトしておいた方がいいかな。この時セッションIDがつけなおされていたら,そのサイトの攻撃は難しいと思うよ。
簡単に会員になれないサイトの場合はどうするか。その場合は,適当に英数字の組み合わせでセッションIDを作る。そんなんでうまくいくかって?うまくいかないこともあるんだけど,PHPで書いてあるサイトなら大丈夫。PHPは寛大なんだ。
これで,セッションIDの準備は終わりだよ。
標的ユーザにセッションIDを強要してサイトに誘導する
この部分がSession Fixation攻撃のキモだね。なんせFixationって言うくらいだから,強要が大事なんだ。
セッションIDを強要する方法はいくつかあるけど,簡単なものから順に説明するね。
確かめ方は簡単だ。ブラウザのCookieをオフにして,そのサイトを使ってみる。URLにPHPSESSIONIDとかJSESSIONIDとか出てきたらしめたものだ。そのURLをそのままメールにコピペして,標的ユーザに送りつける。一人二人じゃだめだぜ。大量に送るんだ。
まず,.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
<META http-equiv="Set-Cookie" content="JSESSIONID=XXXXXXXXXXXXXXXXXXXX; path=/; domain=.ne.jp">
標的ユーザがうっかりこのコンテンツを踏むと,彼の自慢のSafari君の中では,.ne.jpドメインのCookieがセットされるわけ。その後彼は,example.ne.jp(標的サイト)に誘導されると,さっきのCookieが送られて,ばきゅーん,セッションIDがFixationされちゃう,みたいな。
(3)HTTPヘッダインジェクションを使う
(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">↓↓標的サイトのxxx.tokyo.jpに誘導↓Session Fixation発動
(5)その他
他にもCookieセットする方法はあるけど,まぁレアかな。昔の本とかだと,標的ユーザが席離れた隙にCookieセットする,みたいなことが書いてあったりするけど,ばっかじゃねぇのと思うよね。Cookieセットする暇があったら,キーロガーでもなんでも仕込めるじゃない。この間も逮捕されたばかりだな。空き巣に入ってキーロガー仕掛けた奴が。
だから,さ。離席中にCookieセットする,みたいなのを読むと,まるで,女の子に無理に酒飲ませて泥酔させてさ,おいおいこいつ何するんだと思って見てたら,下着の色確認しただけで満足する,みたいな。却ってそれ,へんたーい,って感じがするのよ。
あぁ,そうそう,DNS攻撃する手もあるか。でも,それも泥酔攻撃と同じで変よね。というわけで(1)か(2)がふつーだと思うよ。
罠に掛かるのを見張る
えっ,そんな面倒くさい? 情けないこと言うね。手でアクセスするわけないじゃない。スクリプトよ,す・く・り・ぷ・と。まぁ,wgetとバッチファイルでもポーリングくらいはできるけど,ハッカー目指すみんなはRubyかPythonあたりでクールな監視のスクリプトを作ってくれ。ハッカーの癖にひねくれた奴だと,wshにvbscriptかjscriptってのもいそうだね。まぁ,好きにしてくれ。
セッションハイジャックする
ユーザがワナに掛かったら,いよいよセッションハイジャックだ。ようは,なりすましだな。
ログイン機能がないサイトでも,ハイジャックできる場合があるよ。でも,レアかな。たまに,個人入力画面が何段階かに分かれていて,途中の情報をセッションに入れている場合なんか、見れる場合があるね。「hiddenは危険」なんてIPAのサイトに書いてあるもんだから,セッションの方が安全だろうと思って墓穴を掘るケースよね。こういう場合はhiddenの方がずっと安全です。おっと,安全の話をしているんじゃなかった。
無粋な注意書き
このコンテンツはSession Fixationの啓蒙を目的として,同攻撃手法を分かりやすく、親しみやすく説明することを目的にしています。
この情報を元にした悪用は法律で禁止されています。あくまで防御目的のために,攻撃手法の理解のためにお読み下さい。