Live Demo Только отключите AdBlock
Проект выполнен в рамках хакатона demhack 3, большое спасибо всем организаторам и команде (от лица того кто это пишет)
Еще один веб-сервис и Proof of concept того, что для отслеживания пользователя и его посещений ресурса совершенно не обязтельно просить его залогиниться. Пользователь может заходить под VPN, может менять UserAgent-a, может сменить браузер или даже устройство, все равно используя только информацию находящуюся в открытом доступе и легко вытаскиваемую из браузера его можно идентифицировать.
Проект визуализирует и структурирует данные, которые могут получить сайты при помощи технической информации, отправляемой при запросе, скриптов на клиентской стороне и API браузера. На основе полученной информации пользователю выдается уникальный идентификатор и его история посещений ресурса, идентификатор позволяет ему попробовать обмануть сервис поменяв что-то в получаемой сервисом информации.
Дисклеймер: то что было написано, было написано за 2 дня, не судите строго
Live Demo Только отключите AdBlock
С места в карьер, хорошо работает на Chrome 93 и FF 92. У каждого браузера свое специфичное API, это не значит что работать не будет совсем, но некоторые метрики могут отвалиться. Добавить поддержку всех мы не успели
Вебсайт:
- Сбор всевозможных метрик на клиенте:
- Приложения установленные на устройства (не полный список);
- Железо устройства (оперативная память, процессор, GPU);
- Открытые порты (отключено, работает в FF на линуксе);
- Информация о браузере и устройстве (размер экрана, версия и производитель браузера и т.д).
- Визуализация и взаимодействие с сервером :
- Отправка на сервер и визуализация собранных данных;
- Великолепный дизайн.
Бэкенд:
- API для обработки и хранения отпечатков пользователя;
- Поиск пользователей и их истории посещений по отпечатка.
Принципиальным выбор технологий не был, все могло быть реализовано иначе.
Бэк: Golang
База: Postgresql
Фронт: Flutter
Сами скрипты можно найти в frontend/web/metrics/
У метрик есть свой репозиторий, код и метрики слегка доработаны
Была взята готовая либа, которая уже хорошо справляется с поставленной задачей fingerprintjs Базовые но довольно тщательно собранные метрики, что-то не собирается, но пользователя идентифицировать позволяет
Был найден хороший пост на стеке, где на основе разных особенностей браузеров выявлялся конкретный. Пост на стеке
Ищем приложения из заранее заданного пула, очень полезная штука, которая здорово облегчает крос-браузерную идентификацию пользователя.
Короткий концепт звучит так, используя deep linking ссылки типа "skype://" пытаемся вызывать контекстное окно для открытия приложения, если появилось, значит приложение установлено. Делаем все это в отдельном окне.
А вот готовой либы для такого нет, пришлось переписать на js используя наработки из live-demo написанного на TypeScript.
Опять же, очень хорошо для крос-браузерной идентификации. Если коротко, лезем в открытый порт, лезем в закрытый порт, сравниваем время, открытый должен обрабатываться медленнее (проверяем несколько раз, для уверенности) Описание концепции
Основная идея:
- По id расширения, если знать какой-то файл, который в нем точно есть можно получить страницу.
- Парсим id из стора
- Качаем расширение как .crx архив, открываем из него manifest.json и ищем в нем статичный файл внутри web_accessible_resources
- Делаем fetch chrome-extension://EXTENSION_ID/EXTENSION_STATIC_FILE если есть ответ - победа
Например для Google Переводчик
fetch('chrome-extension://aapbdbdomjkkjkaonfhkkikfgjllcleb/options.html').then(
(response) => {
console.log(response);
if (response.ok) {
console.log("OK!!!")
}
},
() => {}
);
Id мы спарсили, скрипт лежит в /scripts/