
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/ │
└─────────────────────────────────────────────────────────────┘
# リポジトリのクローン
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
(コマンド出力が応答本文に表示)
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 | エクスプロイトデモンストレーションコンテナ | N/A |
simulator | テストリクエスト(良性 + 不審なパターン)の送信 | N/A |
| 機能 | 脆弱アプリ (ポート 8081) | 防御ラボ (ポート 8080) |
|---|
| Struts バージョン | 2.3.31 (脆弱) | 6.3.0.2 (パッチ済み) |
| WAF 保護 | ❌ なし | ✅ Nginx WAF ルール |
| レート制限 | ❌ なし | ✅ 10 req/s |
| リクエストサイズ制限 | ❌ なし | ✅ ボディ 10MB、ヘッダー 8KB |
| セキュリティログ | ⚠️ 最小限 | ✅ 包括的 |
| OGNL インジェクション | ✅ 悪用可能 | ❌ ブロック/パッチ済み |
| RCE の可能性 | ✅ あり | ❌ なし |
| 使用目的 | 悪用デモ | 防御訓練 |