
Уязвимый REST API на Java для демонстрации CVE-2021-44228 (log4shell).
Уязвимый REST API на Java для демонстрации CVE-2021-44228 (log4shell).
Log4Shell потряс интернет в начале декабря 2021 года. Уязвимость нулевого дня в библиотеке логирования Apache Log4j, способная на удалённое выполнение кода (RCE), заставила организации по всему миру в спешке исправлять, патчить и смягчать последствия для своих публичных Java-приложений. Пока сообщество InfoSec объединялось, чтобы предоставлять командам безопасности непрерывный анализ и решения, сообщество Log4j активно разрабатывало патчи для устранения этой уязвимости.
Я разработал этот простой уязвимый REST API, который демонстрирует путь к удалённому выполнению кода (RCE) путём эксплуатации этой уязвимости с использованием сервера приложений Apache Tomcat. Надеюсь, эта proof of concept может быть использована для обучения ваших команд SecOps или для образования текущих и будущих разработчиков приложений. Обучайте свои команды и улучшайте свою защиту, включая, но не ограничиваясь, правила/оповещения SIEM, EDR, SOAR.
Чтобы понять рабочий процесс этой атаки, взгляните на эту графику, предоставленную Швейцарской правительственной командой реагирования на компьютерные инциденты GovCERT.ch: https://www.govcert.ch/blog/zero-day-exploit-targeting-popular-java-library-log4j/assets/log4j_attack.png
Этот учебник и исходный код предоставлены исключительно в образовательных и учебных целях. Пожалуйста, используйте этично и ответственно. Этот учебник был подготовлен с предположением, что атакующий и уязвимое приложение находятся на одном компьютере. Для более реалистичного опыта распределите архитектуру и запустите уязвимое приложение на отдельном сервере, а для имитации атакующего используйте что-то вроде Kali Linux или другого дистрибутива.
Давайте начнём.
После установки Java JDK и Maven, предполагая, что вы используете дистрибутив Linux, перейдите в каталог вашего vuln4japi и соберите проект.
Примечание: Возможно, вы захотите изменить некоторые компоненты приложения перед сборкой. Например, вы можете изменить путь к журналам log4j в файле log4j2.xml. Или вы можете захотеть изменить имя результирующего war-файла в файле pom.xml. Это полностью на ваше усмотрение.
cd /path/to/vuln4japi
mvn clean package -DskipTests
Если вы не видите ошибок сборки, у вас должен появиться новый каталог target с вашим файлом vuln4japi.war. Хорошо, мы вернёмся к этому файлу чуть позже. Давайте кратко рассмотрим Tomcat.
В зависимости от вашей версии Java 8, в более поздних версиях 8 этот конкретный параметр (com.sun.jndi.ldap.object.trustURLCodebase) может быть установлен в false. Это фактически запрещает JNDI загружать удалённую кодовую базу через LDAP. А именно это эксплуатирует данная уязвимость. Поэтому нам нужно изменить файл catalina.properties в Tomcat, чтобы установить этот системный параметр в True, сделав Tomcat намеренно уязвимым.
После загрузки apache-tomcat-8.0.32.tar.gz для Linux распакуйте его куда-нибудь, например, в каталог /opt.
tar -xvf apache-tomcat-8.0.32.tar.gz -C /opt
Перейдите в каталог /conf и измените catalina.properties в нижней части файла.
Примечание: Используйте ваш предпочитаемый текстовый редактор. В этом примере я использую vim.
cd /opt/apache-tomcat-8.0.32/conf
vim catalina.properties
# добавьте следующие системные свойства в самый конец
com.sun.jndi.ldap.object.trustURLCodebase=true
com.sun.jndi.rmi.object.trustURLCodebase=true
com.sun.jndi.cosnaming.object.trustURLCodebase=true
Выйдите из текстового редактора и запустите Tomcat с помощью скрипта catalina.sh в каталоге /bin.
cd /opt/apache-tomcat-8.0.32/bin
./catalina.sh start
Проверьте ваш экземпляр Apache Tomcat, перейдя на http://localhost:8080/ или с помощью простой команды cURL из интерфейса командной строки.
curl -vv http://localhost:8080/
Если вы видите страницу приветствия в браузере или терминале, значит, всё работает. Теперь мы можем развернуть наше уязвимое приложение.
Скопируйте ваш .war файл в каталог /webapps Tomcat. Tomcat развернёт ваше приложение в горячем режиме в течение нескольких секунд.
cp /vuln4jpi/target/vuln4japi.war /opt/apache-tomcat-8.0.32/webapps
Проверьте ваше уязвимое приложение, перейдя по URL приложения или снова используя cURL из командной строки. В браузере: http://localhost:8080/vuln4japi/api
curl -vv http://localhost:8080/vuln4japi/api
Вы должны увидеть следующее сообщение: Hi, this is a Vulnerable App!!
Теперь, когда у нас есть некоторые работающие компоненты, давайте эксплуатировать эту штуку...
Проект marshalsec — это отличный ресурс для детального понимания этого типа атаки. По сути, он действует как вредоносный LDAP-сервер, который затем перенаправляет любой запрос на вредоносный веб-сервер, размещающий .class файл. Я настоятельно рекомендую ознакомиться с некоторой документацией, размещённой в репозитории mbechler на Github, перед использованием marshalsec: https://github.com/mbechler/marshalsec
Если вы решите пропустить технические детали и документацию, клонируйте этот репозиторий и перейдите в его каталог. Теперь, перед сборкой этого Java-проекта, я рекомендую добавить одну строку отладки в файл LDAPRefServer.java. Этот оператор печати будет полезен при захвате LDAP-запроса от уязвимого сервера.
Используя ваш любимый текстовый редактор, отредактируйте следующий файл и добавьте строку, как показано в блоке кода ниже, в метод processSearchResult().
vim marshalsec/src/main/java/marshalsec/jndi/LDAPRefServer.java
@Override
public void processSearchResult ( InMemoryInterceptedSearchResult result ) {
String base = result.getRequest().getBaseDN();
Entry e = new Entry(base);
try {
sendResult(result, base, e);
// добавьте эту строку, чтобы показать полную информацию о запросе
System.out.println("Request: " + result.getRequest());
}
catch ( Exception e1 ) {
e1.printStackTrace();
}
}
После изменения файла сохраните и выйдите из текстового редактора. Теперь вы должны иметь возможность собрать проект marshalsec с помощью Maven. Вернитесь в корневой каталог папки marshalsec и выполните maven.
mvn clean package -DskipTests
Если ошибок сборки нет, вы должны увидеть новый каталог /marshalsec/target с включённым файлом marshalsec-0.0.3-SNAPSHOT-all.jar.
Давайте настроим остальные инструменты атакующего, прежде чем запускать наш вредоносный LDAP-сервер marshalsec.
Перейдите в каталог exploitz и скомпилируйте включённый файл Exploit.java.
javac Exploit.java
Если вы не получили ошибок, у вас должен появиться файл Exploit.class.
На этом всё. У вас должно быть всё скомпилировано и запущен веб-сервер. Опять же, предполагая, что вы запускаете этот тест на Linux-сервере, вам нужно будет открыть как минимум 5 окон терминала.