Содержание статьи
Proof of Concept
Ищем таргет и определяем вектор
Для пентестера правильный вектор — главный ресурс: без рабочего сценария не поможет даже найденная многоступенчатая уязвимость. На практике многие цепочки оказываются нереализуемыми из‑за недостатка информации и общей сложности, поэтому исследователи часто отказываются от «тяжелых» кейсов. Я же стараюсь браться за сложные уязвимости, и на этот раз именно такой анализ позволил получить воспроизводимые и ценные находки.
Итак, при исследовании сервиса я заметил, что после загрузки файла в хранилище нам выдается интересный UUID, однако его формат меня смутил.

На первый взгляд это не UUID: по стандарту он должен представлять собой 128-битную метку, например, такую:
f81d4fae-7dec-11d0-a765-00a0c91e6bf6
Вероятно, это UUID в какой‑то нестандартной форме, например, с метаинформацией. Думаю, разработчик должен знать о том, как строятся идентфиикаторы файлов, поэтому я решил прогнать базовые энтропийные тесты.
Находим неслучайную последовательность
Я стал собирать идентификаторы, чтобы составить выборку для анализа.

Затем я сделал ряд запросов с разной дельтой по времени и нашел закономерность в построении UUID.


На основе UUID трех файлов, которые отличались временем создания, я попытался сделать предположение о том, как они строятся. Попробуем сделать одинаковую длину имени файлов, одинаковую длину самих файлов и разные временные метки.
Я прогнал серию запросов через Intruder в Burp Suite и быстро заметил коллизию в UUID: при сравнительно небольшом смещении запросов хеши совпадали. Коллизия — это признак недостатка энтропии в генерации идентификатора: даже если дефицит проявляется только на коротком временном интервале; этот факт дал мне реальную точку опоры для дальнейшего восстановления логики формирования имени.
Посмотрим чуть более детально на полученные три идентификатора. Можно заметить, что структура делится на три части, причем две из них повторяются в случае с этим файлом.

Я воспользовался Burp Sequencer для анализа большого количества токенов и самое интересное, что я нашел — очевидное отсутствие энтропии для повторяющихся фрагментов и наличие большого количества аномалий, связанных с появлением символов.


О чем должен сделать вывод аналитик? Что сервер не предоставляет никаких уникальных данных, которые не были бы известны нам на клиенте. При генерации идентификатора файла он использует временную метку в качестве ключевого параметра, по которому различает идентичные файлы.
Для дальнейшего анализа нам нужно как‑то заглянуть «внутрь» этого UUID. Давай попытаемся выяснить алгоритм его генерации.
Восстанавливаем алгоритм генерации
Я предположил, что идентификатор не зависит от содержимого файла и сгенерировал несколько UUID для файлов, которые отличались только длиной. К моему удивлению, я получил еще более ясную структуру!

Здесь нас прежде всего интересует одинаковая подстрока, которая формируется в зависимости от числа, которое остается при полном делении на 5. Оставшаяся часть справа тоже повторяется и обе эти части разные для файлов с разными именами.
Первое, что приходит в голову, когда обнаруживаются такие закономерности, — алгоритмы кодирования или сжатия. Так как изобретать велосипед любят далеко не все, я предположил, что ответ стоит искать в том самом делении на 5 и пошел гуглить разные варианты кодирования.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
