Вкуриваем QR. Как сделать QR-код с сюрпризом

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, который программа не могла отфильтровать

Как мы можем увидеть, уведомление появилось в браузере, а значит, URI с потенциально вредоносным кодом был выполнен. Однако выполняется данный JS-код лишь тогда, когда пользователь нажимает Open Browser (то есть «Открыть в браузере»).

Еще один интересный пример из 2012 года: эксперт по информационной безопасности Равишанкар Боргаонкар (Ravishankar Borgaonkar) продемонстрировал, как сканирование простейшего QR может привести к форматированию устройств Samsung! Что же было внутри? MMI-код для сброса до заводских настроек: *2767*3855#, а также префикс tel: для совершения USSD-запроса.

Самое опасное здесь — что человек без предварительной подготовки не может узнать содержимое кода, не отсканировав его. А человек очень любопытен: в различных исследованиях большинство испытуемых (которые, кстати, даже не знали об эксперименте) сканировали QR-код именно из любопытства, забывая о собственной безопасности. Поэтому всегда будь внимателен!

 

QRGen — каждому по коду

Для демонстрации средств работы с QR-кодами я буду использовать Kali Linux 2019.2 с установленным Python версии 3.7 — это необходимо для корректной работы утилит.

Начнем с утилиты QRGen, которая позволяет создавать QR-коды с закодированными в них скриптами. Эта утилита (и вектор атаки) направлена на проверку незащищенного и непопулярного ПО либо же узкоспециализированных инструментов вроде складских QR-сканеров, отправляющих SQL-запросы к базе данных компании. Большинство современных сканеров из соображений безопасности не выполняют находящийся в QR-коде скрипт.

Соответственно, вариантов развития событий после сканирования два: сканер просто выводит содержимое нашего изображения (что для нас совсем невыгодно) либо исполняет код, спрятанный в изображении, отправляя SQL-запрос к СУБД или Web API, чтобы хакер смог его захватить.

QRGen позволяет использовать готовые варианты либо задать их самому.

Устанавливаем QRGen, копируя репозиторий, и переходим в папку с содержимым.

git clone https://github.com/h0nus/QRGen
cd QRGen && ls

Устанавливаем все зависимости и запускаем сам скрипт.

pip3 install -r requirements.txt
## или python3 -m pip install -r requirements.txt
python3 qrgen.py

Видим справку.

Справка QRGen

Аргумент -h выведет то же самое, а вот запуск с ключом -l приведет к генерации QR-кодов из определенной категории. Всего их восемь.

  • SQL-инъекции.
  • XSS.
  • Инъекции команд.
  • QR с форматированной строкой.
  • XXE.
  • Фаззинг строк.
  • SSI-инъекции.
  • LFI или получение доступа к скрытым каталогам.
  •  

    Возможные атаки

    Теперь давай посмотрим на примеры из каждой категории, а также разберемся, какой урон и каким устройствам они могут нанести.

  • 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

    Ответить

    Ваш адрес email не будет опубликован. Обязательные поля помечены *