
Request-Baskets의 CVE-2023-27163 SSRF를 재현하는 Docker 기반 실습 환경으로, 익스플로잇 검증, 탐지 스크립트, 네트워크 격리 완화 방안을 포함합니다.
프로젝트: 취약점 연구 및 재현 실습실 — CVE-2023-27163
작성자: Amulya Kaushik
역할: 사이버보안 R&D 및 실습 콘텐츠 개발 인턴 후보자
Request-Baskets ≤ 1.2.1의 서버 측 요청 위조(SSRF)
심층 방어 아키텍처를 통해 CVE-2023-27163을 재현, 탐지, 완화하기 위한 자체 완결형 로컬 연구 실습실입니다.
| 항목 | 값 |
|---|---|
| CVE ID | CVE-2023-27163 |
| CWE | CWE-918 — 서버 측 요청 위조(SSRF) |
| 영향받는 제품 | Request-Baskets |
| 영향받는 버전 | ≤ 1.2.1 |
| 수정된 버전 | 1.2.2 (업스트림 소스) / 심층 방어 네트워크 격리 |
| CVSS v3.1 점수 | 6.5 (중간) |
| CVSS 벡터 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 공격 복잡도 | 낮음 — 단일 비인증 API 호출 |
업스트림 한계 및 완화에 관한 참고:
CVE-2023-27163은 임의의 포워드 URL 검증 문제를 다루지만,darklynx/request-baskets의 공개 컨테이너 빌드는 기본적으로 루프백 또는 사설 서브넷 필터링을 적용하지 않습니다. 실제 DevSecOps 모범 사례에 따라, 본 실습실은 심층 방어 컨테이너 네트워크 격리를 통한 완화를 시연합니다. 민감한 내부 백엔드를 내부 전용 Docker 네트워크(internal: true가 설정된secure-internal-net)에 격리함으로써 릴레이 경로가 차단되어, 신뢰할 수 없는 웹훅 포워더를 실행하는 경우에도 SSRF 취약점의 악용 가능성이 완화됩니다.
본 실습실은 두 가지 개별 Docker Compose 토폴로지를 제공합니다:
docker-compose.yml): Request-Baskets와 내부 비밀 에코 서비스가 브리지 네트워크 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을 보고하고 프로브 바스켓을 정리합니다.분할된 완화 토폴로지로 전환:
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
산출물 3의 완전한 시각적 증거 포트폴리오는 evidence/ 디렉터리에 유지됩니다:
| 산출물 | 목적 | 파일 링크 | 설명 |
|---|---|---|---|
| 스크린샷 1 | 환경 실행 중 | 01_lab_running.png | lab-net에서 vulnerable-request-baskets(포트 55556)와 isolated-internal-service가 동시에 실행 중임을 보여줍니다. |
| 스크린샷 2 | SSRF 악용 | 02_reproduction_ssrf.png | 유출된 CONFIDENTIAL_DATA{...} 플래그와 VULNERABLE 상태를 표시합니다. |
| 스크린샷 3 | 방어 탐지 도구 | 03_detection_tool_run.png | 2단계 시그니처 검사와 루프백 감사가 VULNERABLE을 표시함을 보여줍니다. |
| 스크린샷 4 | 완화 검증 | 04_remediation_verified.png | 분할된 네트워크 방어 하에서 릴레이 실패(HTTP 502 / Host Unreachable)를 입증합니다. |
| 스크린샷 5 | 웹 UI 구성 | 05_web_ui_ssrf.png | (보너스) Proxy Response로 구성된 Request-Baskets UI 설정의 브라우저 캡처. |
각 스크린샷에 대한 상세한 워크스루, 명령어, 콘솔 기록은 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
본 연구 및 실습실 개발은 공개 보안 표준, 벤더 권고, 취약점 데이터베이스를 기반으로 합니다: