
PaperCut CVE-2026-81578 및 CVE-2026-82078용 보안 연구 도구
PaperCut NG/MF 취약점 평가 및 승인된 익스플로잇을 위한 전문 보안 연구 도구
╔══════════════════════════════════════════════════════════════════╗
║ PAPERCUT SECURITY TOOL – POWER MODE ║
║ CVE-2026-81578 · CVE-2026-82078 · v3.1.0 ║
║ ⚡ powered by yora 1928 ⚡ ║
╚══════════════════════════════════════════════════════════════════╝
이 도구는 PaperCut NG/MF 서버에 대한 안전하고 비파괴적인 취약점 평가와 (명시적 승인을 통한) 선택적 원격 익스플로잇을 제공합니다.
두 가지 주요 PaperCut 취약점의 존재 여부를 검증해야 하는 보안 연구원, 침투 테스터, 블루팀 방어자를 위해 설계되었습니다.
| CVE ID | 설명 | CVSS | CWE |
|---|---|---|---|
| CVE-2026-81578 | Apache Tapestry "complex direct" 요청을 통한 인증 우회 | 8.8 (HIGH) | CWE-306 |
| CVE-2026-82078 | 데이터베이스 연결 유틸리티의 안전하지 않은 동적 클래스 로딩 | 9.4 (CRITICAL) | CWE-470 |
주요 참고 자료:
이 도구는 지표 기반 원격 탐지를 수행합니다. --force를 명시적 서면 승인과 함께 사용하지 않는 한 실제 PaperCut 서버에서의 익스플로잇 가능성을 입증한다고 주장하지 않습니다.
| 상태 | 의미 |
|---|---|
SAFE | 버전이 패치되었거나 탐지된 지표가 없음 |
AFFECTED_VERSION | 버전이 영향 범위와 일치함 (공급업체 권고) |
TAPESTRY_DETECTED | Apache Tapestry 프레임워크 탐지됨 (PaperCut에서 사용) |
ADMIN_ENDPOINT_ACCESSIBLE | 인증 없이 관리 엔드포인트에 접근 가능 |
DB_CONFIG_ACCESSIBLE | 데이터베이스 구성 엔드포인트에 접근 가능 |
POTENTIALLY_VULNERABLE | 지표 조합이 잠재적 취약점을 시사하지만, 익스플로잇 가능성은 검증되지 않음 |
NOT_DETECTABLE | 평가하기에 정보가 불충분함 |
신뢰도 점수는 증거의 가중치를 기반으로 계산되며, 과장된 주장을 피하기 위해 원격 탐지의 경우 85%로 상한이 설정됩니다.
--force 플래그 사용 시 (승인 필요)--input, --threads)--prefilter)| 기능 | 실제 대상 | 로컬 랩 |
|---|---|---|
| 핑거프린팅 | ✅ 안전 (읽기 전용) | ✅ 안전 |
| CVE 평가 | ✅ 안전 (지표 기반) | ✅ 안전 |
| 개념 시연 | ❌ 차단됨 (localhost 전용) | ✅ 허용 |
| 원격 익스플로잇 | ⚠️ --force 및 승인 필요 | ✅ 허용 |
| 구성 변경 | ❌ 절대 안 함 | ✅ 랩 내에서만 |
| RCE / 페이로드 실행 | ❌ 절대 안 함 | ❌ 구현되지 않음 (시뮬레이션 전용) |
# 저장소 클론
git clone https://github.com/yourusername/papercut-cve-tool.git
cd papercut-cve-tool
# 가상 환경 생성
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS
# 또는
.venv\Scripts\activate # Windows
# 종속성 설치
pip install -r requirements.txt
# 설치 확인
python papercut.py self-test
# 도움말 표시
python papercut.py --help
# 대상에 대한 전체 스캔 실행
python papercut.py scan http://127.0.0.1:8080
# 핑거프린팅만 수행
python papercut.py fingerprint http://127.0.0.1:8080
# 특정 CVE 확인
python papercut.py check http://127.0.0.1:8080 --cve 81578
# 교육용 로컬 랩 시작
python papercut.py lab
# 개념 시연 실행 (랩 전용)
python papercut.py exploit --cve 81578
# 원격 익스플로잇 (승인 필요)
python papercut.py exploit --cve 81578 --target https://target.com:9192 --force
# 사전 필터 및 스레딩을 사용한 배치 스캔
python papercut.py scan --input targets.txt --prefilter --threads 10 --timeout 5
# IOC 분석을 위한 로그 파일 분석
python papercut.py detect server.log
# HTML 보고서 생성
python papercut.py report result.json --format html
# 대화형 모드
python papercut.py interactive
| 명령어 | 설명 |
|---|---|
scan TARGET | 핑거프린팅 + CVE 검사를 포함한 전체 취약점 스캔 |
fingerprint TARGET | PaperCut 버전, Tapestry 프레임워크, 노출된 엔드포인트 탐지 |
check TARGET --cve {81578,82078} | 특정 CVE 지표 검사 실행 |
lab [--port PORT] [--test] | 교육용 로컬 랩 시작 (선택적 자가 테스트 포함) |
exploit --cve {81578,82078} [--target] [--force] | 개념 시연 또는 원격 익스플로잇 실행 (승인된 경우) |
detect LOGFILE [--output] | 의심스러운 지표에 대한 로그 파일 분석 |
report INPUT [--format {html,json,text}] [--output] | JSON 결과에서 전문 보고서 생성 |
interactive | 대화형 메뉴 실행 |
self-test | 내부 진단 실행 |
| 옵션 | 설명 |
|---|---|
--timeout N | 요청 시간 초과(초) (기본값: 10) |
--verbose | 상세 디버그 출력 표시 |
--quiet | 필수 외 출력 억제 |
--output FILE | 결과를 파일로 저장 |
--format {text,json,html} | 스캔/보고서 출력 형식 |
| 옵션 | 설명 |
|---|---|
--input FILE | 배치 스캔을 위한 대상 파일 (줄당 하나) |
--output-dir DIR | 배치 결과 저장 디렉터리 |
--threads N | 동시 스레드 수 (배치 모드) |
--prefilter | 스캔 전에 열린 포트 확인 (배치 전용) |
랩은 두 취약점의 개념을 교육 목적으로 재현하는 최소한의 Python HTTP 서버입니다.
Error.page, Exception.page)를 표시하면서 관리 구성 요소(ConfigEditor, UserList)를 호출# 랩 시작
python papercut.py lab
# 자동화된 랩 테스트 실행
python papercut.py lab --test
랩 엔드포인트:
http://127.0.0.1:8080/lab/cve-81578?component=ConfigEditor&display=Errorhttp://127.0.0.1:8080/lab/cve-82078?driver=org.attacker.RCEPayload이 도구는 취약점 메커니즘에서 파생된 의심스러운 지표(IOC)에 대해 로그 파일을 분석합니다:
| 지표 | 심각도 | 설명 |
|---|---|---|
tapestry_complex_direct | CRITICAL | Tapestry .page.*.zone 요청 패턴 |
admin_component_access | HIGH | ConfigEditor / UserList 페이지 접근 |
public_page_tapestry | HIGH | Tapestry가 포함된 Error / Exception 페이지 |
tapestry_post_request | CRITICAL | Tapestry .page에 대한 POST 요청 |
db_driver_config | CRITICAL | 데이터베이스 드라이버 구성 변경 |
class_loading_error | HIGH | ClassNotFoundException / NoClassDefFoundError |
dynamic_class_loading | CRITICAL | 외부 소스에서 클래스 로딩 |
python papercut.py detect /var/log/papercut/server.log --output detection.json
HTML, JSON 또는 일반 텍스트 형식의 전문 보고서를 생성합니다.
# 먼저 스캔 결과를 JSON으로 저장
python papercut.py scan http://127.0.0.1:8080 --format json --output result.json
# HTML 보고서 생성
python papercut.py report result.json --format html --output report.html
# JSON 보고서 생성
python papercut.py report result.json --format json --output report.json
# 텍스트 보고서 생성
python papercut.py report result.json --format text --output report.txt
HTML 보고서 포함 내용:
PaperCut 보안 공지(2026년 8월 27일) 기준:
| 버전 범위 | 상태 |
|---|---|
| 24.x < 24.1.10 | ❌ 영향 있음 |
| 24.1.10+ | ✅ 패치됨 |
| 25.x < 25.0.13 | ❌ 영향 있음 |
| 25.0.13+ | ✅ 패치됨 |
| 26.x < 26.0.5 | ❌ 영향 있음 |
| 26.0.5+ | ✅ 패치됨 |
| 23.x 이하 | ⚠️ 지원 종료 – 업그레이드 권장 |
PaperCut은 Apache Tapestry 프레임워크를 사용합니다. Tapestry의 "complex direct" 요청 형식은 다음을 모두 지정할 수 있습니다:
Error.page)ConfigEditor.page)접근 검증은 실행 중인 구성 요소가 아닌 표시된 페이지만 확인합니다. 공격자는 공개 페이지를 표시하면서 관리 구성 요소를 호출하여 인증을 완전히 우회할 수 있습니다.
공격 벡터: Error.page를 통해 표시되는 .zone 요청이 포함된 POST /papercut/ConfigEditor.page?...
PaperCut은 구성 가능한 드라이버 이름(예: database.driver.class)에서 JDBC 데이터베이스 드라이버 클래스를 인스턴스화합니다. 애플리케이션은 이러한 클래스 이름을 허용 목록에 대해 검증하지 않습니다. (인증 우회 또는 기타 수단을 통해) 시스템 구성을 조작할 수 있는 공격자는 임의의 Java 클래스 이름을 지정할 수 있으며, 이는 PaperCut 서비스 프로세스에 의해 로드되고 인스턴스화됩니다.
영향: PaperCut 서비스의 보안 컨텍스트에서 원격 코드 실행(RCE).
기여를 환영합니다! 지침은 CONTRIBUTING.md를 읽어주세요.
MIT 라이선스 – 자세한 내용은 LICENSE를 참조하세요.
이 도구는 승인된 보안 테스트 및 교육 목적으로만 사용됩니다. 명시적 서면 허가 없이 어떤 시스템에도 사용하지 마십시오. 개념 시연은 localhost로 제한되며 원격 호스트에서는 작동하지 않습니다.
이 도구를 사용함으로써 다음 사항에 동의합니다:
버전: 3.1.0
최종 업데이트: 2026-08-29
관리자: yora 1928
"보안은 제품이 아니라 프로세스입니다." – Bruce Schneier
---
## 🚀 GitHub에서의 다음 단계
1. **열기** `https://github.com/yora1928/PaperCut-CVE-2026-81578-82078`
2. **클릭** `README.md`
3. **클릭** 연필 아이콘 (편집)
4. **삭제** 모든 기존 내용
5. **붙여넣기** 위의 전체 텍스트
6. **클릭** `Commit changes...`
7. **작성** 커밋 메시지: `Update README.md with final version`
8. **클릭** `Commit changes`
---
## 🎉 **완료! 프로젝트가 전문적이며 포트폴리오에 적합합니다!** ⚡