
이 저장소는 교육 및 사이버보안 연구 목적으로 개발된 자동화된 익스플로잇으로, Apache Tomcat (CVE-2025-24813)의 잠재적인 원격 코드 실행(RCE) 취약점을 시연하기 위한 것입니다.
이 도구는 미래지향적 익스플로잇 제품군으로 설계되었으며, 다음에 중점을 둡니다:
🧪 사이버보안 전문가, 연구원, 침투 테스터, 레드팀을 위해 설계되었습니다.
✅ 대화형이고 직관적인 인터페이스
✅ 동적 페이로드(ysoserial 또는 컴파일된 Java)
✅ 위장(WAF 우회) 헤더
✅ 자동 우회 + 페이로드 분할
✅ 백엔드 실행 핑거프린팅
✅ 대상별 상세 로깅
✅ 사이버펑크 스타일 동적 배너 (🔮 글리치 애니메이션)
✅ 콘솔 라이브 피드백 (Rich & Colorama 사용)
다음 명령어로 필요한 패키지를 설치하세요:
pip install -r requirements.txt
의존성:
requests
colorama
rich
validators
그리고 다음이 준비되어 있어야 합니다:
PATH에 Java 및 javacysoserial.jar스크립트 실행:
python3 POC-Exploit_CVE_2025_24813.py
그리고 설정을 완료하세요:
🧬 페이로드 유형 선택 💣 실행할 명령어 지정 🌐 대상 URL 입력 🔧 우회 및 SSL 설정 조정
🔗 [?] 대상 URL 입력: https://victima.org
💣 [?] 실행할 명령어: whoami
🧬 [?] 페이로드 유형: ysoserial
📂 [?] ysoserial.jar 경로: ysoserial.jar
🔧 [?] Gadget: CommonsCollections6
🔐 [?] SSL 확인? (예/아니오): 아니오
🚀 실행 중...
🧬 WAF 탐지됨... 전략 변경
⚙️ 페이로드 업로드 중...
💥 원격 실행 확인
✅ 결과: 'apache'
┌──────────────────────────────┐
│ 대화형 모드 │
├──────────────────────────────┤
│ URL 검증 │
│ 세션 감지 │
│ WAF 감지 │
│ 페이로드 생성 │
│ PUT을 통한 우회 업로드 │
│ 실행 확인 │
└──────────────────────────────┘
↘ 대상별 로그
ysoserial 도구 기반, 취약한 가젯을 직렬화하여 명령어를 실행합니다..java를 컴파일하여 서버에서 원격 명령어를 실행합니다.CommonsCollections6Spring1Jdk7u21POC-Exploit_CVE_2025_24813.py # 메인 스크립트
ysoserial.jar # 'ysoserial' 사용 시 필요
logs/ # 대상별 개별 로그 폴더
payload.ser # 임시로 생성된 페이로드
Exploit.java / .class # Java 임시 파일
이 도구는 법적 및 교육 목적으로만 제작되었습니다.
✅ 허용:
🚫 금지:
저자와 기여자는 오용에 대해 책임을 지지 않습니다. 귀하는 귀하의 행동에 책임이 있습니다.
ysoserial, Java, Rich, Colorama, requests📄 CVE-2025-24813: Apache Tomcat 원격 코드 실행 🔗 CVE MITRE에서 세부 정보 보기
MIT License
Copyright (c) 2025
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files...
자세한 내용은
LICENSE파일을 참조하세요.
이 README와 스크립트는 몰입감 있고 시각적이며 우아한 경험을 위해 설계되었으며, 새로운 시대의 미래지향적 사이버보안과 목적에 부합합니다.
✨ 단순한 익스플로잇이 아닙니다... 우회와 디지털 통제의 기술적 교향곡입니다.
권장 버전: Python 3.8+
설치해야 할 Python 라이브러리:
pip install requests colorama
스크립트는 두 가지 페이로드 방식을 사용합니다:
따라서 다음이 필요합니다:
Java JDK (코드를 컴파일해야 하므로 JRE만으로는 부족) 다음 명령어로 확인하세요:
java -version
javac -version
두 명령어 모두 작동하면 준비된 것입니다.
.jar 다운로드 👉 https://github.com/frohoff/ysoserial
스크립트와 같은 디렉토리에 저장하거나 요청 시 전체 경로를 입력하세요. 예시:
java -jar ysoserial.jar CommonsCollections6 "calc.exe" > test.ser
calc.exe)는 계산기를 엽니다.gnome-calculator 또는 xcalc 등으로 변경할 수 있습니다.Python 3.8+ 설치
라이브러리 설치:
pip install requests colorama etc
Java JDK 8+ 설치
java -version
javac -version
스크립트 폴더에 ysoserial.jar 다운로드
👉 이 모든 준비가 완료되면 안전한 실습 모드(통제된 환경에서만 테스트)로 스크립트를 실행할 수 있습니다.
버전: 1.0 목적: 이 가이드는 실제 시스템에 영향을 주지 않고 스크립트를 테스트할 수 있는 완전히 안전한 환경을 준비하는 방법을 설명합니다. 테스트 서버(모의), 안전 모드(DRY_RUN / SAFE_TEST), 랩에서 도구를 실행하기 위한 명확한 단계를 포함합니다.
pip 사용 가능virtualenv 또는 venv의존성 설치:
python3 -m venv .venv
source .venv/bin/activate # Linux / macOS
.\.venv\Scripts\activate # Windows (PowerShell/Command Prompt)
pip install -U pip
pip install requests colorama flask
참고:
flask는 로컬 모의 서버(mock)에서만 사용됩니다.
mock_server.py 파일을 만들고 다음 내용을 입력하세요. 이 서버는 스크립트가 예상하는 엔드포인트를 시뮬레이션하고 제어된 상태(200, 409, 500)를 반환하여 실제 서버를 건드리지 않고 스크립트 로직을 검증할 수 있게 합니다.
# mock_server.py — 안전한 테스트 서버
from flask import Flask, request, make_response, jsonify
app = Flask(__name__)
uploads = {}
@app.route('/index.jsp', methods=['GET'])
def index():
# JSESSIONID 쿠키 또는 "Session ID" 텍스트를 반환할 수 있는 페이지 시뮬레이션
resp = make_response('Index page — Session ID: testsession')
resp.set_cookie('JSESSIONID', 'testsession')
return resp
@app.route('/check.txt', methods=['PUT'])
def check_put():
# 쓰기 가능한 리소스 시뮬레이션
return ('OK', 200)
@app.route('/uploads/../sessions/<session_id>.session', methods=['PUT'])
def upload_session(session_id):
# 업로드가 수락되었지만 409 반환 (스크립트가 예상하는 동작)
uploads[session_id] = True
return ('Conflict - uploaded', 409)
@app.route('/', methods=['GET'])
def root():
# 쿠키가 일치하고 세션이 "업로드"되었다면 역직렬화 실패를 시뮬레이션하기 위해 500 반환
session = request.cookies.get('JSESSIONID')
if session and uploads.get(session):
return ('Internal Server Error', 500)
return ('Hello from mock server', 200)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8000, debug=True)
실행 방법:
python mock_server.py
# 모의 서버는 http://127.0.0.1:8000 에서 수신 대기합니다.
테스트를 위해 실제 페이로드를 생성할 필요는 없습니다. 스크립트가 업로드할 수 있는 간단한 파일을 만드세요:
echo "DUMMY_PAYLOAD" > payload.ser
이 파일은 실행 가능한 코드를 포함하지 않습니다: 업로드 로직을 검증하고 모의 서버의 응답을 확인하는 용도로만 사용됩니다.
스크립트가 외부 유틸리티(Java/ysoserial)를 호출하거나 위험한 작업을 실행하지 않도록 하려면, 메인 스크립트 시작 부분(모든 생성/subprocess 호출 전)에 다음 블록을 추가하세요:
import os
SAFE_TEST = os.environ.get('SAFE_TEST', '0') == '1'
그런 다음 생성/업로드 함수를 수정(또는 래핑)하여 SAFE_TEST가 True일 때 안전하게 동작하도록 합니다.
generate_ysoserial_payload 및 generate_java_payload에 대한 최소한의 변경 예시:
def generate_ysoserial_payload(command, ysoserial_path, gadget, payload_file, target_url):
if SAFE_TEST:
log_info("SAFE_TEST 활성화 — 더미 페이로드 생성 (실행 불가)", target_url)
with open(payload_file, 'wb') as f:
f.write(b"DUMMY_PAYLOAD")
return payload_file
# --- SAFE_TEST == False인 경우에만 원래 동작 ---
def generate_java_payload(command, payload_file, target_url):
if SAFE_TEST:
log_info("SAFE_TEST 활성화 — 더미 Java 페이로드 생성 (실행 불가)", target_url)
with open(payload_file, 'wb') as f:
f.write(b"DUMMY_JAVA_PAYLOAD")
return payload_file
# --- SAFE_TEST == False인 경우에만 원래 동작 ---
그리고 upload_and_verify_payload에서 SAFE_TEST가 True이면 일반 흐름을 사용(모의 서버가 수락함)하지만 스크립트 외부에서 명령어를 실행하지 마세요.
SAFE_TEST 활성화 방법:
Linux/macOS:
export SAFE_TEST=1
Windows (PowerShell):
$env:SAFE_TEST = "1"
가상 환경을 시작하고 의존성이 설치되었는지 확인하세요 (요구사항 섹션 참조).
mock_server.py 실행:
python mock_server.py
SAFE_TEST를 사용하지 않거나 SAFE_TEST가 페이로드를 자동으로 생성하지 않는 경우 더미 페이로드 생성:
echo "DUMMY_PAYLOAD" > payload.ser
터미널에서 안전 모드 활성화:
export SAFE_TEST=1 # Linux/macOS
# 또는 PowerShell: $env:SAFE_TEST = "1"
메인 스크립트 실행:
python3 tu_script.py
프롬프트에 응답 (실험실 값을 사용):
http://127.0.0.1:8000ysoserial (SAFE_TEST=1이면 외부 도구 대신 더미 페이로드 생성)ysoserial.jar 그대로 가능 — 안전 모드에서는 사용되지 않음)아니오 (모의 서버는 HTTP 사용)콘솔 출력 확인: Server is writable via PUT, Payload uploaded with status 409, Exploit succeeded! Server returned 500 after deserialization.와 같은 메시지가 표시되어야 합니다. — 모의 서버에서만 발생하며, 스크립트의 로직 흐름이 작동함을 의미합니다.
logs/ 폴더의 로그를 확인하세요. 스크립트는 타임스탬프가 포함된 항목을 저장합니다. 예: logs/127_0_0_1_8000.log (대상 이름에 따라 다름).
check_writable_servlet 함수가 /check.txt 엔드포인트로 PUT 성공을 감지하는지payload.ser를 업로드할 때 모의 서버가 409를 반환하고 스크립트가 JSESSIONID 쿠키로 GET 요청을 보내는지pytest 및 requests-mock을 사용하여 HTTP 응답을 시뮬레이션하세요.
다음에 대한 테스트를 만드세요:
validate_url — 유효/무효 입력retry_request — 예외 및 재시도 시뮬레이션detect_waf — 서버 헤더 시그니처 유/무 시뮬레이션upload_and_verify_payload — 모의 서버를 사용하여 흐름 검증requests-mock을 사용한 간단한 예시 (틀):
# test_script.py
import requests
import requests_mock
from tu_script import validate_url, retry_request
def test_validate_url():
assert validate_url('http://127.0.0.1:8000')
assert not validate_url('notaurl')
def test_retry_request_success():
# requests_mock을 사용하여 GET을 시뮬레이션하고 retry_request 테스트
pass
저자:ByMakavali