Информация об уязвимости
pfSense — это самый надежный в мире брандмауэр с открытым исходным кодом на основе FreeBSD, который успешно заменил все известные коммерческие брандмауэры, которые вы только можете себе представить, в многочисленных установках по всему миру.
В брандмауэре PfSense существует уязвимость выполнения команд, затрагивающая версии <= 2.5.2. Проблемы могут быть записаны в веб-шелл с помощью команды sed файла `diag_routes.php`.
Создание окружающей среды
Загрузите его с официального сайта PfSense, разархивируйте и установите с помощью VMware:
После перезагрузки настройте систему и завершите настройку:
Сравнение патчей
Сравнивая коды версий 2.5.2 и 2.6.0, `diag_routes.php` добавляет параметр `Filter` для фильтрации:
Снова взглянем на версию кода 2.5.2, когда существуют параметры `isAjax` и `filter`, сначала используйте `htmlspecialchars` для обработки `filter`, а затем выполните `escapeshellarg`:
Так как используется версия php `7.4.26`, нет никаких сомнений в том, что проверки `escapeshellarg` и `htmlspecialchars` нельзя обойти, поэтому проблема не должна быть в самом коде PHP:
Произвольная запись файла
Просто измените `diag_route.php`, отправьте запрос GET `/diag_routes.php?isAjax=1&filter=abc` и напечатайте команду `netstat` следующим образом:
Обратите внимание, что здесь используется опция `-e` команды `SED`, которую можно использовать для выполнения скриптов. Опция `-w` может реализовать запись в файл. В качестве примера возьмем `/::1/w /tmp/testsed.txt`, его функция заключается в том, чтобы скопировать строку, содержащую строку `::1` в прочитанный файл, в `/tmp/testsed.txt`:
Протестировано в полезной нагрузке и получило полезную нагрузку, которая записывает в указанный файл:
Выполняемая команда `netstat` выглядит следующим образом: используйте `%0a%23`, чтобы выйти, чтобы получить `возврат каретки + #`, просто чтобы аннотировать последующую строку, вот скриншот локальной тестовой ситуации:
Наконец, контролируйте содержимое записи и замените строку `Flags` на код `s/Flags/VVV/g`:
Специальные символы, такие как `<>`, экранируются, и необходимо разрешить специальную кодировку:
Наконец, успешно записанный процесс кодирования:
Получите доступ к Webshell, подключитесь как `https://ip/shell.php?a=system(id);`:
Уязвимость также может быть использована удаленно и анонимно из-за отсутствия защиты от CSRF.
Устаревшая обработка `sed` для `netstat` приводит к новой версии в пользу `egrep`:
Любые прямые или косвенные последствия и ущерб, вызванные распространением и использованием информации, представленной в данном документе, являются ответственностью пользователя, а команда безопасности и автор статьи не несут за это никакой ответственности.
Перевел эту статью
pfSense — это самый надежный в мире брандмауэр с открытым исходным кодом на основе FreeBSD, который успешно заменил все известные коммерческие брандмауэры, которые вы только можете себе представить, в многочисленных установках по всему миру.
В брандмауэре PfSense существует уязвимость выполнения команд, затрагивающая версии <= 2.5.2. Проблемы могут быть записаны в веб-шелл с помощью команды sed файла `diag_routes.php`.
Создание окружающей среды
Загрузите его с официального сайта PfSense, разархивируйте и установите с помощью VMware:
После перезагрузки настройте систему и завершите настройку:
Сравнение патчей
Сравнивая коды версий 2.5.2 и 2.6.0, `diag_routes.php` добавляет параметр `Filter` для фильтрации:
Снова взглянем на версию кода 2.5.2, когда существуют параметры `isAjax` и `filter`, сначала используйте `htmlspecialchars` для обработки `filter`, а затем выполните `escapeshellarg`:
Так как используется версия php `7.4.26`, нет никаких сомнений в том, что проверки `escapeshellarg` и `htmlspecialchars` нельзя обойти, поэтому проблема не должна быть в самом коде PHP:
Произвольная запись файла
Просто измените `diag_route.php`, отправьте запрос GET `/diag_routes.php?isAjax=1&filter=abc` и напечатайте команду `netstat` следующим образом:
Обратите внимание, что здесь используется опция `-e` команды `SED`, которую можно использовать для выполнения скриптов. Опция `-w` может реализовать запись в файл. В качестве примера возьмем `/::1/w /tmp/testsed.txt`, его функция заключается в том, чтобы скопировать строку, содержащую строку `::1` в прочитанный файл, в `/tmp/testsed.txt`:
Протестировано в полезной нагрузке и получило полезную нагрузку, которая записывает в указанный файл:
Выполняемая команда `netstat` выглядит следующим образом: используйте `%0a%23`, чтобы выйти, чтобы получить `возврат каретки + #`, просто чтобы аннотировать последующую строку, вот скриншот локальной тестовой ситуации:
Наконец, контролируйте содержимое записи и замените строку `Flags` на код `s/Flags/VVV/g`:
Специальные символы, такие как `<>`, экранируются, и необходимо разрешить специальную кодировку:
Наконец, успешно записанный процесс кодирования:
Getshell
Получите доступ к Webshell, подключитесь как `https://ip/shell.php?a=system(id);`:
Уязвимость также может быть использована удаленно и анонимно из-за отсутствия защиты от CSRF.
А ну-ка вот так
Устаревшая обработка `sed` для `netstat` приводит к новой версии в пользу `egrep`:
Любые прямые или косвенные последствия и ущерб, вызванные распространением и использованием информации, представленной в данном документе, являются ответственностью пользователя, а команда безопасности и автор статьи не несут за это никакой ответственности.
Перевел эту статью