grozdniyandy
Midle Weight
- Депозит
- $0
Эта статья в основном посвящена отладке PHP приложений с помощью VSCode и немного уязвимости CVE-2023-29689. Мы рассмотрим шаги для настройки удаленной отладки через SSH и изучим, как использовать эти знания для анализа уязвимостей и тестирования эксплойтов.
Код: Скопировать в буфер обмена
Пишем конфигурацию для нгинх, но пока что не начинаем, тк не скачали php-fpm
Код: Скопировать в буфер обмена
Создаём симлинк и качаем xdebug
Код: Скопировать в буфер обмена
Что такое отладка и зачем нам нужно отлаживать?
Отладка — это процесс поиска и исправления ошибок или багов в исходном коде любого программного обеспечения. Проще говоря, это вывод результатов на экран. Отладка необходима, когда вы хотите найти уязвимости или написать эксплойты для уже существующих уязвимостей. Кроме того, отладка помогает разработчикам понять логику работы их кода.
Сначала нужно открыть VSCode и скачать расширение "Remote - SSH". Это расширение позволяет подключаться к удаленным серверам через SSH прямо из VSCode, что значительно упрощает процесс отладки. Затем запустите SSH на вашем сервере Ubuntu:
Код: Скопировать в буфер обмена
Подключение по SSH
Сначала настроим аутентификацию без пароля с нашего компьютера, на котором установлен VSCode (в моем случае это Kali), к нашему удаленному серверу (Ubuntu). Команда ssh-keygen используется для генерации новой пары ключей SSH, которая состоит из открытого и закрытого ключа. По умолчанию эта команда генерирует пару ключей RSA длиной 2048 бит. Закрытый ключ хранится в указанном файле (например, ~/.ssh/id_rsa). Открытый ключ хранится в указанном файле с расширением .pub (например, ~/.ssh/id_rsa.pub).
Код: Скопировать в буфер обмена
Команда ssh-copy-id копирует открытый ключ на удаленный сервер, что позволяет осуществлять аутентификацию без пароля. Эта команда добавляет ваш открытый ключ в файл ~/.ssh/authorized_keys на удаленном сервере.
Код: Скопировать в буфер обмена
Изображение [1]Теперь нам нужно перейти в VSCode, нажать CTRL+SHIFT+P и найти SSH. Затем выберите "Add New Host"
Изображение [2]Нам нужно написать команду SSH для аутентификации.
Изображение [3]Выберите файл конфигурации (в моем случае он находится внутри /home/kali/.ssh и был создан при генерации ключа SSH).
Изображение [4]Теперь мы добавили наш хост, нам нужно подключиться к нему.
Изображение [5]Выберите удаленный сервер, который мы только что добавили.
Изображение [6]Выберите папку, где настроен PyroCMS.
Изображение [7]
Создайте папку .vscode и файл launch.json. Этот файл конфигурации говорит VSCode, как подключиться к вашему серверу и начать отладку с помощью XDebug (отладчик и профайлер для PHP - скачайте если у вас нет)
Изображение [8]Код: Скопировать в буфер обмена
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:
Код: Скопировать в буфер обмена
Изображение [9]Скачайте php-fpm, если вы этого не сделали:
Код: Скопировать в буфер обмена
Отредактируйте php.ini и добавьте строки для отладки:
Код: Скопировать в буфер обмена
Адрес клиента 127.0.0.1, так как мы подключились к нашему серверу Ubuntu через VSCode и будем запускать отладку оттуда (с Ubuntu).
Изображение [10]Создайте файлы и директории для логирования и перезапустите службы:
Изображение [11]Код: Скопировать в буфер обмена
Перейдите в VSCode -> отладка -> старт
Изображение [12]Я решил перейти в public/app/default/assets/admin и создать файл info.php, чтобы проверить, работает ли отладка. Открыл info.php в браузере
Изображение [13]Установил точку останова, и отладка работает.
Эксплойт для этого CVE доступен здесь - https://www.exploit-db.com/exploits/51669
Как видно из эксплойта, проблема возникает при редактировании ролей пользователей - /admin/users/roles/edit/1
Изображение [15]Когда мы возвращаемся к ролям, выполняется код шаблона
Изображение [16]Мы также можем увидеть это в VSCode
Изображение [17]Функция escape фильтра Twig - это функция escape в случае XSS и т.д. (насколько я понимаю). Это не защита от инъекций шаблонов
Изображение [18]Twig имеет свою собственную функцию в CoreExtension.php
Изображение [19]Мы также можем проверить функции, фильтры и теги Twig на https://twig.symfony.com/doc/
Одна из функций - include. Согласно Twig, "Оператор include включает шаблон и выводит отображаемое содержимое этого файла"
Это похоже на функцию include в PHP, поэтому мы можем включить некоторые файлы для получения их содержимого (или выполнения)
Изображение [20]
Изображение [21]Если мы проверим нагрузки SSTI для Twig, мы наткнемся на такие нагрузки, как этoт:
Код: Скопировать в буфер обмена
Он выполняeт код PHP, мы можем использовать функцию file_get_contents в PHP для чтения /etc/passwd снова
Изображение [22]Мы увидим тот же результат
Изображение [23]Теперь мы можем попробовать RCE
Изображение [24]
Изображение [25]И если мы проверим VSCode, мы увидим, что id передается как аргумент для system
Изображение [26]
Установка 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
Код: Скопировать в буфер обмена
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;
}
}
Код: Скопировать в буфер обмена
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
Сначала настроим аутентификацию без пароля с нашего компьютера, на котором установлен 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
Изображение [1]
Изображение [2]
Изображение [3]
Изображение [4]
Изображение [5]
Изображение [6]
Изображение [7]
Включение отладки
Я уже дал всем пользователям права на чтение/запись/выполнение в папке /var/www/html, поэтому у меня нет ошибок разрешения. Вы можете сделать то же самое:
Код: Скопировать в буфер обменаchmod a+rwx /var/www/html
Создайте папку .vscode и файл launch.json. Этот файл конфигурации говорит VSCode, как подключиться к вашему серверу и начать отладку с помощью XDebug (отладчик и профайлер для PHP - скачайте если у вас нет)
Изображение [8]
Code:
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www/html/pyrocms [ВАМ НУЖНО ЭТО ОТРЕДАКТИРОВАТЬ]": "${workspaceFolder}"
}
}
]
}
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;
}
}
Изображение [9]
Код: Скопировать в буфер обмена
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
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
Изображение [10]
Изображение [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
Изображение [12]
Изображение [13]
Точка останова — это маркер, который вы устанавливаете на строке кода, указывая отладчику временно остановить выполнение при достижении этой строки. Чтобы установить точку останова, щелкните в левом поле рядом с номером строки, где хотите установить точку останова. Появится красная точка, указывающая на то, что точка останова установлена.
Изображение [14]
Изображение [14]
Тестирование эксплойта
SSTI (Server-Side Template Injection) — это уязвимость, которая возникает, когда пользовательский ввод небезопасно включается в шаблон и интерпретируется серверомЭксплойт для этого CVE доступен здесь - https://www.exploit-db.com/exploits/51669
Как видно из эксплойта, проблема возникает при редактировании ролей пользователей - /admin/users/roles/edit/1
Изображение [15]
Изображение [16]
Изображение [17]
Изображение [18]
Изображение [19]
Одна из функций - include. Согласно Twig, "Оператор include включает шаблон и выводит отображаемое содержимое этого файла"
Это похоже на функцию include в PHP, поэтому мы можем включить некоторые файлы для получения их содержимого (или выполнения)
Изображение [20]
Изображение [21]
Код: Скопировать в буфер обмена
{{['id']|map('system')|join}}
Он выполняeт код PHP, мы можем использовать функцию file_get_contents в PHP для чтения /etc/passwd снова
Изображение [22]
Изображение [23]
Изображение [24]
Изображение [25]
Изображение [26]