Сервис copyright позволял зарегистрированным пользователям отправлять музыкальные произведения, чтобы не беспокоиться о сохранении своих авторских прав (видимо мафия, от лица которой работал сервис, должна была об этом позаботится)
После регистрации (first name, last name, e-mail, pass) и авторизации (e-mail, pass) можно было нажать кнопку browse, и выбрать файл для отправки. В соответствующем поле появлялся его адрес и после нажатия кнопки «отправить», если файл был не очень большой (кажется 8 КБ ограничение), он сохранялся в папке upload на 2 уровня выше, чем находился сам сервис. Там-же находилась папка accounts, в которой лежали файлы с именем e-mail и содержимым – 3мя строчками :
password
first
last
Первые пол часа сервис работал корректно, а потом вдруг сломался и мы с Женей долго не могли понять, в чём проблема... так и не поняли. Поняли только, где валится и с Колиной помощью переписали неудачную часть кода с сохранением функциональности. Потом оказалось, что этим изменением мы ещё и багу исправили. Какое-то время было потрачено на разгадку квеста, чтобы за сервис давали баллы за защиту. Когда он был разгадан, начался поиск уязвимостей. Уязвимость была найдена. Мы как раз эту часть и переписали, но в оригинале файл скачивался сначала в папку tmp, а потом сервис брал из строки с адресом файла его имя (часть строки после последнего "\") и исполнял команду
«cp /tmp/RANDNAME <имя_файла>"
Имя файла мы подавали на вход, т.ч. можно было спокойно через ; исполнять несколько команд. По какой-то причине некоторые команды не выполнялись, хотя никакой проверки на символы небыло. После долгих раздумий, экспериментов и благодаря Диме Шеврину была выдумана такая строчка:
F:\Documents and Settings\mawile\123.mp3; cd ..; cd ..; cd accounts; ls > 1; mv 1 ..; cd ..; mv 1 public_html;
Эта строчка уходила в папку accounts создавала там файл с листингом и переносила в папку из которой можно было спокойно считывать GET запросом через браузер.
Узнав листинг директории можно было посылать строчку
F:\Documents and Settings\mawile\123.mp3; cd ..; cd ..; cd accounts; cat <a_known_e-mail@from_the_list> > 1; mv 1 ..; cd ..; mv 1 public_html;
и нам становился доступен файл с аккаунтом.
До того, как нам помог Дима, мы с Женей долго не могли понять, где вообще хранятся флаги. Мы думали, нам интересно содержимое файлов, но потом посмотрели на флаги других сервисов и обнаружили, что флагом была строчка base64. Именно такое содержимое было во второй строчке файла аккаунта. Его то мы и стали отправлять в последствии. Было отправлено несколько флагов с этого сервиса и потом началось написание автоматического сборщика флагов. Вручную это было бы слишком медленно. Главной загвоздкой была кука. Так и не заставив свой граббер работать, я переделал свой граббер для BAY'я и с его сервиса удалось неплохо собрать флагов. И тут Илья, научившийся здорово работать с куками, предложил написать граббер для меня. За несколько минут он был написан и запущен. К сожалению послать его жюри в качестве advisory мы не догадались. До жюри дошёл только алгоритм взлома.
В общем мне видимо на игре не хватило кармы. Сначала сервис не работал, потом, волшебным образом не принимал строку-эксплоит и под конец мой grabber отказывался работать. Но совместными усилиями мы его всё-таки победили=)
Код эксплоита: