基本的にはHTTPSのサイト、またフリーWifiを使用しなければ傍受されないため、悪用するといっても今やそんなシーンが滅多にないが、定型メッセージである「悪用厳禁」と一応書いておく。
環境設定
MacOSにWiresharkをインストール(XQuartzも必要)。
今回手元にフリーWifiのような暗号化しないWifiが用意できなかったため、ローカルでの通信で代用(それならChromeだけでいいのだが、Wiresharkを使ってみたかった)。
Wiresharkの設定
メニューの「Capture」→「Options…」からWi-Fi: enXXX(任意の数字)を見つけ、
Promiscuous:プロミスキャスモード(自分以外の通信も受信するモード)
Monitor:すべての無線通信を受信するモード
にチェックがつける。
が、暗号化するWifiを使っている場合、Monitorにチェックを入れると内容が確認できないようになるため、ローカルで確認する場合はやめる。
いろいろ調べていると、暗号化にWPA(無線LANにおける暗号化規格)を利用している場合は、テンポラリーキーを生成しており、パスフレーズを知っているだけでは暗号化を復元できない(復元する場合は、アクセスポイントに接続する最初の通信あるいはテンポラリーキーの更新のタイミングでMacアドレスと使用される乱数を抜き出すことで復元できるらしい)。
2021/07/08追記
WPAには様々な種類があるが、たとえばWPA2-RSKという過程でよく使用される方式のものは、アクセスポイントに接続する人全員に同じパスワードを共有する必要がある。この場合、条件が整えば比較的容易にアクセスポイントの通信内容を解読でき、また偽のアクセスポイントを設置して通信内容を盗むことも可能である。
このため、WPAパーソナル(WPA2-PSK)方式の公衆Wifiについては暗号化されていないWifi同様留意して使用する必要がある。
その後、Capture画面で対象のWifiをクリックすることでキャプチャーが開始される。
今回の対象はWebサイトでHTTPSでは中身が見えないため、HTTPでフィルターをかける。
傍受開始
適当なHTTPサイトにアクセスする。
今回は下記のようなページでテストした。
アクセスするたびに画面上の数値が増えていく。
<?php
session_name('target-session-name');
session_start();
?>
<html><head><meta charset="utf-8" /></head>
<body>
<?php
if (!isset($_SESSION['count'])){
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
echo $_SESSION['count'];
?>
</body>
</html>
初回アクセスすると「1」と表示される。
10回アクセスしてみて、このセッションを奪い取ってみる。
Wireshark上でターゲットの列を選択すると英語がいろいろ出てくるが、このうちの「Hypertext Transfer Protocol」を開き、Cookieの項目を開いてみるとCookieのキーとバリューのペアが出てくるため、それをメモする。
ChromeのDevToolsを開き、ApplicationのCookiesで該当のドメインのCookieを探し、Valueをメモした値に書き換える。
すると次にリロードしたときに11回目のアクセスとなり、セッションハイジャックに成功、となる。
補足:HTTPSのサイトでもsecure属性が付いていないCookieの盗聴は可能
HTTPサイトの場合のみ解説を行なったが、HTTPSのサイトであってもCookieにsecure属性がついていない場合は、盗聴が可能である。
混在コンテンツ(HTTPとHTTPSが両方存在するページ)が発生していればその混在コンテンツ当然のように解読できる。たとえば、ページ内の画像がHTTPだとすると、そこに送信されたCookieを盗聴できる。
リダイレクトされている場合も当然一瞬のアクセスから盗聴できるし、また80番ポートを閉じていたとしてもTCP/IPの3ウェイハンドシェイクで最初のSYNパケットに対してRSTパケットが返され、TPCコネクションが確立せずHTTPリクエストは発生しないが、<img src=”http://example.com:443/hoge.jpg” />とすることでファイルリクエストには失敗するものの443ポートでCookieの送信はされてしまう。
そのため、Cookieには必ずsecure属性をつけるようエンジニアは注意されたし。
所感
httpだと本当に簡単に盗まれてしまうため、マジで危険意識が高まる。
まあhttpでもそれなりに実装すれば、これほど簡単には盗まれなくなるが、httpsにすることがより手っ取り早く、(きちんと実装すれば)より安全である。