
Dockerベースのセキュリティラボで、Apache Struts2 S2-045(CVE-2017-5638)の悪用と防御を実演し、脆弱性のあるアプリケーションとパッチ適用済みアプリケーションをWAF保護付きで提供して、実践的なトレーニングを可能にします。
Apache Struts2 S2-045 脆弱性 (CVE-2017-5638) に対する悪用と防御の両方を実演する Docker ベースのセキュリティラボ。このラボには以下が含まれます:
⚠️ セキュリティ警告: このラボには動作するエクスプロイトと脆弱なコードが含まれています。隔離された環境でのみ使用してください。公開ネットワークに公開しないでください。
┌─────────────────────────────────────────────────────────────┐
│ ホスト (127.0.0.1 のみ) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Simulator │───▶│ Nginx Proxy │ │
│ │ (curl-based) │ │ + WAF Rules │ │
│ └─────────────────┘ └────────┬────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ │ │
│ ┌───────▼──────┐ ┌───────▼──────┐ │
│ │ 防御アプリ │ │ 脆弱アプリ │ │
│ │ (Struts 6.3) │ │ (2.3.31) │ │
│ │ ポート: 8080 │ │ ポート: 8081│ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ Exploit │───▶ 脆弱アプリ (8081) │
│ │ コンテナ │ │
│ └─────────────────┘ │
│ │
│ ログのマウント先: ./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 | エクスプロイトデモンストレーションコンテナ | N/A |
simulator | テストリクエスト(良性 + 不審なパターン)の送信 | N/A |
# リポジトリのクローン
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)" を含む JSON 応答"status":"healthy" と "strutsVersion":"2.3.31 (VULNERABLE to S2-045)" を含む JSON 応答# シミュレーターコンテナの実行(防御メカニズムのテスト)
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
(コマンド出力が応答本文に表示)
| 機能 | 脆弱アプリ (ポート 8081) | 防御ラボ (ポート 8080) |
|---|---|---|
| Struts バージョン | 2.3.31 (脆弱) | 6.3.0.2 (パッチ済み) |
| WAF 保護 | ❌ なし | ✅ Nginx WAF ルール |
| レート制限 | ❌ なし | ✅ 10 req/s |
| リクエストサイズ制限 | ❌ なし | ✅ ボディ 10MB、ヘッダー 8KB |
| セキュリティログ | ⚠️ 最小限 | ✅ 包括的 |
| OGNL インジェクション | ✅ 悪用可能 | ❌ ブロック/パッチ済み |
| RCE の可能性 | ✅ あり | ❌ なし |
| 使用目的 | 悪用デモ | 防御訓練 |
127.0.0.1 にのみバインド(外部アクセス不可)S2-045 (CVE-2017-5638) は Apache Struts2 バージョン 2.3.5~2.3.31 および 2.5~2.5.10 における重大な脆弱性であり、以下の特徴がありました:
脆弱アプリ(ポート 8081)はこの脆弱性を実演します。 防御ラボ(ポート 8080)はそれに対する保護方法を示します。