
Сетевой сканер на основе браузера и обнаружение локального IP-адреса
webscan — это веб-сканер, работающий в браузере, для сканирования IP-адресов сети и обнаружения локального IP. Он обнаруживает IP-адреса, привязанные к пользователю/жертве, прослушивая канал данных RTP через WebRTC и выполняя обратное подключение к порту через любые живые IP-адреса, а также обнаруживает все живые IP-адреса в действительных подсетях, отслеживая немедленные тайм-ауты (возвращаемые пакеты TCP RST) от вызовов fetch() или скрытых тегов img, указывающих на действительные подсети/IP-адреса. Работает на мобильных устройствах и настольных компьютерах во всех основных браузерах и ОС. Бета-версия расширяема и позволяет добавлять несколько техник.
webscan использует тот факт, что сокеты не отвечающих тегов img могут быть закрыты для предотвращения ограничений скорости браузера и сети путем изменения атрибута src на URI, не являющийся сокетом (удаление из DOM, как ни странно, не закрывает сокет), или с помощью поддержки сигналов fetch() из интерфейса AbortController().
попробовать webscan вживую здесь
бета-версия здесь
от @SamyKamkar
выпущено 2020/11/07
больше интересных проектов на samy.pl
webscan работает следующим образом
fetch() выполняется фиктивное HTTP-соединение с http://common.gateway.ip:1337fetch() будет отклонено или сработает onerror тега img до тайм-аута, что указывает на живой IPfetch() закрываются через сигнал AbortController(), а у тегов img атрибут src перенаправляется на URI, не являющийся сокетом, закрывая сокет// дождаться завершения сканирования
let scanResults = await webScanAll()
// или получать колбэки при обнаружении IP с помощью обещания
let ipsToScan = undefined // сканирует все предопределённые сети, если null
let scanPromise = webScanAll(
ipsToScan, // массив. если undefined, сканировать шлюзы основных подсетей, затем сканировать живые подсети. поддерживает маски
{
rtc: true, // использовать WebRTC для обнаружения локальных IP-адресов
logger: l => console.log(l), // колбэк для логирования
noRedirect: false, // если true, не перенаправляет с http на http — Chrome пока не корректно обнаруживает IP сети через https
localCallback: function(ip) { console.log(`колбэк локального IP: ${ip}`) },
subnetCallback: function(ip) { console.log(`колбэк IP шлюза: ${ip}`) },
networkCallback: function(ip) { console.log(`колбэк IP сети: ${ip}`) },
}
)
возвращает
scanResults = {
"local": ["192.168.0.109"], // локальный IP-адрес
"network": { // другие хосты в сети и скорость их ответа
"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
}
}
Задачи
fetch(), так и img в качестве ядра сканера (реализовано в бета-версии)
.src, похоже, не прерывает соединение.src — это отлично!img.src на '#' вызывает ещё один запрос к той же родительской страницеimg.src на 'about:' выдаёт предупреждение в консоли; есть ли что-то другое, что не вызовет запрос?img как механизм обнаружения локального IPПротестировано на