What's new
Runion

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Дебажим PyroCMS на примере CVE-2023-29689

grozdniyandy

Midle Weight
Депозит
$0
Эта статья в основном посвящена отладке PHP приложений с помощью VSCode и немного уязвимости CVE-2023-29689. Мы рассмотрим шаги для настройки удаленной отладки через SSH и изучим, как использовать эти знания для анализа уязвимостей и тестирования эксплойтов.

Установка PyroCMS 3.9​

Уязвимость в версии 3.9, так что качаем её:
Код: Скопировать в буфер обмена
Code:
cd /var/www/html
git clone -o pyrocms https://github.com/pyrocms/pyrocms -b 3.9
chmmod www-data:www-data /var/www/html -R
Пишем конфигурацию для нгинх, но пока что не начинаем, тк не скачали php-fpm
Код: Скопировать в буфер обмена
Code:
sudo nano /etc/nginx/sites-available/pyro.conf
server {
  listen 80;

  server_name 192.168.147.131; # Check this
  root /var/www/html/pyrocms/public; # Check this

  index index.php index.html;
  charset utf-8;
  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # Check this
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

}
Создаём симлинк и качаем xdebug
Код: Скопировать в буфер обмена
Code:
sudo ln -s /etc/nginx/sites-available/pyro.conf /etc/nginx/sites-enabled/
sudo apt-get install php8.1-xdebug (на будущее)
Что такое отладка и зачем нам нужно отлаживать?
Отладка
— это процесс поиска и исправления ошибок или багов в исходном коде любого программного обеспечения. Проще говоря, это вывод результатов на экран. Отладка необходима, когда вы хотите найти уязвимости или написать эксплойты для уже существующих уязвимостей. Кроме того, отладка помогает разработчикам понять логику работы их кода.

Удаленная отладка через SSH с VSCode​

После развертывания PyroCMS 3.9 на нашем сервере Ubuntu (я использовал Ubuntu Server и Nginx - вы можете использовать что угодно), следующий шаг — это настройка удаленной отладки. Удаленная отладка полезна, так как позволяет вам отлаживать приложения, работающие на удаленных серверах, прямо из вашей среды разработки.

Сначала нужно открыть VSCode и скачать расширение "Remote - SSH". Это расширение позволяет подключаться к удаленным серверам через SSH прямо из VSCode, что значительно упрощает процесс отладки. Затем запустите SSH на вашем сервере Ubuntu:
Код: Скопировать в буфер обмена
Code:
sudo apt update
sudo apt install openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
Подключение по SSH
Сначала настроим аутентификацию без пароля с нашего компьютера, на котором установлен VSCode (в моем случае это Kali), к нашему удаленному серверу (Ubuntu). Команда ssh-keygen используется для генерации новой пары ключей SSH, которая состоит из открытого и закрытого ключа. По умолчанию эта команда генерирует пару ключей RSA длиной 2048 бит. Закрытый ключ хранится в указанном файле (например, ~/.ssh/id_rsa). Открытый ключ хранится в указанном файле с расширением .pub (например, ~/.ssh/id_rsa.pub).
Код: Скопировать в буфер обмена
ssh-keygen -t rsa -b 4096 -C xss@xss.loc
Команда ssh-copy-id копирует открытый ключ на удаленный сервер, что позволяет осуществлять аутентификацию без пароля. Эта команда добавляет ваш открытый ключ в файл ~/.ssh/authorized_keys на удаленном сервере.
Код: Скопировать в буфер обмена
ssh-copy-id ubuntu@192.168.147.131

1721833480171.png


Изображение [1]​
Теперь нам нужно перейти в VSCode, нажать CTRL+SHIFT+P и найти SSH. Затем выберите "Add New Host"

1721833493212.png


Изображение [2]​
Нам нужно написать команду SSH для аутентификации.

1721833504176.png


Изображение [3]​
Выберите файл конфигурации (в моем случае он находится внутри /home/kali/.ssh и был создан при генерации ключа SSH).

1721833513771.png


Изображение [4]​
Теперь мы добавили наш хост, нам нужно подключиться к нему.

1721833550589.png


Изображение [5]​
Выберите удаленный сервер, который мы только что добавили.

1721833558475.png


Изображение [6]​
Выберите папку, где настроен PyroCMS.

1721833568709.png


Изображение [7]​

Включение отладки​

Я уже дал всем пользователям права на чтение/запись/выполнение в папке /var/www/html, поэтому у меня нет ошибок разрешения. Вы можете сделать то же самое:
Код: Скопировать в буфер обмена
chmod a+rwx /var/www/html
Создайте папку .vscode и файл launch.json. Этот файл конфигурации говорит VSCode, как подключиться к вашему серверу и начать отладку с помощью XDebug (отладчик и профайлер для PHP - скачайте если у вас нет)

1721833609020.png


Изображение [8]​
Код: Скопировать в буфер обмена
Code:
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "pathMappings": {
        "/var/www/html/pyrocms [ВАМ НУЖНО ЭТО ОТРЕДАКТИРОВАТЬ]": "${workspaceFolder}"
      }
    }
  ]
}
name: это описательное название конфигурации.
type: указывает на то, что конфигурация предназначена для отладки PHP.
request: указывает на тип запроса. Для XDebug laucnh выполняет прослушивание входящих подключений от отладчика.
port: номер порта, который VS Code будет прослушивать для подключений XDebug.
pathMappings: объект, который отображает пути между локальной машиной и удаленным сервером на котором выполняется PHP-код./var/www/html/pyrocms - путь к корневому каталогу вашего PHP-приложения на сервере.
Значение ("${workspaceFolder}") переменная VS Code, которая представляет корень вашей рабочей области (т.е. папку, которую вы открыли в VS Code).

Убедитесь что ваша конфигурация PyroCMS правильная. Обратите внимание, что я использую PHP 8.1:
Код: Скопировать в буфер обмена
Code:
nano /etc/nginx/sites-available/pyro.conf
server {
  listen 80;

  server_name 192.168.147.131; # Check this
  root /var/www/html/pyrocms/public; # Check this

  index index.php index.html;
  charset utf-8;
  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # Check this
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

}
1721834087953.png


Изображение [9]​
Скачайте php-fpm, если вы этого не сделали:
Код: Скопировать в буфер обмена
Code:
sudo apt install php8.1-fpm
service php8.1-fpm start
CGI (Common Gateway Interface):
CGI - это стандартный протокол, используемый для того, чтобы веб-серверы могли запускать внешние программы для динамической генерации веб-контента. Эти программы, известные как CGI-скрипты, могут быть написаны на различных языках программирования, таких как Python, Perl, PHP или C.
PHP-FPM (PHP FastCGI Process Manager) — это альтернативная реализация FastCGI для PHP

Отредактируйте php.ini и добавьте строки для отладки:
Код: Скопировать в буфер обмена
Code:
nano /etc/php/8.1/fpm/php.ini
[xdebug]
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
xdebug.log=/var/log/xdebug/xdebug.log
xdebug.idekey = VSCODE
Адрес клиента 127.0.0.1, так как мы подключились к нашему серверу Ubuntu через VSCode и будем запускать отладку оттуда (с Ubuntu).
1721834129587.png


Изображение [10]​
Создайте файлы и директории для логирования и перезапустите службы:
1721834137103.png


Изображение [11]​
Код: Скопировать в буфер обмена
Code:
sudo mkdir -p /var/log/xdebug
sudo chown www-data:www-data /var/log/xdebug
sudo chmod 755 /var/log/xdebug
sudo touch /var/log/xdebug/xdebug.log
sudo chown www-data:www-data /var/log/xdebug/xdebug.log
sudo chmod 644 /var/log/xdebug/xdebug.log
sudo systemctl restart nginx
sudo systemctl restart php8.1-fpm
Перейдите в VSCode -> отладка -> старт

1721834160339.png


Изображение [12]​
Я решил перейти в public/app/default/assets/admin и создать файл info.php, чтобы проверить, работает ли отладка. Открыл info.php в браузере

1721834167523.png


Изображение [13]​
Установил точку останова, и отладка работает.
Точка останова — это маркер, который вы устанавливаете на строке кода, указывая отладчику временно остановить выполнение при достижении этой строки. Чтобы установить точку останова, щелкните в левом поле рядом с номером строки, где хотите установить точку останова. Появится красная точка, указывающая на то, что точка останова установлена.

1721834174199.png


Изображение [14]​

Тестирование эксплойта​

SSTI (Server-Side Template Injection) — это уязвимость, которая возникает, когда пользовательский ввод небезопасно включается в шаблон и интерпретируется сервером
Эксплойт для этого CVE доступен здесь - https://www.exploit-db.com/exploits/51669
Как видно из эксплойта, проблема возникает при редактировании ролей пользователей - /admin/users/roles/edit/1
1721834193819.png


Изображение [15]​
Когда мы возвращаемся к ролям, выполняется код шаблона
1721834202254.png


Изображение [16]​
Мы также можем увидеть это в VSCode

1721834210275.png


Изображение [17]​
Функция escape фильтра Twig - это функция escape в случае XSS и т.д. (насколько я понимаю). Это не защита от инъекций шаблонов

1721834217824.png


Изображение [18]​
Twig имеет свою собственную функцию в CoreExtension.php

1721834226902.png


Изображение [19]​
Мы также можем проверить функции, фильтры и теги Twig на https://twig.symfony.com/doc/
Одна из функций - include. Согласно Twig, "Оператор include включает шаблон и выводит отображаемое содержимое этого файла"
Это похоже на функцию include в PHP, поэтому мы можем включить некоторые файлы для получения их содержимого (или выполнения)

1721834234282.png


Изображение [20]

1721834241295.png


Изображение [21]​
Если мы проверим нагрузки SSTI для Twig, мы наткнемся на такие нагрузки, как этoт:
Код: Скопировать в буфер обмена
{{['id']|map('system')|join}}
Он выполняeт код PHP, мы можем использовать функцию file_get_contents в PHP для чтения /etc/passwd снова

1721834257437.png


Изображение [22]​
Мы увидим тот же результат

1721834266558.png


Изображение [23]​
Теперь мы можем попробовать RCE

1721834274180.png


Изображение [24]

1721834281491.png


Изображение [25]​
И если мы проверим VSCode, мы увидим, что id передается как аргумент для system

1721834288361.png


Изображение [26]​

Conclusion​

Мы рассмотрели, как настроить удаленную отладку PHP приложений с помощью VSCode и XDebug. Мы также рассмотрели уязвимость CVE-2023-29689 и как её эксплуатировать. Уязвимость CVE-2023-29689 не является критической, так как там нужна аутентификация (как админ).

Автор grozdniyandy

Источник https://xss.is/

 
имхо, тс сел на один и тот же конек - просмотр и попытки эксплуатации cve (как придется).
Ну и для "обвеса" в данном случае vscode+ssh+xdebug

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

1)vscode+ssh+xdebug как применить выложено много где с 2016 г
2) exploit CVE-2023-29689 написан и размножен.

А вот тема уязвимостей шаблонизатора, выбора нагрузки, не-раскрыта, а так, скомкана, к сожалению.
Шаблонизаторы если и создают проблемы, то в ряде движков, их использующих (помню уязвимости ...smarty).
А на twig-e есть еще CMS.

А вот здесь, например, PayloadsAllTheThings/Server%20Side%20Template%20Injection/
список багов , в которых Twig был уличен.

Жаль, что автор не копнул ни шире, ни глубже.
 
Top