Sploitus

Exploit for CVE-2017-5638-Attack-and-Defense

kitploit · 2026-08-25

Exploit Code

MARKDOWN369 lines
## 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. **法律合规** :仅在你拥有或已获得明确书面授权进行测试的系统上使用。



**免责声明** :本实验环境仅用于教育目的。请负责任地使用,并仅在受控环境中操作。