## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ACHARAF06-CVE-2017-5638-ATTACK-AND-DEFENSE
# Apache Struts2 S2-045 防御与利用实验环境
基于 Docker 的安全实验环境,演示 Apache Struts2 S2-045 漏洞(CVE-2017-5638)的**利用** 与**防御** 。该实验环境包含:
1. **脆弱应用** :Struts 2.3.31(存在 S2-045 漏洞)用于利用演示
2. **防御实验环境** :Struts 6.3.x(已修补)配合 WAF 防护,用于防御训练
> ⚠️ **安全警告** :本实验环境包含**可工作的漏洞利用程序** 和**脆弱代码** 。请仅在隔离环境中使用。切勿暴露到公共网络。
## 架构概览
root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│ 主机(仅限 127.0.0.1) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 模拟器 │───▶│ Nginx 代理 │ │
│ │ (基于 curl) │ │ + WAF 规则 │ │
│ └─────────────────┘ └────────┬────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ │ │
│ ┌───────▼──────┐ ┌───────▼──────┐ │
│ │ 防御应用 │ │ 脆弱应用 │ │
│ │ (Struts 6.3) │ │ (2.3.31) │ │
│ │ 端口: 8080 │ │ 端口: 8081 │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ 利用容器 │───▶ 脆弱应用 (8081) │
│ └─────────────────┘ │
│ │
│ 日志挂载至:./logs/nginx/, ./logs/app/, │
│ ./logs/app-vulnerable/ │
└─────────────────────────────────────────────────────────────┘
## 组件
## 快速开始
### 前提条件
* **Docker** (版本 20.10 或更高)
* **Docker Compose** (版本 2.0 或更高)
* **Python 3** (可选,用于直接运行利用脚本)
* **curl** (可选,用于手动测试)
### 安装
#### 1\. 克隆仓库
root@kitploit:~
# 克隆仓库
git clone https://github.com/ACharaf06/cybersec.git
cd cybersec
#### 2\. 构建并运行
root@kitploit:~
# 构建所有容器(首次运行可能需要几分钟)
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 # 脆弱应用
**预期输出:**
* 防御实验环境:JSON 响应中包含 `"status":"healthy"` 和 `"strutsVersion":"6.3.0.2 (已修补 - 不受 S2-045 影响)"`
* 脆弱应用:JSON 响应中包含 `"status":"healthy"` 和 `"strutsVersion":"2.3.31 (对 S2-045 存在漏洞)"`
### 2\. 防御实验环境测试
root@kitploit:~
# 运行模拟器容器(测试防御机制)
docker-compose run --rm simulator
# 或者手动运行单个测试:
# 合法上传
curl -X POST -F "some-email@example.com" 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
### 3\. 利用演示
root@kitploit:~
# 运行利用容器(演示 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
**⚠️ 警告** :脆弱应用是故意可被利用的。请仅在隔离环境中运行。
### 4\. 查看日志
root@kitploit:~
# 防御实验环境日志
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
## 观察要点
### 防御实验环境(端口 8080)
**合法请求:**
* Nginx 访问日志:`200` 响应
* 应用日志:`INFO` 级别的上传处理消息
* 请求成功完成
**可疑/畸形请求:**
* Nginx 访问日志:`403 Forbidden` 或 `400 Bad Request`
* Nginx 错误日志:触发 WAF 规则的消息
* 应用日志:若请求到达应用,可能显示解析错误
* 请求被拦截或清理
### 脆弱应用(端口 8081)
**成功利用:**
* HTTP 200 或 500 响应
* 命令输出在响应体中可见
* OGNL 表达式被求值
* 系统命令被执行
**日志示例:**
**Nginx 拦截可疑 Content-Type(防御实验环境):**
root@kitploit:~
[WAF] 拦截可疑的 Content-Type 模式 - 请求 ID: abc123
**应用记录请求元数据(防御实验环境):**
root@kitploit:~
[REQUEST] ID=abc123 Content-Type=multipart/form-data Method=POST URI=/upload
[UPLOAD] 正在处理请求 abc123 的文件上传
**成功利用(脆弱应用):**
root@kitploit:~
HTTP/1.1 200 OK
...
root
(命令输出出现在响应体中)
## 对比:脆弱应用 vs 防御实验环境
## 安全说明
### 隔离
* 所有服务仅绑定到 `127.0.0.1`(无法外部访问)
* 内部 Docker 网络用于容器通信
* 无端口暴露到 0.0.0.0
* **脆弱应用绝不可暴露到公共网络**
### 防御层(防御实验环境)
1. **Nginx WAF 规则** :在到达应用前拦截可疑的 Content-Type 模式
2. **速率限制** :每 IP 10 次请求/秒
3. **请求大小限制** :最大主体 10MB,最大头部 8KB
4. **已修补的 Struts** :使用 Struts 6.3.x(不受 S2-045 影响)
5. **全面日志记录** :所有可疑活动均被记录
### S2-045 是什么
S2-045(CVE-2017-5638)是 Apache Struts2 版本 2.3.5 - 2.3.31 和 2.5 - 2.5.10 中的一个严重漏洞,其中:
* 恶意的 Content-Type 头部可以注入 OGNL 表达式
* Jakarta Multipart 解析器对这些表达式进行了求值
* 导致远程代码执行(RCE)
**脆弱应用(端口 8081)演示了此漏洞。** **防御实验环境(端口 8080)展示了如何防范它。**
## 文件结构
root@kitploit:~
.
├── 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/ # 脆弱应用日志
## 清理
root@kitploit:~
# 停止所有容器
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)
### 构建单个组件
root@kitploit:~
# 仅重新构建脆弱应用
docker compose build app-vulnerable
docker compose up -d app-vulnerable
# 仅重新构建防御应用
docker compose build app
docker compose up -d app
# 重新构建利用容器
docker compose build exploit
## 文档
* **EXPLOITATION_GUIDE.md** :关于 S2-045 漏洞机制和利用过程的详细指南
* **TECHNICAL_DETAILS.md** :实验环境的技术实现细节
* **GLOSSARY.md** :本实验环境中使用的安全术语词汇表
## 教育资源
* Apache Struts 安全公告
* CVE-2017-5638 详细信息
* OWASP 注入防护
* Metasploit S2-045 模块
* * *
## ⚠️ 重要警告
1. **脆弱应用** :端口 8081 上的应用是故意存在漏洞的。切勿暴露到公共网络。
2. **可工作的利用程序** :本实验环境包含可工作的漏洞利用代码。请仅在隔离环境中使用。
3. **教育目的** :本实验环境仅用于安全教育、研究和授权的渗透测试。
4. **法律合规** :仅在你拥有或已获得明确书面授权进行测试的系统上使用。
**免责声明** :本实验环境仅用于教育目的。请负责任地使用,并仅在受控环境中操作。