
Joomla JCE의 profile-import 업로드를 통해 CVE-2026-48907을 익스플로잇하고, 셸 경로를 검증하며, 권한이 부여된 대상에서 대화형 명령 채널을 여는 Python CLI.
E.L.V CVE 연구 및 평가 프레임워크는 통제된 보안 연구 및 승인된 취약점 평가를 위해 설계된 Python 기반 명령줄 유틸리티입니다.
제공된 구현에는 다음과 같은 기능이 포함되어 있습니다:
현재 소스는 연구 대상을 다음과 같이 식별합니다:
CVE-2026-48907 Joomla! JCE Extension < 2.9.99.5 Unauthenticated RCE
해당 CVE/제품 주장은 소스 코드에서 제공된 메타데이터이며 이 README에서 독립적으로 검증되지 않았습니다. 보안 주장을 게시하기 전에 식별자, 영향을 받는 버전, 권고, 영향을 받는 구성 요소 및 해결 정보를 신뢰할 수 있는 벤더/CVE 출처와 대조하여 검증하십시오.
이 프로젝트는 원격 웹 애플리케이션과 상호 작용하며, 제공된 구현에는 사용자 지정 서버 측 페이로드를 업로드하고 업로드된 셸과 통신하기 위한 기능이 포함되어 있습니다.
명시적 승인을 받은 시스템에만 사용하십시오.
다음 목적으로 이 프로젝트를 사용하지 마십시오:
안전한 실험실 환경을 위해서는 격리된 로컬 VM/컨테이너 환경 또는 의도적으로 취약하게 구성된 훈련 대상을 사용하십시오.
| 필드 | 값 |
|---|---|
| 프로젝트 | E.L.V CVE 연구 및 평가 프레임워크 |
| 작성자 / 엔진 | HxN / E.L.V |
| 버전 | 1.0.0 |
| 언어 | Python |
| 플랫폼 | *nix / Unix 계열 시스템 |
| 라이선스 | GNU GPL v3 |
| 인터페이스 | 명령줄 |
| HTTP 클라이언트 | requests |
| 동시성 | ThreadPoolExecutor |
| 주요 목적 | 승인된 보안 연구 및 평가 |
제공된 elv-cve.py 소스에는 다음과 같은 주요 구성 요소가 포함되어 있습니다.
스크립트는 --shell 옵션을 통해 제공된 로컬 파일을 읽습니다.
소스는 이를 사용자 지정 셸/업로더 파일로 설명하며, 지정된 파일을 읽을 수 없으면 종료합니다.
프로그램은 상호 배타적인 두 가지 대상 모드를 지원합니다:
각 대상에 대해 스크립트는 대상 루트에 GET 요청을 수행하고 계속 진행하기 전에 HTTP 200 응답을 기대합니다.
구현은 정규식을 사용하여 반환된 HTML에서 CSRF 관련 값을 검색합니다.
현재 두 가지 패턴이 구현되어 있습니다.
스크립트는 다음에 대해 멀티파트 업로드 요청을 구성합니다:```text /index.php?option=com_jce
요청에는 profile-import 작업과 추출된 토큰이 포함됩니다.
### 6. 후보 경로 검증
업로드 요청 후, 프로그램은 결과 파일에 대해 여러 가능한 위치를 확인합니다.
현재 소스에는 다음과 같은 후보 경로가 포함되어 있습니다:```text
/tmp/
/images/
/images/stories/
/media/
단일 대상의 경우, 현재 프로그램은 성공적으로 업로드된 셸 경로를 보고할 때 대화형 명령 인터페이스를 호출합니다.
소스는 다음 이름의 POST 매개변수를 사용하여 명령을 전송합니다:```text cmd c
이 기능은 원격 명령 실행을 초래할 수 있으므로, 격리된 명시적 승인 환경으로 제한해야 합니다.
### 8. 다중 대상 처리
대상 파일이 제공되면, 프로그램은 `ThreadPoolExecutor`를 사용하여 대상을 동시에 처리합니다.
소스의 기본 스레드 수는 다음과 같습니다:```text
10
높은 수준에서, 현재 구현은 다음 흐름을 따릅니다:```text Start │ ├── Parse command-line arguments │ ├── Load local payload file │ ├── Load one target OR target list │ ├── Create ELV_CVE output directory │ ├── Target processing │ │ │ ├── GET target │ ├── Check HTTP response │ ├── Extract token │ ├── Submit profile-import request │ ├── Check candidate file paths │ └── Record result │ └── Write results / display summary
---
## 요구 사항
제공된 소스는 다음을 가져옵니다:
- Python 표준 라이브러리 모듈:
- `random`
- `re`
- `time`
- `argparse`
- `sys`
- `os`
- `json`
- `threading`
- `concurrent.futures`
- 서드파티 모듈:
- `requests`
- `urllib3`
따라서 최소한의 의존성 설치는 다음과 같습니다:```bash
python3 -m pip install requests urllib3
재현 가능한 배포를 위해서는 requirements.txt 파일에 의존성을 고정하세요.
예시:```text requests urllib3
---
## 설치
프로젝트를 격리된 평가 환경에 복제하거나 복사하세요.
예시:```bash
git clone <YOUR-REPOSITORY-URL>
cd <YOUR-REPOSITORY-DIRECTORY>
가상 환경을 생성합니다:```bash python3 -m venv .venv
활성화하세요:```bash
source .venv/bin/activate
종속성 설치:```bash python3 -m pip install -r requirements.txt
Python 확인:```bash
python3 --version
의존성을 확인합니다:```bash python3 -c "import requests, urllib3; print('Dependencies OK')"
> `<YOUR-REPOSITORY-URL>` 및 `<YOUR-REPOSITORY-DIRECTORY>`를 저장소에서 사용하는 값으로 바꾸세요.
---
## 명령줄 인터페이스
소스는 다음과 같은 명령줄 옵션을 정의합니다.
### 대상 선택```text
-u, --url
단일 대상 URL.```text -f, --file
대상 URL이 포함된 파일의 경로입니다.
이 옵션들은 상호 배타적이며 그중 하나는 필수입니다.
### 페이로드 선택```text
--shell
로컬 사용자 정의 페이로드 파일의 경로입니다.
이 인수는 현재 구현에서 필수입니다.
-t, --threads
작업자 스레드 수.
기본값:```text
10
-v, --verbose
인수 파서가 노출하는 verbose 플래그를 활성화합니다.
참고: 현재 소스는 이 옵션을 정의하지만 `args.verbose`를 사용하여 출력 동작을 실질적으로 변경하지는 않습니다.
### 출력 옵션```text
-o, --output
인수는 파서에 의해 정의되지만, 현재 구현에서는 최종 결과를 작성할 때 args.output을 사용하지 않습니다. 현재 결과 경로는 다음과 같이 하드코딩되어 있습니다:```text
ELV_CVE/success.txt
This is an implementation detail worth fixing in a future release.
---
## Input Files
### Target list
The target-list mode expects one URL per line.
Blank lines are ignored.
Lines beginning with `#` are ignored.
Conceptual format:```text
https://authorized-target-01.example
https://authorized-target-02.example
# laboratory target
https://authorized-target-03.example
명시적으로 평가 권한을 부여받은 대상만 파일에 넣어야 합니다.
--shell 인수는 프로그램이 텍스트로 읽는 로컬 파일을 가리킵니다.
제공된 소스는 파일을 성공적으로 읽는 것 외에는 파일 내용을 검증하지 않습니다.
안전한 개발과 테스트를 위해서는 명령을 실행하는 페이로드 대신 무해한 테스트 픽스처를 사용하십시오.
프로그램은 다음을 생성합니다:```text ELV_CVE/
다중 대상 모드의 경우, 다음과 같이 기록합니다:```text
ELV_CVE/success.txt
현재 소스는 성공한 셸 URL을 이 파일에 기록합니다.
예시 결과 형식:```text https://authorized-lab.example/path/to/result
프로그램은 또한 로드된 대상 수에 대한 성공적인 결과의 수를 포함하는 완료 요약을 출력합니다.
---
## 동시성
다중 대상 모드는 다음을 사용합니다:```python
ThreadPoolExecutor
설정된 스레드 수는 기본값이 10입니다.
동시성이 높아지면 다음과 같은 문제가 증가할 수 있습니다:
통제된 평가에서는 낮은 동시성 값으로 시작하고, 환경과 권한이 허용할 때만 값을 높이십시오.
제공된 구현은 HTTP 통신을 위해 requests.Session()을 사용합니다.
주요 네트워크 작업은 다음과 같습니다:
소스는 명시적인 요청 타임아웃을 사용합니다:
이 값들은 현재 소스에 하드코딩되어 있습니다.
구현은 다음을 설정합니다:```python s.verify = False
`InsecureRequestWarning`을 억제합니다.
이는 인증서 검증이 비활성화되었음을 의미합니다.
자체 서명 인증서를 사용하는 일회성 랩 환경에서는 유용할 수 있지만, **일반적인 프로덕션 보안 도구에서는 권장되지 않습니다**.
더 안전한 구현은 인증서 검증을 구성 가능하게 만들고 기본적으로 검증을 활성화된 상태로 유지해야 합니다.
---
## 로깅 및 결과
소스는 워커 스레드 간의 출력 충돌을 줄이기 위해 `safe_print()` 주위에 스레드 잠금을 사용합니다.
일반적인 상태 범주는 다음과 같습니다:```text
failed
success
결과 객체는 다음과 같은 필드도 포함할 수 있습니다:```text url status reason shell_url
멀티 타깃 수집기는 추가로 다음을 확인합니다:```text
uploaded_hidden
다만, 제공된 exploit() 구현은 현재 해당 상태를 반환하지 않습니다.
이는 향후 버전에서 결과 모델을 정리할 수 있는 영역을 나타냅니다.
현재 구현은 여러 실패 사례를 처리합니다:
실패한 HTTP 요청은 예외 메시지와 함께 실패한 대상으로 기록됩니다.
초기 GET이 HTTP 200을 반환하지 않으면 해당 대상에 대한 처리가 중단됩니다.
예상된 토큰을 추출할 수 없으면 대상은 실패한 취약점 검사로 보고됩니다.
업로드 요청 중 예외가 포착되고 스크립트는 다음 확장자/경로 시도로 계속 진행됩니다.
로컬 페이로드 파일이 존재하지 않으면 프로그램은 오류와 함께 종료됩니다.
대화형 채널은 KeyboardInterrupt를 처리하고 세션을 종료합니다.
제공된 소스의 주요 함수는 다음과 같습니다:
safe_print(msg)스레드 안전 콘솔 출력 도우미.
read_custom_shell(filepath)디코딩 오류를 무시하고 로컬 페이로드 파일을 UTF-8 텍스트로 읽습니다.
interactive_shell(shell_url)보고된 성공적인 셸 경로 이후 대화형 HTTP 명령 인터페이스를 제공합니다.
exploit(url, shell_content, interactive=False)대상 처리 워크플로를 수행하고 결과 딕셔너리를 반환합니다.
main()다음을 처리합니다:
이 프로젝트는 사용 전에 이해해야 할 여러 보안에 민감한 특성을 가지고 있습니다.
대화형 모드는 원격 HTTP 엔드포인트로 명령을 전송할 수 있습니다. 이는 수동 스캐너보다 훨씬 더 민감하게 만듭니다.
운영 페이로드를 무심코 노출하거나 배포하지 마십시오.
현재 구현에서는 TLS 인증서 검증이 비활성화되어 있습니다.
프로젝트를 성숙한 보안 도구로 취급하기 전에 이를 수정해야 합니다.
페이로드는 로컬 파일에서 직접 로드되어 HTTP 요청의 일부로 제출됩니다.
페이로드 파일을 실행 가능한 보안 테스트 자료로 취급하십시오.
현재 소스는 강력한 권한 부여 또는 허용 목록 메커니즘을 구현하지 않습니다.
더 안전한 내부 버전은 명시적 대상 허용 목록을 지원해야 합니다.
현재 구현은 포괄적인 속도 제한기를 제공하지 않습니다.
따라서 동시 요청을 신중하게 제어해야 합니다.
결과 파일에는 성공적인 익스플로잇 시도와 관련된 URL이 포함될 수 있습니다. 이러한 파일을 민감한 평가 데이터로 보호하십시오.
전문적인 평가 워크플로는 다음과 같아야 합니다:```text Authorization ↓ Define Scope ↓ Prepare Isolated Test Environment ↓ Confirm Target Ownership / Permission ↓ Perform Minimal Verification ↓ Collect Evidence ↓ Stop Exploitation Once Proof Is Established ↓ Remediate ↓ Retest ↓ Document Findings
취약점 평가의 목표는 **최소한의 필요한 영향**으로 위험을 확립하는 것이어야 하며, 무제한 접근 권한을 얻는 것이 아니다.
---
## 권장 랩 설정
개발을 위해 다음을 포함하는 전용 환경을 구성한다:
- 격리된 Linux VM;
- 로컬 웹 서버;
- 테스트 Joomla 설치;
- 관련 JCE 컴포넌트/버전;
- 네트워크 격리;
- 스냅샷/백업;
- 테스트 계정;
- 애플리케이션 및 웹 서버 로그.
관련 없는 프로덕션 시스템에 대해 테스트하는 것을 피한다.
---
## 문제 해결
### `ModuleNotFoundError: No module named 'requests'`
Python 의존성을 설치한다:```bash
python3 -m pip install requests urllib3
제공된 경로가 존재하고 읽을 수 있는지 확인하십시오:```bash ls -l
### 초기 HTTP 요청 실패
확인:
- URL 정확성;
- DNS;
- 네트워크 연결성;
- HTTP/HTTPS 가용성;
- 방화벽 규칙;
- 대상 범위;
- 서버 로그.
### CSRF 토큰이 감지되지 않음
대상 응답이 현재 구현의 정규 표현식이 기대하는 HTML 구조와 다를 수 있습니다.
토큰이 없다고 해서 대상이 안전하거나 취약하다고 가정하지 마십시오. 이를 불확정한 결과로 취급하십시오.
### 결과 파일이 비어 있음
확인:```text
ELV_CVE/success.txt
콘솔 출력에서 실패한 HTTP 요청, 토큰 추출 실패 또는 업로드 거부 여부를 확인하십시오.
제공된 구현에는 몇 가지 제한 사항이 있습니다.
--verbose 플래그는 정의되어 있지만 현재 상세 로깅을 제어하지 않습니다.--output 인수는 정의되어 있지만 현재 결과 파일 선택에 사용되지 않습니다.json과 sleep은 임포트되었지만 표시된 구현에서 실질적으로 사용되지 않습니다.uploaded_hidden을 참조하지만, 표시된 exploit() 함수는 해당 상태를 반환하지 않습니다.프로덕션 품질 릴리스를 태깅하기 전에 다음을 추가하는 것을 고려하십시오:
하드코딩된 값을 구성 계층으로 이동하십시오:
주로 print()에 의존하는 대신 Python의 logging 모듈을 사용하십시오.
권장 수준:```text DEBUG INFO WARNING ERROR
### 결과 스키마
일관된 결과 객체를 정의합니다. 예를 들어:```text
target
status
reason
http_status
evidence
timestamp
취약점 검증을 명령 실행과 분리합니다.
더 안전한 아키텍처는 다음과 같습니다:```text Detection → Verification → Evidence
기본적으로 대화형 명령 실행이 비활성화된 상태입니다.
### 대상 허용 목록
네트워크 작업을 수행하기 전에 명시적인 범위 파일이나 허용 목록을 요구합니다.
### 의존성 고정
테스트된 의존성 버전이 포함된 `requirements.txt` 또는 잠금 파일을 사용합니다.
### 테스트
다음에 대한 단위 테스트를 추가합니다:
- URL 정규화;
- 토큰 파싱;
- 대상 목록 파싱;
- 결과 직렬화;
- 오류 처리;
- 후보 경로 처리.
---
## 권장 저장소 레이아웃
깔끔한 저장소는 다음을 사용할 수 있습니다:```text
.
├── README.md
├── LICENSE
├── requirements.txt
├── elv-cve.py
├── tests/
│ ├── test_parser.py
│ ├── test_results.py
│ └── test_token_parser.py
├── docs/
│ └── methodology.md
└── examples/
└── targets.example.txt
실제 대상 목록, 자격 증명, 셸 페이로드, 세션 데이터 또는 민감한 평가 결과를 커밋하지 마십시오.
권장 .gitignore 항목:```gitignore
pycache/
*.py[cod]
.venv/
venv/
.env
ELV_CVE/
*.log
*.tmp
.DS_Store
민감한 평가 아티팩트는 공개 저장소 외부에 남아 있어야 합니다.
---
## 버전 관리
현재 프로젝트는 다음과 같이 자신을 식별합니다:```text
v1.0.0
향후 릴리스에는 시맨틱 버전 관리를 권장합니다:```text MAJOR.MINOR.PATCH
예시:```text
1.0.0
1.1.0
1.1.1
2.0.0
CLI, 결과 형식 또는 아키텍처에 호환성을 깨는 변경을 할 때는 메이저 버전을 증가시키세요.
향후 잠재적 마일스톤:
유용한 보안 보고서는 다음을 문서화해야 합니다:```text Title Affected Asset Affected Component Version Severity CVE / Advisory Description Preconditions Evidence Business Impact Remediation Retest Result Timeline
공개 보고서에 자격 증명, 개인 정보, 관련 없는 데이터 또는 불필요한 명령 출력을 포함하지 마십시오.
---
## 교정 지침
영향을 받은 Joomla/JCE 배포의 경우, 교정은 이 스크립트에 내장된 CVE 메타데이터에만 의존하기보다는 **공식 벤더/보안 권고 및 확인된 영향 버전 범위**를 기반으로 해야 합니다.
일반적인 방어 조치는 다음과 같습니다:
1. 설치된 Joomla 및 JCE 버전을 식별합니다.
2. 배포가 확인된 영향 범위에 속하는지 판단합니다.
3. 사용 가능한 경우 벤더가 지원하는 수정 릴리스로 업그레이드합니다.
4. 의심스러운 업로드/가져오기 활동에 대해 웹 서버 및 애플리케이션 로그를 검토합니다.
5. 웹에서 접근 가능한 디렉터리에서 예상치 못한 파일을 점검합니다.
6. 침해가 의심되는 경우 자격 증명을 교체합니다.
7. 지속성 메커니즘과 예약된 작업을 검토합니다.
8. 교정 후 재테스트합니다.
9. 조직의 사고 대응 프로세스에 따라 관련 증거를 보존합니다.
---
## 귀속
프로젝트 브랜딩 및 소스 메타데이터는 엔진을 다음과 같이 식별합니다:
**HxN / E.L.V**
프로젝트 버전:
**1.0.0**
---
## 라이선스
이 프로젝트는 다음에 따라 배포될 예정입니다:
**GNU General Public License v3.0**
전체 라이선스 텍스트는 동봉된 `LICENSE` 파일을 참조하십시오.
저장소에 아직 `LICENSE` 파일이 없는 경우, 저장소를 GPL 라이선스로 게시하기 전에 공식 GNU GPL v3 텍스트를 추가하십시오.
---
## 면책 조항
이 소프트웨어는 승인된 보안 연구, 방어적 보안 테스트, 교육 및 통제된 실험실 사용을 위해 제공됩니다.
저자와 기여자는 이 소프트웨어의 사용으로 인해 발생하는 오용, 무단 접근, 손해, 데이터 손실, 서비스 중단 또는 기타 결과에 대해 책임지지 않습니다.
귀하의 테스트 활동이 적용 가능한 법률, 계약, 정책 및 명시적 승인 요건을 준수하도록 보장할 책임은 전적으로 귀하에게 있습니다.
**귀하가 소유한 시스템 또는 테스트에 대한 명시적 허가를 받은 시스템만 테스트하십시오.**
---
## 최종 참고 사항
이 README는 제공된 `elv-cve.py` 소스에서 노출되는 동작을 문서화합니다. 이는 구현 세부 사항과 독립적인 취약점/권고 검증이 필요한 주장을 의도적으로 구분합니다.
공개 저장소의 경우, 프로젝트를 특정 제품/버전에 대한 확인된 익스플로잇으로 설명하기 전에 CVE 정보를 검증하고 권위 있는 벤더/권고 참조를 추가하십시오.