
ブラウザベースのネットワークスキャナー & ローカルIP検出
webscan は、ブラウザベースのネットワークIPスキャナ兼ローカルIP検出ツールです。WebRTC経由でRTPデータチャネルをリッスンし、生存している任意のIPのポートにループバックすることで、ユーザー/被害者にバインドされたIPを検出します。また、有効なサブネット上のIPアドレスを、fetch() 呼び出しや、有効なサブネット/IPを指す非表示のimgタグから即座のタイムアウト(TCP RSTパケットの返送)を監視することで、すべての生存IPアドレスを発見します。モバイルおよびデスクトップの主要ブラウザとOSで動作します。ベータ版は拡張可能で、複数の手法を追加できます。
webscanは、応答しないimgタグのソケットを閉じてブラウザおよびネットワークベースのレート制限を回避できることを利用しています。これは、src属性をソケット以外のURIに変更する(DOMから削除しても皮肉にもソケットは閉じません)か、AbortController() インターフェースのfetch()のシグナルサポートを使用することで実現します。
by @SamyKamkar
リリース日 2020/11/07
その他の楽しいプロジェクトは samy.pl
webscanは以下のように動作します
fetch() を使用して http://common.gateway.ip:1337 への偽のHTTP接続を行いますfetch() のプロミスは拒否されるか、imgタグの onerror がタイムアウト前にトリガーされ、生存IPを示しますfetch() ソケットは AbortController() シグナルで閉じられ、imgタグのsrcはソケット以外のURIにリダイレクトされてソケットが閉じられます// wait for scan to finish
let scanResults = await webScanAll()
// or get callbacks when ips are found with a promise
let ipsToScan = undefined // scans all pre-defined networks if null
let scanPromise = webScanAll(
ipsToScan, // array. if undefined, scan major subnet gateways, then scan live subnets. supports wildcards
{
rtc: true, // use webrtc to detect local ips
logger: l => console.log(l), // logger callback
noRedirect: false, // if true, doesn't redirect from http to http - Chrome doesn't scan detect network IPs proprly on https atm
localCallback: function(ip) { console.log(`local ip callback: ${ip}`) },
subnetCallback: function(ip) { console.log(`router ip callback: ${ip}`) },
networkCallback: function(ip) { console.log(`network ip callback: ${ip}`) },
}
)
returns
scanResults = {
"local": ["192.168.0.109"], // local ip address
"network": { // other hosts on the network and how fast they respond
"192.168.0.1": 97,
"192.168.0.2": 82,
"192.168.0.100": 46,
"192.168.0.109": 0,
"192.168.0.117": 74,
"192.168.0.113": 17,
"192.168.0.112": 21,
"192.168.0.114": 25,
"192.168.0.116": 25,
"192.168.0.115": 25,
"192.168.0.105": 57,
"192.168.0.107": 63,
"192.168.0.103": 64,
"192.168.0.108": 31
}
}
Todo
Tested on