
Лаборатория на базе Docker, воспроизводящая SSRF CVE-2023-27163 в Request-Baskets, с проверкой эксплуатации, скриптом обнаружения и устранением последствий через сетевую изоляцию.
Проект: Лаборатория исследования и воспроизведения уязвимостей — CVE-2023-27163
Автор: Amulya Kaushik
Роль: Кандидат на стажировку в области кибербезопасности R&D и разработки лабораторного контента
Server-Side Request Forgery в Request-Baskets ≤ 1.2.1
Автономная локальная исследовательская лаборатория для воспроизведения, обнаружения и устранения CVE-2023-27163 с архитектурой эшелонированной защиты.
| Поле | Значение |
|---|
| CVE ID | CVE-2023-27163 |
| CWE | CWE-918 — Server-Side Request Forgery (SSRF) |
| Затронутый продукт | Request-Baskets |
| Затронутые версии | ≤ 1.2.1 |
| Исправленная версия | 1.2.2 (Upstream source) / Defense-in-Depth Network Isolation |
| Оценка CVSS v3.1 | 6.5 (Medium) |
| Вектор CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Сложность атаки | Низкая — один неаутентифицированный вызов API |
Примечание об ограничениях upstream и устранении:
Хотя CVE-2023-27163 отслеживает проверку произвольного forward URL, публичные сборки контейнераdarklynx/request-basketsне применяют фильтрацию loopback или частных подсетей из коробки. Следуя реальным лучшим практикам DevSecOps, наша лаборатория демонстрирует устранение через Defense-in-Depth Container Network Isolation. Изолируя чувствительные внутренние бэкенды в внутренней Docker-сети (secure-internal-netсinternal: true), путь ретрансляции разрывается, что снижает эксплуатируемость уязвимости SSRF даже при запуске недоверенных пересыльщиков вебхуков.
Эта лаборатория предоставляет две отдельные топологии Docker Compose:
docker-compose.yml): Request-Baskets и внутренний сервис эхо-секретов совместно используют bridge-сеть lab-net. Request-Baskets сопоставлен с портом хоста 55556 (сопоставлен с портом контейнера 55555).docker-compose.patched.yml): Request-Baskets подключён исключительно к public-net, тогда как внутренний сервис эхо подключён к secure-internal-net (internal: true).docker-compose.yml)┌─────────────────────────────────────────────────────────┐
│ Docker: lab-net │
│ │
│ ┌─────────────────────┐ ┌────────────────────────┐ │
│ │ request-baskets │───▶│ internal-service │ │
│ │ (v1.2.1) │ │ (http-echo:5678) │ │
│ │ Port 55556 ◀──HOST │ │ NOT exposed to host │ │
│ └─────────────────────┘ └────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
▲
│ HTTP (port 55556)
│
┌────┴─────┐
│ Attacker │
└──────────┘
docker-compose.patched.yml)┌─────────────────────────┐ ┌─────────────────────────┐
│ public-net │ │ secure-internal-net │
│ │ │ (internal: true) │
│ ┌───────────────────┐ │ │ ┌───────────────────┐ │
│ │ request-baskets │ │ ✕ │ │ internal-service │ │
│ │ Port 55556◀─HOST │ │ ──/──▶ │ │ (http-echo:5678) │ │
│ └───────────────────┘ │ │ └───────────────────┘ │
└─────────────────────────┘ └─────────────────────────┘
| Требование | Минимальная версия | Примечания |
|---|---|---|
| Docker Engine | 20.10+ | Среда виртуализации контейнеров |
| Docker Compose | v2.0+ | Оркестрация нескольких контейнеров |
| Python | 3.8+ | Инструменты CLI-проверки и обнаружения |
Настройка виртуального окружения Python и зависимостей:
python3 -m venv .venv
source .venv/bin/activate
pip install requests fpdf2
Запустите уязвимую среду (Request-Baskets v1.2.1 доступен по адресу http://localhost:55556):
docker compose up -d
Убедитесь, что оба контейнера запущены:
docker compose ps
Ожидаемый вывод:
NAME IMAGE COMMAND SERVICE STATUS PORTS
isolated-internal-service hashicorp/http-echo:latest "/http-echo -text=CO…" internal-service Up 5678/tcp
vulnerable-request-baskets darklynx/request-baskets:v1.2.1 "/bin/sh -c /bin/ent…" request-baskets Up 0.0.0.0:55556->55555/tcp
Убедитесь, что внутренний сервис не доступен напрямую с хоста:
curl http://localhost:5678 2>&1 || echo "Connection refused — internal service isolated as expected"
Запустите автоматизированный скрипт проверки SSRF:
python3 scripts/verify_vulnerability.py
Что происходит:
/api/baskets/ssrf-verification-basket, устанавливая forward_url: "http://internal-service:5678" и proxy_response: true.CONFIDENTIAL_DATA{INTERNAL_SSRF_DEMONSTRATION_SUCCESS} и выводит RESULT: VULNERABLE.Запустите недеструктивный аудиторский зонд:
python3 scripts/detect.py
Что происходит:
http://127.0.0.1:80).AUDIT RESULT: VULNERABLE при принятии (HTTP 201) и очищает зонд-корзину.Переключитесь на сегментированную исправленную топологию:
docker compose down
docker compose -f docker-compose.patched.yml up -d
python3 scripts/verify_vulnerability.py
Ожидаемый вывод:
==============================================================
[✓] REMEDIATION VERIFIED: TARGET SECURED
The Request-Baskets instance failed to reach the internal
isolated service (HTTP 502 / Host Unreachable).
Network segmentation successfully prevented SSRF data exfiltration.
==============================================================
Сверните среду по завершении:
docker compose -f docker-compose.patched.yml down
Полный портфель визуальных доказательств для Deliverable 3 поддерживается в каталоге evidence/:
| Артефакт | Назначение | Ссылка на файл | Описание |
|---|---|---|---|
| Скриншот 1 | Среда запущена | 01_lab_running.png | Показывает vulnerable-request-baskets (порт 55556) и isolated-internal-service, работающие одновременно в lab-net. |
| Скриншот 2 | Эксплуатация SSRF | 02_reproduction_ssrf.png | Отображает эксфильтрированный флаг CONFIDENTIAL_DATA{...} и статус VULNERABLE. |
| Скриншот 3 | Инструмент защитного обнаружения | 03_detection_tool_run.png | Отображает двухфазную проверку сигнатур и аудит loopback с пометкой VULNERABLE. |
| Скриншот 4 | Проверка устранения | 04_remediation_verified.png | Доказывает сбой ретрансляции (HTTP 502 / Host Unreachable) при сегментированной сетевой защите. |
| Скриншот 5 | Конфигурация веб-интерфейса | 05_web_ui_ssrf.png | (Бонус) Снимок браузера настроек интерфейса Request-Baskets с включённым Proxy Response. |
Подробные пошаговые руководства, команды и консольные расшифровки для каждого скриншота задокументированы в evidence/README.md.
Чтобы последовательно захватить все скриншоты терминала без ручной настройки, запустите:
./scripts/capture_evidence_flow.sh
Скомпилируйте академический технический отчёт в PDF:
python3 docs/generate_blog_pdf.py
Сгенерированный вывод: docs/CVE-2023-27163-Technical-Blog.pdf
cve-2023-27163-lab/
├── .gitignore # Git artifact exclusions (.venv, cache, OS files)
├── docker-compose.yml # Vulnerable environment (shared lab-net, port 55556)
├── docker-compose.patched.yml # Remediated environment (disjoint network isolation)
├── README.md # Complete documentation, attribution & guide
├── scripts/
│ ├── capture_evidence_flow.sh # Interactive runner for capturing screenshots
│ ├── verify_vulnerability.py # SSRF exploitation & remediation verification CLI
│ └── detect.py # Defensive audit and detection tool
├── evidence/
│ └── README.md # Formal screenshot evidence walkthrough
└── docs/
├── technical_blog.md # Academic technical write-up (800–1,200 words)
├── generate_blog_pdf.py # Markdown → PDF converter
└── CVE-2023-27163-Technical-Blog.pdf # Compiled academic report PDF
Это исследование и разработка лаборатории опираются на открытые стандарты безопасности, рекомендации производителей и базы данных уязвимостей:
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N).Эта лаборатория предназначена только для образовательных целей и авторизованных исследований в области безопасности. Не используйте эти инструменты против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.