
基于 Docker 的安全实验环境,演示 Apache Struts2 S2-045 漏洞(CVE-2017-5638)的利用与防御。该实验环境包含:
⚠️ 安全警告:本实验环境包含可工作的漏洞利用程序和脆弱代码。请仅在隔离环境中使用。切勿暴露到公共网络。
┌─────────────────────────────────────────────────────────────┐
│ 主机(仅限 127.0.0.1) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 模拟器 │───▶│ Nginx 代理 │ │
│ │ (基于 curl) │ │ + WAF 规则 │ │
│ └─────────────────┘ └────────┬────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ │ │
│ ┌───────▼──────┐ ┌───────▼──────┐ │
│ │ 防御应用 │ │ 脆弱应用 │ │
│ │ (Struts 6.3) │ │ (2.3.31) │ │
│ │ 端口: 8080 │ │ 端口: 8081 │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ 利用容器 │───▶ 脆弱应用 (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 | 利用演示容器 | 不适用 |
simulator | 发送测试请求(良性 + 可疑模式) | 不适用 |
# 克隆仓库
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 (已修补 - 不受 S2-045 影响)""status":"healthy" 和 "strutsVersion":"2.3.31 (对 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] 拦截可疑的 Content-Type 模式 - 请求 ID: abc123
应用记录请求元数据(防御实验环境):
[REQUEST] ID=abc123 Content-Type=multipart/form-data Method=POST URI=/upload
[UPLOAD] 正在处理请求 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)展示了如何防范它。
.
├── 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/ # Action 类
│ ├── resources/ # Struts + Log4j 配置
│ └── webapp/ # JSP 视图 + web.xml
├── app-vulnerable/ # 脆弱应用(用于利用)
│ ├── Dockerfile # Tomcat + Maven 构建
│ └── struts-app/
│ ├── pom.xml # Maven 项目(Struts 2.3.31)
│ └── src/main/
│ ├── java/ # Action 类
│ ├── 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
免责声明:本实验环境仅用于教育目的。请负责任地使用,并仅在受控环境中操作。