Эта история о том, как в ходе решения одной абсолютно приземленной задачи можно получить нечто большее, а именно: разобраться в работе нескольких технологий, другими словами, прокачать свои скилы… и в конце случайно найти небольшую уязвимость.

Преамбула

Посчастливилось мне обучаться пентесту. Первый этап обучения (начальная подготовка) прошел в декабре 2014 года, второй (профессиональная подготовка) — в июне 2015. Обучение дистанционное: теория в формате вебинаров, практика в формате CTF-заданий (не тот Capture The Flag, что в Quake, а тот, что в информационной безопасности). Примерный план обучения был такой: в выходные на вебинарах ты получаешь вагон и маленькую тележку теории, а затем, в будни, применяешь полученные знания на практике, выполняя CTF. И так несколько недель подряд. Вся мощь обучения именно в практической части: ломаешь голову, шевелишь извилинами, потеешь мозгом. В поисках очередного флага не раз пересматриваешь записи вебинаров в надежде найти зацепку.

Ближе к делу: в декабре 2014 организаторы предоставляли записи вебинаров в виде простых файлов, а к июню у них уже была своя площадка для вебинаров, где в распоряжении студентов только потоковое вещание записей без возможности сохранить видео. Тут то и проявились все недостатки потокового вещания: при перемотке раздражающая задержка, картинка рассыпается. А перематывать при просмотре двухчасового вебинара в надежде найти нужный момент нужно очень часто.

Задача №1: сохранить записи 12 вебинаров в виде обычных файлов, чтобы холодными зимними (или летними) вечерами пересматривать их в теплом-ламповом Media Player Classic (ваш любимый медиа-плеер здесь).

Самый простой способ — запустить просмотр записи вебинара в браузере, при этом захватить видео с экрана, а звук со звуковой карты. Для этого есть множество утилит и имя им — легион. На выходе мы получим видео низкого качества и файл большого объема: разрешение видео и его кодек не будут соответствовать тому, в котором ведущий вебинара производил запись. Для сохранения записи вебинара таким способом потребуется время равное длительности самого вебинара. Именно поэтому этот способ — самый неинтересный, самый неинтеллектуальный и самый неэффективный. И именно поэтому я не стал двигаться по этому пути и не буду описывать этот способ здесь.

Как же сохранить видео в оригинальном качестве, если вебинар-площадка не позволяет этого сделать? Раз уж я учусь пентесту, то почему бы не применить получаемые знания прямо здесь? Начинать надо с Recon и Research :).

Разведка и исследование

Первым делом я попробовал найти файлы в кэше браузера, затем — захват потока с сетевой карты. Для этого есть немало специализированных утилит (например, от NirSoft, еще уйма гуглится по сопуствующим ключевым словам), но ни одна из них не смогла обработать и собрать поток, используемый на этой вебинар-площадке. Или «я просто не умею их готовить».

Во время самих вебинаров можно было заметить, что для вещания (и по всей видимости для записи в файл) используется Open Broadcaster Software.

Посмотреть содержимое https нам поможет любой перехватывающий прокси, например, Fiddler.

Смотрим в код страницы со списком видео с записями вебинаров. Вот строки, вызывающие функцию generatePlayer.

Вторым параметром, по всей видимости, передается ID записи вебинара: мы имеем доступ к вебинарам с ID от 87 до 99.

Далее — изучаем саму функцию generatePlayer, отвечающую за появление плеера на страницах вебинар-сервиса.

Из строки 8 получаем информацию об алгоритме формирования URL потока. Из строк 10, 11, 20  — информацию о используемых компонентах (DashPlugin, StrobeMediaPlayback).

Смотрим внутрь mpd файла:

Ага, в строке 3 видим ссылку на некий GPAC (is a full framework providing authoring tools, packagers, streamers, a player and now some js stuff). Скачиваем и устанавливаем.

Строки 9 и 15 дают нам следующую информацию:

  • аудио и видео дорожки передаются отдельными файлами — сегментами;
  • файлы каждого вебинара именуются по шаблону, например,

    скорее всего обозначает
  • самый первый инициализирующий сегмент вместо номера имеет строку «init«, а расширение у него mp4.

Скачиваем первое видео

Скачать эти файлы просто так не получается. Тогда мы берем из перехватывающего прокси параметр запроса Referer, а в файл linksgood.txt заносим URL нескольких интересующих нас файлов.

Работает! Имеем несколько мелких файлов. Теперь задача — запихнуть в файл linksgood.txt URL нескольких тысяч нужных нам файлов. Здесь нам поможет bash.

Опытным путем выясняем, что средний вебинар продолжительностью 1,5 часа состоит из ~3000 файлов. Генерим ссылок в файл с запасом, wget скачает все до последнего сегмента.

Склеиваем видео

Поскольку моя хостовая ОС в данном случае Windows, то скачивал и склеивал файлы я в ней. Где-то на просторах попалась информация о том, что сегменты достаточно объединить последовательным копированием в один файл (отдельно для аудио и видео дорожек). Все оказалось именно так. Для склейки аудио и видео дорожек воспользуемся утилитой из набора GPAC, который мы установили ранее. Батничек с кучей костылей для склейки:

На выходе имеем один файл в исходном качестве.

Уязвимость или нет?

Мы сохранили все 12 вебинаров (ID с 87 по 99), которые площадка предоставляла только для онлайн-просмотра. Можно ли считать это уязвимостью? По мне — только с очень большой натяжкой. Хоть разработчики и усложнили задачу (https, referrer), но мы всего лишь получили ту информацию, к которой и так имели доступ. Но теперь мы знаем по какой схеме формируются url. Что если проверить вебинар-площадку на предмет уязвимостей посерьезней? Например, слабость к брутфорсу, которая позволит получить доступ к вебинарам, к которым через веб-интерфейс у нас доступа нет? Только проверить, и в случае успеха, сразу сообщить разработчикам ;-)

Проводим брутфорс

На веб-сайте компании, проводящей обучение, в публичном доступе находится расписание вебинаров с планируемым временем начала. Задача проста, найти два параметра — ID видео и timestamp (время начала вебинара с точностью до секунды).

timestamp перебираем по алгоритму «-n секунд, +n секунд», где n от 0 до 300 (5 минут).

Записываем результаты выполнения в файл с именем times28_3_3.txt, например.

ID следующего вебинара, планируемое время начала которого нам известно, вероятно находится в небольшом диапазоне от 100 до 105.

Создаем список URL для скачивания wget-ом.

Скармливаем этот список wget-у.

Параметр -Q задает квоту в байтах, т.е. после скачивания первого файла wget завершит свою работу. После того, как мы нашли этот первый файл (имя заканчивается на _init.mp4), остается только скачать остальные сегменты, как мы делали это раньше с доступными нам вебинарами. Преимущество запуска одного экземпляра wget и передачи в него списка ссылок заключается в том, что в этом случае wget не устанавливает соединение для каждого нового URL, процесс поиска нужного файла происходит очень быстро — от 0 до 5 минут.

Эта уязвимость позволяла злоумышленнику скачивать любые вебинары, расписание которых доступно через сайт. Но мы не такие :) Уязвимость нашли, сообщили о ней разработчикам, они ее закрыли. Как закрыли — не знаю, не уточнял. Но вариантов много. Например, можно добавить в имя файла кроме ID и timestamp еще нечто уникальное. Защититься же от скачивания вебинаров, к которым студенты имеют доступ, сложнее. Но, насколько я знаю, эта защита также усилена.