QR-код сейчас совершенно обыденная вещь — они встречаются повсюду, их используют как один из способов авторизации крупные сервисы вроде WhatsApp, Яндекса и AliExpress, встречаются QR-коды для подключения к Wi-Fi. Но насколько надежна эта технология? Можно ли создать такой QR-код, при сканировании которого выполнится нагрузка на девайсе жертвы? Этот вопрос мы сегодня разберем подробнее.
QR-код (англ. Quick Response Code — код быстрого реагирования) — это матричный или двумерный штрих-код, который может содержать до 4296 символов ASCII. То есть, проще говоря, картинка, в которой зашифрован текст.
В мае 2013 года специалисты компании по сетевой безопасности Lookout Mobile разработали специальные QR-коды, которые смогли скомпрометировать очки Google Glass. На тот момент очки сканировали все фотографии, «которые могут быть полезны их владельцу», — и предоставили взломщикам полный удаленный доступ к устройству. Исследователи сообщили в Google о данной уязвимости, и ее закрыли буквально за несколько недель. К счастью, исправить успели до того, как ее можно было использовать вне лаборатории, ведь взлом очков реального пользователя мог привести к большим проблемам.
В 2014 году программа Barcode Scanner для мобильных устройств из проекта ZXing практически не проверяла тип URI, передаваемый через QR-код. В результате любой эксплоит, который мог быть исполнен браузером (например, написанный на JavaScript), можно было передать через QR.
Сканер пытался отфильтровать опасные виды атак с помощью регулярных выражений, требуя, чтобы URI имел период с последующим продлением как минимум на два символа, транспортный протокол длиной не менее двух символов, за которым следует двоеточие, и чтобы в URI не было пробелов.
Если содержимому не соответствует хотя бы одному из требований, то оно определяется как обычный текст, а не URI. Этот механизм блокирует атаки вроде javascript;alert("You have won 1000 dollars! Just Click The Open Browser Button");
, но, внеся пару простых изменений в код, мы получаем вариант, который программа исполняла в браузере, ведь она считала JS-код обыкновенным, «нормальным» URI!
Вот как это выглядело.
Как мы можем увидеть, уведомление появилось в браузере, а значит, URI с потенциально вредоносным кодом был выполнен. Однако выполняется данный JS-код лишь тогда, когда пользователь нажимает Open Browser (то есть «Открыть в браузере»).
Еще один интересный пример из 2012 года: эксперт по информационной безопасности Равишанкар Боргаонкар (Ravishankar Borgaonkar) продемонстрировал, как сканирование простейшего QR может привести к форматированию устройств Samsung! Что же было внутри? MMI-код для сброса до заводских настроек: *2767*3855#
, а также префикс tel:
для совершения USSD-запроса.
Самое опасное здесь — что человек без предварительной подготовки не может узнать содержимое кода, не отсканировав его. А человек очень любопытен: в различных исследованиях большинство испытуемых (которые, кстати, даже не знали об эксперименте) сканировали QR-код именно из любопытства, забывая о собственной безопасности. Поэтому всегда будь внимателен!
Если у тебя нет сканера кодов, но уйма свободного времени — можно попробовать расшифровать код вручную. Инструкция есть на Хабре.
Для демонстрации средств работы с QR-кодами я буду использовать Kali Linux 2019.2 с установленным Python версии 3.7 — это необходимо для корректной работы утилит.
Не забывай про уголовную ответственность за создание и распространение вредоносных программ, к которым в широком смысле относятся и наши «заряженные» QR-коды.
Начнем с утилиты QRGen, которая позволяет создавать QR-коды с закодированными в них скриптами. Эта утилита (и вектор атаки) направлена на проверку незащищенного и непопулярного ПО либо же узкоспециализированных инструментов вроде складских QR-сканеров, отправляющих SQL-запросы к базе данных компании. Большинство современных сканеров из соображений безопасности не выполняют находящийся в QR-коде скрипт.
Соответственно, вариантов развития событий после сканирования два: сканер просто выводит содержимое нашего изображения (что для нас совсем невыгодно) либо исполняет код, спрятанный в изображении, отправляя SQL-запрос к СУБД или Web API, чтобы хакер смог его захватить.
QRGen позволяет использовать готовые варианты либо задать их самому.
Устанавливаем QRGen, копируя репозиторий, и переходим в папку с содержимым.
git clone https://github.com/h0nus/QRGen cd QRGen && ls
QRGen требует Python версии 3.6 и выше. Если возникает ошибка, попробуй обновить интерпретатор.
Устанавливаем все зависимости и запускаем сам скрипт.
pip3 install -r requirements.txt ## или python3 -m pip install -r requirements.txt python3 qrgen.py
Видим справку.
Аргумент -h
выведет то же самое, а вот запуск с ключом -l
приведет к генерации QR-кодов из определенной категории. Всего их восемь.
Теперь давай посмотрим на примеры из каждой категории, а также разберемся, какой урон и каким устройствам они могут нанести.
0'XOR(if(now()=sysdate(),sleep(6),0))XOR'Z
<svg onload=alert(1)>
cat /etc/passwd
%d%d%d%d%d%d%d%d%d%d
<!ENTITY % xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd" >
"A" x 33
<pre><!--#exec cmd="ls" --></pre>
../../../../../../etc/passwd
Посмотреть текстовые файлы со всеми вариантами «начинки» QR-кодов ты можешь в папке words
(они разделены по категориям, указанным выше).
Теперь пара слов о последствиях атак подобными нагрузками.
Первый класс атак — SQL-инъекции — используют при взломе БД и нарушении работы веб-сайтов. Например, запрос может вызывать зависание сайта.
Следующий пример (под номером 2) демонстрирует эксплуатацию XSS-уязвимости при атаке на веб-приложения с использованием SVG (Scalable Vector Graphic). К чему может привести XSS, ты, думаю, и без меня прекрасно знаешь, так что подробно на этом останавливаться не буду.
Третий пункт выводит на экран жертвы содержимое файла /etc/passwd
: список аккаунтов Linux-based-систем и дополнительную информацию о них (раньше — хеши паролей этих учетных записей). В подобных случаях обычно стараются получить /etc/shadow
и конфигурацию сервера, но все очень сильно зависит от цели, так что какие файлы читать — решай сам.
Четвертый пример представляет собой выражение, которое вызовет переполнение буфера (buffer overflow). Оно возникает, когда объем данных для записи или чтения больше, чем вмещает буфер, и способно вызвать аварийное завершение или зависание программы, ведущее к отказу в обслуживании (denial of service, DoS). Отдельные виды переполнений дают злоумышленнику возможность загрузить и выполнить произвольный машинный код от имени программы и с правами учетной записи, от которой она выполняется, что делает эту ошибку довольно опасной.
Пятый по счету класс атак (XXE Injections) представляет собой вариант получения скрытой информации веб-сервера с помощью анализа вывода XML-файлов. Конкретно в нашем примере при запросе к серверу тот ответит зашифрованным в Base64 содержимым файла /etc/passwd
, который уже упоминался. Однако расшифровать его не составит труда — достаточно лишь воспользоваться встроенной в большинство дистрибутивов Linux утилитой base64
либо же онлайн-конвертером.
Атаки форматной строки (пример 6) — это класс уязвимостей, который включает в себя предоставление специфичных для языка маркеров формата для выполнения произвольного кода или сбоя программы. Вместо этого маловразумительного объяснения предлагаю другое: это класс атак, когда приложение некорректно очищает пользовательский ввод от управляющих конструкций, которые и выполняются. Если ты программировал на С, то, конечно, помнишь те интересности с выводом переменных через printf
: надо было в первом аргументе (который строка) указать на тип выводимого значения (%d
для десятичного числа и так далее).
Седьмой пункт представляет собой вариант command injection, которая выполняет определенный код на стороне сервера. В моем примере будет выполнена команда ls
, которая покажет содержимое текущей директории, но, конечно, там может быть гораздо более опасный код.
И наконец, последняя категория — это LFI-уязвимости (Local File Inclusion; включение локальных файлов), позволяющие просмотреть на уязвимых (или неправильно настроенных) серверах файлы и папки, которые не должны были быть видны всем. Один из возможных вариантов — просмотреть файл /etc/passwd
, о котором мы с тобой уже не раз говорили. Это может выглядеть вот так.
Обрати внимание, что в качестве тестового веб-приложения используется DVWA (Damn Vulnerable Web Application), который был специально разработан для обучения пентесту. Многие атаки на веб-приложения можно отработать на нем.
А сейчас перейдем к практике — протестируем эту утилиту сами.
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее
1 год7690 р. |
1 месяц720 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости