image

А что бы сделали вы, если бы могли публиковать записи в Twitter от имени любого пользователя социальной сети? Представили? Тогда прошу вас под кат за деталями.

Предисловие


В ходе исследования безопасности социальной сети Twitter в рамках BugBounty-программы мной была обнаружена уязвимость, которая позволяла злоумышленнику размещать записи в Твиттере от имени любого пользователя сервиса, не имея при этом доступ к аккаунту жертвы. Данная бага представляет особую опасность в связи с тем, что огромное количество как представителей СМИ, так и других известных личностей, имеет аккаунты в Твиттере и использует их для публикации различных новостей. А обнаруженная проблема безопасности позволяет разместить заведомо ложную информацию не в одном, а сразу в нескольких крупных аккаунтах (например, новостных изданий), и публика с большой долей вероятности поверит в неё. Имеются реальные примеры, когда с помощью дезинформации злоумышленники серьёзно влияли на цену акций определённых компаний ради собственной выгоды. Подробнее о таких прецедентах можно прочитать (тут). Данная уязвимость была обнаружена 26 февраля 2017 года и исправлена 28 февраля 2017 года.

Перейдём к техническим подробностям уязвимости.

Введение


В Твиттере есть такой сервис, как ads.twitter.com, в нем расположена медиа-библиотека с возможностью загружать медиа-файлы (видео, картинки, gif-ки), а также смотреть ранее загруженные медиа-файлы, которые были использованы при публикации твита. Библиотека доступна по ссылке вида: ads.twitter.com/accounts/ид_вашего_аккаунта/media. Теперь к делу.

Осматриваемся


Перейдя в библиотеку, мы видим функцию загрузки медиа-файлов:

image

После того, как мы нажимаем на кнопку «Загрузить медиа-файл» и выбираем его, нам будет видна следующая картина:

image

По нажатию на загруженное изображение мы видим следующее:

image

  1. Возможность твитнуть наш медиа-файл.
  2. Возможность поделиться медиафайлом с любым пользователем.

Так, хорошо, посмотрим на функцию твита поближе:

image

Что мы видим? Предположительно, следующее:

  • account_id — id аккаунта конкретно в библиотеке
  • owner_id — id владельца изображения
  • user_id — id юзера, которому, собственно, и опубликуется твит
  • media_key — id нашего медиафайла (на скриншоте №3, в адресной строке, он отображен)

Введём некоторые обозначения:

  • аккаунт №1 — первый мой аккаунт
  • аккаунт №2 — второй мой аккаунт

Поскольку я не помню точные формулировки выдаваемых ошибок, будем называть их
«ошибка №1» и «ошибка №2».

Пробуем


Что было сделано мной для обнаружения уязвимости:

Сначала я перехватил запрос на публикацию твитта и подменил параметры owner_id и user_id в GET и в json-е, который отправлялся методом POST, с id аккаунта №1 на соответствующие id аккаунта №2, но ожидаемого результата я не получил, лишь ошибку №1.

После этого я решил заменить owner_id и user_id только в POST, на что получил ошибку №2, насколько я помню, текст был примерно таким: «Пользователь с owner_id *тот id на который я заменял* не является владельцем медиа *тут media_key*».

«Хорошо», — подумал я, и сделал следующее:

Я воспользовался аккаунтом №2, зашёл в сервис ads.twitter.com, в библиотеку, и загрузил изображение для того, чтобы заранее знать media_key.

Пошло-поехало


Возвращаемся на аккаунт №1:

Перехватываем запрос на твит и подменяем owner_id, user_id в GET и POST на соответствующие данные аккаунта №2 и media_key на тот, который мы узнали, загрузив изображение на аккаунте №2. Иииии… видим ошибку №1. Грусть, печаль, тоска, хотя подождите. Когда мы ранее заменяли owner_id и user_id в GET и POST, ошибка была одна (ошибка №1), а в случае замены owner_id и user_id только в POST, ошибка была другая (ошибка №2). Попробуем?

Заменяем в запросе owner_id, user_id и media_key в POST, ииии… видим response, сообщающий, что публикация твита прошла успешно! Перейдя на аккаунт №2, мы видим, что был размещен твит с ранее загруженной картинкой аккаунта №2, хотя сам аккаунт №2 ничего не публиковал.

Пробуем усерднее


Итак, на данный момент мы имеем возможность публиковать твиты от имени любого пользователя, но у нас есть жёсткое ограничение, которое серьезно снижает impact(критичность уязвимости), а именно, нам нужно, чтобы у пользователя, от имени которого мы собираемся делать публикацию, был загружен медиа-файл. Более того, необходимо знать media_key этого файла, который подобрать не получится, поскольку он состоит из 18 цифр. Что ж, будем искать возможность узнать media_key. В процессе поисков я не обнаружил 100%-ного способа узнать этот media_key, всегда были какие-то ограничения в виде определённых обстоятельств, при которых, возможно, удалось бы получить тот самый media_key. Всё кончено? Выхода нет? Репортить, как есть? Ну уж нет! Внутреннее чувство мне подсказало, что эту уязвимость можно довести до апогея критичности! Помните возможность делиться загруженным медиа-файлом? Мне пришла в голову мысль, что, возможно, когда мы поделимся нашим медиа-файлом с пользователем, от имени которого мы хотим сделать публикацию, он будет также считаться владельцем медиа-файла, ошибка №2 не возникнет и твит успешно опубликуется. И именно так и произошло:)

Для успешной эксплуатации уязвимости нам не хватало media_key, но в случае, когда мы являемся владельцем файла, мы можем видеть его media_key (скриншот №3).

Теперь сценарий выглядит следующим образом:

  1. Мы загружаем наш медиа-файл.
  2. Делимся этим файлом с пользователем, от имени которого хотим опубликовать запись.
  3. Перехватываем запрос публикации твита и просто подменяем в POST owner_id и user_id на id twitter аккаунта жертвы (узнать его просто, есть много онлайн сервисов).
  4. Получаем сообщение об успешной публикации твита.

Вот теперь можно со спокойной душой репортить об уязвимости.

Выводы:


RCE, SQLi, XSS — это всё конечно очень здорово и опасно, но порой логические уязвимости несут не меньшую угрозу для безопасности и зачастую гораздо более просты в эксплуатации нежели вышеперечисленные. На это стоит обращать пристальное внимание и при этом внимание живых специалистов, ведь автоматизированные сканеры не способны на такое. А что касается Twitter, то еще не известно сколько подобных уязвимостей в нем сейчас есть и может появиться по мере его развития и добавления функциональности. Удачного всем bughunting'а!
Поделиться с друзьями
-->

Комментарии (26)


  1. Disen
    04.05.2017 11:05
    +3

    Дьявол в деталях. Просто, но со вкусом. :)


  1. sotnikdv
    04.05.2017 13:40
    +3

    А вы уже знамениты.

    Но правда сама новость своеобразно подана

    «По мнению экспертов, уязвимость могла бы быть использована для манипуляции котировками акций и провокации волнений в регионах»

    «В блоге компании Digital Security на сайте Habrahabr.ru можно увидеть примеры таких твитов, написанных от имени Билла Гейтса и Тима Кука, а также CNN, New York Times и Bloomberg»


    1. norlin
      04.05.2017 13:44
      +14

      "Через найденную уязвимость багхантер изнасиловал журналиста".


      1. Ugrum
        04.05.2017 13:52
        +3

        «Багхантер изнасиловал журналиста, через не предназначенную для этого уязвимость».


        1. sotnikdv
          04.05.2017 14:02
          +2

          … с целью провокации волнений от имени Билла Кука


        1. drdoc
          04.05.2017 21:05
          +2

          Через не предназначенную для этого «дыру»


          1. Keyten
            04.05.2017 21:48

            «Багхантер изнасиловал журналиста, через не предназначенную для этого «дыру» в Твиттере».


  1. SLenik
    04.05.2017 14:34
    +4

    Данная уязвимость была обнаружена 26 февраля 2017 года и исправлена 28 февраля 2017 года.

    Снимаю шляпу не только перед исследователем, но и перед сотрудниками компании: в кой-то веки серьёзная уязвимость была достаточно оперативно исправлена крупной компанией и не пришлось с месяц стучаться и по десять раз объяснять что это баг а не фича.


  1. Nagg
    04.05.2017 15:23

    Фуф, акции на месте.


  1. Shrike
    04.05.2017 17:54

    Глупый вопрос: баг исправлен в феврале, а пишите только в мае, почему?


    1. kedrisec
      04.05.2017 19:02
      +11

      Взяли паузу дабы Твиттер смог проверить свои сервисы на наличие аналогичных уязвимостей


  1. zxweed
    04.05.2017 20:48

    ошибку признали хоть? или как обычно — поправили молча и сделали вид, что так и было?


    1. kedrisec
      04.05.2017 21:03
      +3

      Разумеется признали, репорт об уязвимости был сделан с помощью платформы hackerone, так что не думаю что у них был шанс пофиксить и сделать вид что ничего не было. Вообще Твиттер в этом плане молодцы, критичные уязвимости фиксят быстро и не отрицают их наличие. А если подкрепить репорт видео с POC-ом так вообще проблем не будет, это если судить по моему опыту работы с ними?.


  1. drdoc
    04.05.2017 21:03

    Через непредназначавшуюся для этого дыру


  1. mrrouter
    04.05.2017 22:06
    -14

    Воспользоваться этой уязвимостью на благо России не пришло в голову? Можно было сообщить, например, что в арабских странах добыча нефти остановилась, а в Америке её вообще нет, тогда бы цены поднялись до 200 долларов за бочку и компьютеры подешевели в 4 раза. Или ещё что-нибудь подобное замутить. Что, никак нельзя было?


    1. TimsTims
      04.05.2017 23:47
      +3

      Примерно на один день поднялись бы, да. И неизвестно, сколько людей на этом прогорело бы, и сколько компаний позакрывалось бы. Соответственно сколько людей оказалось бы без работы и нечем кормить семью. И какое тут благо? Я уже молчу про то, что так можно упустить шанс стать известным white hat, и навсегда записаться в "смотрите, этот тот ура-патриот который в 2017м взломал Твиттер и запостил какую то чушь"


      1. mrrouter
        06.05.2017 00:50
        -5

        Словарь 2001 года, между прочим, когда маршрутизаторы уже существовали. И на оксфордские словари я тоже ссылался.
        Да, почему-то именно российский сегмент Интернета оказался безграмотным. Не только с маршрутизаторами: есть ещё flood (флад) и многое другое. Поэтому нужно всё исправить, и я, великий мистер Рутер, готов это сделать. Просто дайте мне пароль от админки.

        И неизвестно, сколько людей на этом прогорело бы, и сколько компаний позакрывалось бы

        Ну, прогорели бы американцы. Значит, нам станет лучше. Разве это плохо?
        так можно упустить шанс стать известным white hat

        Ну, станет он белой шляпой. Мне-то что-нибудь перепадёт с этого? А другим гражданам России? Вот пусть поделится своим вознаграждением в счёт моральной компенсации с теми, кто только сегодня узнал о такой возможности помочь России или хотя бы просто знатно прикольнуться. Меня устроит квартира в Москве на Фрунзенской набережной.
        этот тот ура-патриот который в 2017м взломал Твиттер и запостил какую то чушь

        А у нас он бы получил славу и уважение среди народа, не говоря уже о куда более солидном материальном поощрении.


        1. TimsTims
          06.05.2017 13:06

          > Словарь 2001 года
          А почему не 1901? Разница в дате всего 5%. И вас не смущает, что в нет слов Вайбер, ватсапп, покемоны, мемы, смайлики, и миллиона других штук, появившиеся за более чем 15 лет? А сколько слов видоизменилось! Язык имеет свойство меняться и адаптироваться. Язык — это не наука и буквах, язык — меняется. Всё меняется. Если люди привыкли говорить «роутер», и это слово прижилось, то через какое то время оно так и будет называться и писаться правильно. Есть миллион слов в русском языке, заимствованных из латиницы, и есть множество похожих слов с английским языком, но это не значит, что мы должны общие слова произносить по-английски, а не по-русски.


        1. den_golub
          10.05.2017 14:57

          Router в британском английском [ ?ra?t? ]. Читается как о с длинным у, тоесть роутер. то что в каком-то словаре, существует, слово рутер, относящееся к техническим, не значит что имелся ввиду именно роутер, это мог быть человек занимающийся рутованием например. / Оффтоп


          1. mayorovp
            11.05.2017 15:20

            А в другом диалекте то же самое слово звучит как [?ru?.t?r], отсюда и все холивары. Осталось понять, какой из двух диалектов — британский, а какой — американский: мнения 4 сайтов из топа гугла разделились поровну...


            1. den_golub
              11.05.2017 16:25

              Ваш вариант Американский английский, мой Британский.



    1. TimsTims
      05.05.2017 00:00
      +3

      Омг я щас почитал остальные комментарии этого персонажа, оказалось что это весьма упорный тип, доказывающий, что весь интернет неправильно пишет router на русском — надо «рутер» а не «роутер» и в качестве доказательства приводит какой то странный скриншот, похоже из словаря времён СССР. А ещё он просит дать ему пароли от админок и он всё поправит! /Оффтоп


      1. Rampages
        05.05.2017 09:50
        +1

        В интернете всегда кто-то неправ ?\_(?)_/?


  1. nanshakov
    05.05.2017 09:23

    А сколько заплатили награду?


  1. w9w
    09.05.2017 20:17

    Красава :)