ブラウザ JavaScript で LAN に存在するホストの IP アドレスを列挙する
browser fingerprint の一種
#javascript #プライバシー
手順
192.168.0.0/24内の全ホストに対して fetch で GET リクエストを送り、タイムアウト OR 終了までの時間を記録する
これ、ネットワークアドレスが違うパターンもなくはないだろうから 192.168.x.1で 0~255 でスキャンしても良いかも
そもそも 192.168.x.x じゃないパターンは?
まあ無視でもよさそう、、、
タイムアウトまでの時間について大津の二値化をかけて閾値を決定
閾値よりも早くタイムアウトしてたらそのホストは存在する
原理
存在するホストに fetch したとき
80番ポートが閉じていれば、すぐに connection refused が返ってきてリクエストが失敗する
80番ポートが開いていれば、すぐに何らかのレスポンスが返ってくる
このとき HTTP のレスポンスヘッダに Allow-Cross-Access-Origin が含まれていない OR Allow-Cross-Access-Origin に Web ページのホストが入っていなければリクエストはすぐに失敗する
Allow-Cross-Access-Origin に Web ページのホストが入っていた場合、リクエストは成功する
存在しないホストに fetch したとき
タイムアウトするまで待ち続ける
存在する / 存在しないでタイムアウトまでの時間は2つのクラスタを形成するので、大津の二値化で閾値を決定できる
やってみた https://clutter.ikuta.me/guess-lan/
https://gyazo.com/44934a83dfdc321fbf44c4fdcea9e337
ルータの管理画面で実際のホストを見てみよう
https://gyazo.com/ae81e3adb6a8972aaf21afc0b4371bc4
https://gyazo.com/8eda5e3285d1e606c60d8d057d0c7c70
若干ミスってる感あるな。まあでも Web ページにアクセスするだけでこれくらいの情報は盗みとれるということですね。
これミスってるのかと思ったけど、DHCPのプールに残ってるだけで存在しないホストだった。発見率100%です、よかったですね
よくない!!!