
Эксплоит на Python для CVE-2018-15133, позволяющий выполнить удалённый код на уязвимых приложениях Laravel через небезопасную десериализацию зашифрованных сессий с использованием известного APP_KEY.
Этот скрипт на Python реализует эксплойт удаленного выполнения кода (RCE) для уязвимых приложений Laravel через небезопасную десериализацию, основанный на уязвимости CVE-2018-15133.
Эксплойт использует уязвимость в Laravel (версии 5.5.40 и ниже, а также 5.6.0 – 5.6.29), при которой зашифрованные сессии автоматически десериализуются без надлежащей проверки. Имея доступ к ключу APP_KEY Laravel, атакующий может зашифровать вредоносные полезные нагрузки, которые будут десериализованы и выполнены на сервере.
Laravel использует механизм симметричного шифрования для сессий с тремя компонентами:
IV (Initialization Vector): случайный вектор инициализации, создаваемый для каждой сессии
Value: значение, зашифрованное с помощью AES-128-CBC или AES-256-CBC
MAC: код аутентификации сообщения (HMAC-SHA256), вычисленный на основе IV + value + APP_KEY
Получает три входных параметра: ключ APP_KEY Laravel в формате base64, команду для выполнения и целевой домен
Вызывает инструмент PHPGGC с цепочкой гаджетов Laravel/RCE5 для генерации строки вредоносных PHP-объектов
Формирует команду операционной системы, которая будет выполнена на сервере жертвы (например: system('whoami');)
Генерирует сериализованную PHP-нагрузку, содержащую связанные гаджеты
Декодирует нагрузку из base64 в двоичный формат
Обрабатывает ключ APP_KEY, удаляя префикс "base64:", если он присутствует
Дополняет необходимый padding, чтобы ключ стал корректным base64
Декодирует ключ из base64 в байты
Генерирует случайный вектор инициализации (IV) размером 16 байт
Шифрует нагрузку с помощью AES в режиме CBC с использованием ключа и IV
Применяет padding PKCS7 к нагрузке перед шифрованием
Кодирует IV в base64
Кодирует шифротекст (зашифрованную нагрузку) в base64
Конкатенирует IV и значение в base64 как сообщение для HMAC
Вычисляет MAC с помощью HMAC-SHA256 на основе конкатенированного сообщения с ключом в качестве секрета
Строит JSON-объект с тремя полями: iv, value и mac
Кодирует полный JSON в base64
Формирует HTTP-запрос с помощью curl, помещая полезную нагрузку в cookie laravel_session
Отправляет запрос на целевой домен
Сервер Laravel получает cookie и декодирует base64
Laravel проверяет целостность MAC по полученным IV и value
Laravel расшифровывает содержимое с помощью AES-CBC, используя свой APP_KEY
Laravel автоматически десериализует расшифрованное содержимое
PHP вызывает магические функции __destruct() или __wakeup() десериализованных объектов
Запускается цепочка гаджетов, завершающаяся вызовом call_user_func() или eval()
Команда операционной системы выполняется на сервере
Эксплойт использует цепочки гаджетов, объединяющие вызовы магических функций PHP:
Во время десериализации PHP автоматически вызывает __destruct() или __wakeup(), запуская цепочку, которая завершается eval(), выполняющим произвольный код.
Предварительные требования Чтобы эксплойт сработал, атакующему необходимы:
Ключ APP_KEY Laravel (полученный через утечку переменных окружения, открытые S3-корзины, исходный код и т.д.)
Уязвимая версия Laravel с включенной по умолчанию десериализацией
PHPGGC, установленный в каталог ./phpggc/ https://github.com/ambionics/phpggc
Пример использования
python exploit.py "base64:dGhpc2lzYXNlY3JldGtleQ==" "whoami" "http://target.htb"
Эта команда создаст сериализованную нагрузку, которая выполнит whoami, когда Laravel десериализует сессию.