
Apache Struts2 S2-045(CVE-2017-5638) 악용 및 방어를 시연하는 Docker 기반 보안 랩으로, 실습 교육을 위해 WAF 보호 기능이 있는 취약한 애플리케이션과 패치된 애플리케이션을 제공합니다.
Apache Struts2 S2-045 취약점(CVE-2017-5638)에 대한 공격과 방어를 모두 시연하는 Docker 기반 보안 실습 랩입니다. 이 랩에는 다음이 포함됩니다:
⚠️ 보안 경고: 이 랩에는 실제 작동하는 익스플로잇과 취약한 코드가 포함되어 있습니다. 격리된 환경에서만 사용하세요. 공용 네트워크에 노출하지 마십시오.
┌─────────────────────────────────────────────────────────────┐
│ 호스트 (127.0.0.1만) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 시뮬레이터 │───▶│ Nginx 프록시 │ │
│ │ (curl 기반) │ │ + WAF 규칙 │ │
│ └─────────────────┘ └────────┬────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ │ │
│ ┌───────▼──────┐ ┌───────▼──────┐ │
│ │ 방어 앱 │ │ 취약 앱 │ │
│ │ (Struts 6.3) │ │ (2.3.31) │ │
│ │ 포트: 8080 │ │ 포트: 8081 │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ 익스플로잇 │───▶ 취약 앱 (8081) │
│ │ 컨테이너 │ │
│ └─────────────────┘ │
│ │
│ 로그는 다음에 마운트됨: ./logs/nginx/, ./logs/app/, │
│ ./logs/app-vulnerable/ │
└─────────────────────────────────────────────────────────────┘
# 저장소 복제
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
정상 요청:
200 응답INFO 수준 업로드 처리 메시지의심스러운/비정상 요청:
403 Forbidden 또는 400 Bad Request성공적인 공격:
로그 예시:
Nginx가 의심스러운 Content-Type 차단 (방어 랩):
[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
(명령 출력이 응답 본문에 표시됨)
127.0.0.1에만 바인딩 (외부 접근 불가)S2-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 # S2-045 패턴에 대한 WAF 규칙
├── 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/ - WAF 규칙이 있는 Nginx 리버스 프록시 설정simulator/ - 공격 패턴 시뮬레이터logs/ - 애플리케이션 로그 (gitignore 처리됨)# 취약 앱만 다시 빌드
docker compose build app-vulnerable
docker compose up -d app-vulnerable
# 방어 앱만 다시 빌드
docker compose build app
docker compose up -d app
# 익스플로잇 컨테이너 다시 빌드
docker compose build exploit
면책 조항: 이 랩은 교육 목적으로만 제공됩니다. 책임감 있게 사용하고 통제된 환경에서만 사용하십시오.
| 컨테이너 | 목적 | 포트 |
|---|
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 | 테스트 요청 전송 (정상 + 의심스러운 패턴) | 해당 없음 |
| 기능 | 취약 앱 (포트 8081) | 방어 랩 (포트 8080) |
|---|
| Struts 버전 | 2.3.31 (취약) | 6.3.0.2 (패치됨) |
| WAF 보호 | ❌ 없음 | ✅ Nginx WAF 규칙 |
| 속도 제한 | ❌ 없음 | ✅ 10 req/s |
| 요청 크기 제한 | ❌ 없음 | ✅ 본문 10MB, 헤더 8KB |
| 보안 로깅 | ⚠️ 최소 | ✅ 포괄적 |
| OGNL 주입 | ✅ 공격 가능 | ❌ 차단/패치됨 |
| RCE 가능 | ✅ 예 | ❌ 아니오 |
| 사용 사례 | 공격 시연 | 방어 훈련 |