
Лаборатория безопасности на основе Docker, демонстрирующая эксплуатацию и защиту Apache Struts2 S2-045 (CVE-2017-5638), включая уязвимые и пропатченные приложения с защитой WAF для практического обучения.
Лаборатория безопасности на основе Docker, демонстрирующая как эксплуатацию, так и защиту от уязвимости Apache Struts2 S2-045 (CVE-2017-5638). Лаборатория включает:
⚠️ Предупреждение безопасности: Эта лаборатория содержит работающие эксплойты и уязвимый код. Используйте только в изолированных средах. НЕ выставляйте в публичные сети.
┌─────────────────────────────────────────────────────────────┐
│ Host (127.0.0.1 only) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Simulator │───▶│ Nginx Proxy │ │
│ │ (curl-based) │ │ + WAF Rules │ │
│ └─────────────────┘ └────────┬────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ │ │
│ ┌───────▼──────┐ ┌───────▼──────┐ │
│ │ Defense App │ │ Vulnerable │ │
│ │ (Struts 6.3) │ │ App (2.3.31) │ │
│ │ Port: 8080 │ │ Port: 8081 │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ Exploit │───▶ Vulnerable App (8081) │
│ │ Container │ │
│ └─────────────────┘ │
│ │
│ Logs mounted to: ./logs/nginx/, ./logs/app/, │
│ ./logs/app-vulnerable/ │
└─────────────────────────────────────────────────────────────┘
| Контейнер | Назначение | Порт |
|---|---|---|
nginx | Обратный прокси с правилами WAF, ограничением скорости | 127.0.0.1:8080 |
app | Tomcat 9 + Struts 6.3.x (исправленный, лаборатория защиты) | Только внутренний |
app-vulnerable | Tomcat 9 + Struts 2.3.31 (уязвимый, для эксплуатации) | 127.0.0.1:8081 |
exploit | Контейнер для демонстрации эксплуатации | Н/Д |
simulator | Отправляет тестовые запросы (безвредные + подозрительные шаблоны) | Н/Д |
# Клонирование репозитория
git clone https://github.com/ACharaf06/cybersec.git
cd cybersec
# Сборка всех контейнеров (при первом запуске может занять несколько минут)
docker compose build
# Запуск лаборатории защиты (nginx + исправленное приложение)
docker compose up -d nginx app
# Запуск уязвимого приложения (для демонстрации эксплуатации)
docker compose up -d app-vulnerable
# Проверка, что службы работают
docker compose ps
# Ожидание готовности служб (около 60 секунд)
sleep 60
# Проверка конечных точек здоровья
curl http://127.0.0.1:8080/struts-lab/health # Лаборатория защиты
curl http://127.0.0.1:8081/struts-lab/health # Уязвимое приложение
Ожидаемый результат:
"status":"healthy" и "strutsVersion":"6.3.0.2 (patched - not vulnerable to S2-045)""status":"healthy" и "strutsVersion":"2.3.31 (VULNERABLE to S2-045)"# Запуск контейнера симулятора (тестирует механизмы защиты)
docker-compose run --rm simulator
# Или запуск отдельных тестов вручную:
# Легитимная загрузка
curl -X POST -F "[email protected]" http://127.0.0.1:8080/struts-lab/upload
# Подозрительный Content-Type (будет заблокирован WAF)
curl -v -X POST \
-H "Content-Type: multipart/form-data; boundary=----SUSPICIOUS" \
http://127.0.0.1:8080/struts-lab/upload
# Запуск контейнера эксплойта (демонстрирует эксплуатацию S2-045)
docker-compose --profile exploit run --rm exploit
# Или прямое использование скрипта эксплойта на Python
python3 exploit/exploit.py http://127.0.0.1:8081/struts-lab 'whoami'
# Или использование bash-скрипта
./exploit/demo_exploit.sh
⚠️ Предупреждение: Уязвимое приложение намеренно эксплуатируемо. Запускайте только в изолированных средах.
# Журналы лаборатории защиты
tail -f logs/nginx/access.log # Журналы доступа Nginx
tail -f logs/nginx/error.log # Блокировки WAF
tail -f logs/app/struts-lab.log # Журналы приложения защиты
# Журналы уязвимого приложения
tail -f logs/app-vulnerable/struts-lab.log # Журналы уязвимого приложения
# Все журналы вместе
docker-compose logs -f
Легитимный запрос:
200INFOПодозрительный/некорректный запрос:
403 Forbidden или 400 Bad RequestУспешная эксплуатация:
Примеры журналов:
Блокировка подозрительного Content-Type Nginx (Лаборатория защиты):
[WAF] Blocked suspicious Content-Type pattern - Request ID: abc123
Журналирование метаданных запроса приложением (Лаборатория защиты):
[REQUEST] ID=abc123 Content-Type=multipart/form-data Method=POST URI=/upload
[UPLOAD] Processing file upload for request abc123
Успешная эксплуатация (Уязвимое приложение):
HTTP/1.1 200 OK
...
root
(Command output appears in response body)
| Функция | Уязвимое приложение (Порт 8081) | Лаборатория защиты (Порт 8080) |
|---|---|---|
| Версия Struts | 2.3.31 (уязвимая) | 6.3.0.2 (исправленная) |
| Защита WAF | ❌ Нет | ✅ Правила WAF Nginx |
| Ограничение скорости | ❌ Нет | ✅ 10 запросов/с |
| Лимиты размера запроса | ❌ Нет | ✅ 10 МБ тело, 8 КБ заголовки |
| Журналирование безопасности | ⚠️ Минимальное | ✅ Всестороннее |
| Внедрение OGNL | ✅ Эксплуатируемо | ❌ Заблокировано/Исправлено |
| Возможность RCE | ✅ Да | ❌ Нет |
| Назначение | Демонстрация эксплуатации | Тренировка защиты |
127.0.0.1 (нет внешнего доступа)0.0.0.0S2-045 (CVE-2017-5638) — критическая уязвимость в Apache Struts2 версий 2.3.5 - 2.3.31 и 2.5 - 2.5.10, при которой:
Уязвимое приложение (порт 8081) демонстрирует эту уязвимость. Лаборатория защиты (порт 8080) показывает, как защититься от неё.
.
├── docker-compose.yml # Оркестрация контейнеров
├── README.md # Этот файл
├── EXPLOITATION_GUIDE.md # Подробное руководство по эксплуатации
├── TECHNICAL_DETAILS.md # Технические детали реализации
├── GLOSSARY.md # Глоссарий терминов безопасности
├── nginx/
│ ├── nginx.conf # Основная конфигурация nginx
│ └── waf-rules.conf # Правила WAF для шаблонов S2-045
├── app/ # Лаборатория защиты (исправленная)
│ ├── Dockerfile # Сборка Tomcat + Maven
│ └── struts-app/
│ ├── pom.xml # Проект Maven (Struts 6.3.x)
│ └── src/main/
│ ├── java/ # Классы действий
│ ├── resources/ # Конфигурация Struts + Log4j
│ └── webapp/ # Представления JSP + web.xml
├── app-vulnerable/ # Уязвимое приложение (для эксплуатации)
│ ├── Dockerfile # Сборка Tomcat + Maven
│ └── struts-app/
│ ├── pom.xml # Проект Maven (Struts 2.3.31)
│ └── src/main/
│ ├── java/ # Классы действий
│ ├── resources/ # Конфигурация Struts + Log4j
│ └── webapp/ # Представления JSP + web.xml
├── exploit/ # Инструменты эксплуатации
│ ├── Dockerfile # Контейнер эксплойта
│ ├── demo_exploit.sh # Bash-скрипт эксплойта
│ └── exploit.py # Python-скрипт эксплойта
├── simulator/
│ ├── Dockerfile # Alpine + curl
│ └── simulate.sh # Тестовый скрипт
└── logs/ # Подключённая директория журналов
├── nginx/
├── app/ # Журналы лаборатории защиты
└── app-vulnerable/ # Журналы уязвимого приложения
# Остановка всех контейнеров
docker compose down
# Удаление томов и журналов
docker compose down -v
rm -rf logs/
# Полная очистка (включая образы)
docker compose down --rmi all -v
Проект организован следующим образом:
app/ - Приложение лаборатории защиты (Struts 6.3.x, исправленное)app-vulnerable/ - Уязвимое приложение (Struts 2.3.31)exploit/ - Инструменты и скрипты эксплуатацииnginx/ - Конфигурация обратного прокси Nginx с правилами WAFsimulator/ - Симулятор шаблонов атакlogs/ - Журналы приложений (игнорируется git)# Пересборка только уязвимого приложения
docker compose build app-vulnerable
docker compose up -d app-vulnerable
# Пересборка только приложения защиты
docker compose build app
docker compose up -d app
# Пересборка контейнера эксплойта
docker compose build exploit
Отказ от ответственности: Эта лаборатория предназначена только для образовательных целей. Используйте ответственно и только в контролируемых средах.