Содержание
Сканирование QR-кода для логина больше нельзя считать безопасной практикой. Любой школьник с пачкой убедительно написанных писем может заманить на вполне настоящий сайт и угнать ваш WhatsApp.
Еще по теме: Методы социальной инженерии
В этой статье я покажу, как хакеры используют QRLJacker для создания QR-кода, при сканировании которого выполнится нагрузка на девайсе жертвы. QRLJacker отчасти похож на QRGen, но представляет совершенно другой вектор атаки — QRLJacking. Давайте разбираться.
Атака QRLJacking
SQRL (произносится как squirrel — белка, а расшифровывается как Secure, Quick, Reliable Login или Secure Quick Response Login) — открытый проект для безопасного входа на веб-сайт и аутентификации. При входе, естественно, используется QR-код, который обеспечивает проверку подлинности.
Как же выполняется вход при использовании данного способа аутентификации?
- Пользователь посещает сайт и открывает сессию.
- Сайт генерирует QR-код с ключом сессии. Этот код регулярно меняется в целях безопасности.
- Пользователь сканирует QR-код.
- Мобильное приложение генерирует аутентификационный сигнал, который содержит секретный токен (в него входят ID пользователя, код сессии, специальное сообщение, созданное с помощью приватного ключа пользователя).
- Сайт получает сигнал и идентифицирует пользователя, производя вход (если, конечно, верификация завершена корректно).
Довольно долго метод SQRL считался действительно безопасным, пока Мохамед Бассет (Mohamed Basset) не предложил способ атаки на сервисы, использующие SQRL, который был назван QRLJacking. Способ требует создать фишинговую страницу и разместить на ней генерируемое через определенные промежутки времени QR-код. Давай рассмотрим его поподробнее.
- Злоумышленник инициирует клиентскую QR-сессию и клонирует код QR-логина на фишинговую страницу.
- Жертве отправляется ссылка на эту страницу. Выглядит страничка вполне безопасно.
- Жертва сканирует поддельный QR-код, а приложение отправляет секретный токен, завершающий процесс аутентификации.
- Злоумышленник получает подтверждение от сервиса и теперь может контролировать аккаунт жертвы.
Именно для реализации данного метода была создана утилита QRLJacker, о которой сейчас и пойдет речь.
Как использовать QRLJacker
Какие веб-ресурсы уязвимы перед подобным вектором атаки? По заверению разработчиков, это популярные мессенджеры вроде WhatsApp, WeChat, Discord, Line, все сервисы Яндекса (ведь для входа в любой из них требуется вход в Яндекс.Паспорт, который и предоставляет возможность аутентификации через QR), популярные торговые площадки Alibaba, AliExpress, Tmall и Taobao, сервис AliPay, а также приложение для удаленного доступа AirDroid.
Само собой, список неполный, ведь все ресурсы, использующие SQRL, просто не перечесть.
Установка QRLJacker
Теперь давай установим утилиту QRLJacker (программа работает только на Linux и macOS, более подробную информацию можешь найти в README проекта, к тому же нам необходим Python 3.7+).
- Заходим в систему от имени суперпользователя (root), иначе Firefox может выдать ошибку при запуске модулей фреймворка QRLJacker.
- Обновляем Firefox до последней версии.
- Скачиваем самый новый geckodriver с GitHub и распаковываем файл, затем выполняем команды:
1234chmod +x geckodriversudo mv -f geckodriver /usr/local/share/geckodriversudo ln -s /usr/local/share/geckodriver /usr/local/bin/geckodriversudo ln -s /usr/local/share/geckodriver /usr/bin/geckodriver - Клонируем репозиторий и переходим в папку с содержимым:
12git clone https://github.com/OWASP/QRLJackingcd QRLJacking/QRLJacker && ls - Устанавливаем все зависимости:
1python3.7 -m pip install -r requirements.txt
Использование QRLJacker
Запускаем фреймворк (с ключом —help для получения краткой справки):
1 |
python3.7 QrlJacker.py --help |
При обычном запуске (без аргументов вовсе) ты увидишь примерно такую картинку.
Прописав команду help внутри фреймворка, ты получишь полную справку по командам QRLJacker.
Теперь давай запустим единственный (на данный момент) модуль — grabber/whatsapp. Список всех доступных модулей можем посмотреть командой list, выбрать модуль для использования — командой use. Команда options подскажет нам текущие значения опций, а set задаст то или иное значение опции. Команда run запустит наш модуль, а командой jobs мы можем просмотреть активные задачи.
Порт 1337 стандартный для данного фреймворка, остальные опции я трогать не стал. HOST оставил локальным (0.0.0.0), но вывести его в сеть — не проблема. Это можно сделать, используя, например, ngrok:
1 |
ngrok http 1337 |
Параметр User-Agent также решил оставить дефолтным (по умолчанию), но всего там три варианта: стандартный, случайный и кастомный (ручная настройка). Используй вариант, который тебе больше всего подходит.
После чего запускаю модуль и смотрю текущие задачи. Там указан их ID, название модуля, а также адрес, на котором располагается страница модуля. По стандарту она выглядит так (QR-код частично замазан для защиты от ~~людей в погонах~~ злоупотреблений):
Изменить эту страницу можно, поправив по своему вкусу файл QRLJacker/core/templates/phishing_page.html.
Оригинальный исходник прост и незамысловат, что позволяет быстро изменить текст даже неподготовленному взломщику.
После внесения изменений в файле они будут автоматически применены в фреймворке.
Написание своих модулей
Давай обсудим, что необходимо для создания своего модуля для QRLJacker. Документацию и инструкцию по созданию модулей ты можешь найти в репозитории проекта либо в папке, которую ты клонировал раньше (QRLJacker/docs/README.md).
Модули-грабберы — основа фреймворка, и располагаются они в QRLJacker/core/modules/grabber.
Когда ты добавляешь туда любой Python-файл, он появляется в фреймворке с тремя опциями — хост, порт и юзерагент.
Код модуля должен быть построен по данному шаблону:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
## -*- coding: utf-8 -*- from core.module_utils import types class info: author = "" short_description = "" full_description = None class execution: module_type= types.grabber name = "" url = "" image_xpath = "" img_reload_button = None change_identifier = "" session_type = "localStorage" |
Например, модуль grabber/whatsapp сделан именно в этом формате, посмотреть его также можно в репозитории или открыв сам Python-файл, лежащий в QRJacker/core/modules/grabber/whatsapp.py.
Теперь давай разберемся, что означает каждая из переменных, которые мы задаем на этих строках.
Класс info
Тут твое имя (или никнейм), которое появится при вызове справки модуля, краткое описание модуля и его полное описание (можно заполнять, можно оставить значение None). Больше ничего интересного в классе info нет, но прежде, чем мы перейдем к следующему (execution), давай посмотрим вызов справки (которая будет черпать информацию из кода) на примере модуля WhatsApp. Вот код info:
1 2 3 4 |
class info: author = "Karim Shoair (D4Vinci)" short_description = "Whatsapp QR-sessions grabber and controller" full_description = None |
А вот справка по модулю.
1 2 3 4 5 |
$ info grabber/whatsapp Module : grabber/whatsapp Provided by : Karim Shoair (D4Vinci) Description : Whatsapp QR-sessions grabber and controller |
Класс execution
Тут возни уже побольше: нужно не только название модуля, но и URL сайта, откуда будет браться QR-код и где будет производиться авторизация. Также нужен XPATH изображения с QR-кодом на странице. Чтобы понять, что это, опять обратимся к примеру в виде модуля WhatsApp. Там данный параметр выглядит как /html/body/div[1]/div/div/div[2]/div[1]/div/div[2], то есть путь до объекта внутри HTML-документа.
Далее нужен XPATH кнопки, которая обновляет QR-код на странице (если таковая имеется, в противном случае оставь значение None). Для большей конспирации используется XPATH элемента, который исчезает после получения сессии. Например, разработчики QRLJacker в модуле grabber/whatsapp использовали чекбокс «Запомнить меня».
И напоследок нужна переменная, которая принимает значения localStorage или Cookies. Она должна соответствовать способу, с помощью которого на веб-сайте определяется пользовательская сессия.
Вот и все — после того как разберешься со всеми этими пунктами, тебе останется лишь добавить файл в папку с граббер-модулями и создать HTML-файл (index.html) со страницей в core/www/твое_имя_модуля.
Готово! Ты создал свой модуль.
Угон сессии WhatsApp
А теперь бегло посмотрим, как можно использовать этот фреймворк для атаки QRLJacking. Например, злоумышленник может скопировать оригинальный сайт web.whatsapp.com и вставить туда фальшивый QR-код для получения доступа к сессии. Или пример, который приводит сам создатель утилиты QRLJacker.
Это плагин, который, если зайти на популярный зарубежный сайт Amazon, выдаст тематическое уведомление о «получении подарка от WhatsApp в честь Дня святого Валентина» (обрати внимание на правый верхний угол). Естественно, чтобы получить подарок, нужно отсканировать QR-код, что не даст тебе ничего, кроме утечки личных данных. Будь очень бдителен, ведь, как я и показал раньше, этот вектор атаки и утилиты для его использования находятся в открытом доступе, а написать модуль для QRLJacker — задача, посильная даже начинающему питонисту.
Выводы
Сканировать QR-код небезопасно! Надеюсь, этот небольшой обзор отучит тебя бездумно сканировать каждый попавшийся на глаза код.
Еще по теме: Примеры социальной инженерии
Интересная статья. Много чего для себя узнал.
всем привет, знаю хорошего программиста который может помочь с любой проблемой. напишите мне на ватсап +79686179601
я дам вам контакты